Bloix

WebJoomlaApi

Ultimamente tenho passado boa parte do meu tempo desenvolvendo uma aplicação chamada WebJoomlaAPI. Uma API que visa padronizar, centralizar e facilitar a utilização de recursos do Joomla! de forma legível e reutilizável. Essa API foi construida utilizando Fluent Interface e outros conceitos do DDD(Domain Driven Design).

Em uma determinada área da sua aplicação você necessita apresentar “as últimas noticias da categoria (Desenvolvimento) que foram criados pelo usuário Joomila” para conseguir realizar essa tarefa você precisa conhecer um conjunto de regras de como funciona o conteúdo, usuário, a relação entre conteúdo e usuário, como fazer uma consulta, etc.

Uma forma de realizar essa tarefa é com esse seguinte trecho de código:

//pegando o Objeto Database

$db = JFactory::getDBO();

$query = "SELECT "
." c.*, "
." u.name, "
."FROM "
." #__content as c"
." left join #__categories as cat ON(c.catid = cat.id)"
." left join #__users as u ON(c.created_by = u.id)"
." WHERE "
." cat.title = 'Desenvovimento' AND"
." u.username = 'Joomila'";

$db->setQuery( $query );
$rows = $db->loadObjecList();

foreach( $rows as $row )
{
echo 'Titulo: '.$row->title;
}

Não é muito difícil entender como funciona este código… mas ele poderia ser bem melhor.

A WebJoomlaAPI é acessada através de uma interface que é semânticamente organizada e foi pensada para ser legível e fluente!

Veja o mesmo código acima utilizando essa nova API.

jimport('webjoomlaapi.factory');
$webJoomlaApi = new WebJoomlaApi();
$content = $webJoomlaApi->grammar('content');
$content->lists()
->lastet()
->published()
->fromCategory()
->withName('Desenvolvimento')
->andContent()
->fromUser()
->withName('Joomila');

$rows = $content->getRows();

foreach( $rows as $row )
{
echo 'Titulo: '.$row->title;
}

Bem interessantem não?

Um ponto interessante é que nesse código você está chamando uma série de métodos encadeados(Method Chaining) apenas configurando o que você precisa.

O grande problema desse tipo de API é que  quanto mais fácil fica para o usuário, ocasionalmente mais dificil e complexo fica sua implementação. Porem o resultado final para esse tipo de aplicação facilita muito a visão, manutenção, e desenvolvimento de problemas rotineiros do nosso dia-a-dia.

Veja alguns outros recursos dessa API:

$wja = new WebJoomlaApi();

//Utilizando o menu
$menu = $wja->grammar('menu');

$rows = $menu->lists()
->published()
->withMenuType('mainmenu')
->inOrder()
->getRows();

//Utilização de conteudo
$content = $wja->grammar('content');
$rows = $content->lists()
->fromCategory()
->withId(1)
->andContent()
->lastet()
->getRows();

$rows = $content->lists()
->fromCategory()
->withId(1)
->andContent()
->fromUser()
->withEmail('julio@noix.com.br')
->andContent()
->lastet()
->getRows();

//Utilização para banners
$banner = $wja->grammar('banner');
$rows = $banner->lists()
->published()
->fromClient()
->withName('Open Source Matters')
->andBanner()
->fromCategory()
->withId(1)
->andBanner()
->withClickMoreThan(10)
->getRows();

//Utilização para usuarios
$usuario = $wja->grammar('user');
$rows = $usuario->lists()
->withEmail('julio@noix.com.br')
->getRows();

$rows = $wja->grammar('user')->lists()
->fromUserGroup()
->withName('Super Administrator')
->andUser()
->withEmail('julio@noix.com.br')
->getRows();

//Utilização em Categorias
$category = $wja->grammar('category');
$rows = $category->lists()
->fromExtension('com_weblinks')
->published()
->getRows();

//use in weblinks
$weblinks = $wja->grammar('weblink');
$rows = $weblinks->lists()
->published()
->fromCategory()
->withName('Joomla! Specific Links')
->andWeblink()
->approved()
->inOrder()
->getRows();

Como ficaria para pegar a quantidade total utilizando essa API?

$content->lists()->lastet()
->fromCategory()
->withId(1)
->andContent()
->fromUser()
->withEmail('julio@noix.com.br')
->andContent()
->inOrder();

$rows = $content->getRows();
$total = $content->count()->getResult();

O que acontece é que como você já configura todos os valores quando utiliza o método count() ele já aproveita toda sua configuração, bastando somente chamar o getResult() que retorna o resultado.

E por que não aplicar a mesma idéia que utilizamos para resolver problemas como o simples envio de um e-mail?

$email = $wja->service('email');
$email->from('fulano@email.com')
->to('beltrano@email.com')
->subject('Assunto')
->body('Teste de envio')
->send();

Claro, poderíamos acresentar mais recursos como dizer o template de e-mail. Tudo isso fica transparente para o usuário se está utilizando SMTP, phpmail ou alguma outra forma.

Link para o projeto: WebJoomlaApi

Espero que tenham gostado desse meu primeiro post, até breve.

Compartilhe em outras redes:
  • Envie este post via e-mail
  • Twitter
  • Facebook
  • Digg
  • Google Bookmarks
  • MySpace
  • del.icio.us
  • FriendFeed
  • Imprima este post
  1. Muito boa essa dica! parabéns pelo tutorial!! começarei agora a estudar essa API…

Deixar um comentário.