A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Tutoriais e Programação

Manhas do JFactory e jimport

Sab

19

Abr

2008


11:32

(3 votos, média 5.00 de 5) 


Joomla Quando comecei a fazer meus módulos e componentes para o Joomla 1.5.x encontrei alguma dificuldade em lidar com a extensão de classes. É que me faltava o conhecimento básico de como utilizar a função jimport ou de como usar instâncias de classes que o JFactory nos oferece de bandeja. É claro que, quem não tem a base, vai bater cabeça e perder um tempão :blush:

Se este também é o seu caso, então este pequeno tutorial talvez ajude.

O que é jimport?

O framework do Joomla fica em /libraries/joomla/. Lá podemos encontrar todas as classes com um caminhão de métodos (funções) responsáveis pelo funcionamento deste gerenciador de conteúdo. Antes de escrever qualquer função nova, é bom dar uma espiada no framework para ver se já não existe a função que precisamos (pronta ou faltando muito pouco para atender nossas necessidades) - é a lei do mínimo esforço e uma grande oportunidade para ir descobrindo os segredos do Joomla.

A princípio, procurar o que se precisa parece uma tarefa impossível, mas não é bem assim. Os arquivos que compõem o framework do Joomla estão muito bem arrumadinhos, guardados em diretórios que indicam sua função. Com o tempo, você vai encontrar o que procura de bate-pronto.

Porque esta agora de ficar garimpando classes e métodos existentes? Porque podemos usar as classes para substituir métodos existentes ou adicionar novos e fazer com que dancem de acordo com a nossa música. Para obter uma classe "domesticada" (tecnicamente chamada de classe estendida) é preciso carregá-la. Ao invés de encher o código com uma porção de require_once ou include_once, podemos usar a função jimport.

A função jimport( ) usa a sintaxe com pontos: para carregar /libraries/joomla/utilities/utility.php você escreve jimport('joomla.utilities.utility'); Depois desta chamada, a classe JUtility estará disponível no seu código, prontinha para ser acionada.

jimport( 'joomla.utilities.utility' ); echo JUtility::dump( $minhaVariavel ); // joga na tela o valor de $minhaVariavel

O mesmo vale para arquivos que estão em diretórios mais profundamente aninhados, por exemplo, /libraries/joomla/application/component/view.php:

jimport('joomla.application.component.view'); class MeucomponenteViewItems extends JView { ... }

info Com o PHP5, ao invés de carregar o arquivo imediatamente, o nome do arquivo e o nome da classe são apenas registrados e o carregamento da classe só ocorre quando a primeira de uma de suas funções for chamada. No exemplo dado acima, a coisa fica assim:

jimport( 'joomla.utilities.utility' ); // neste ponto, utility.php ainda não foi carregado ... echo JUtility::dump( $minhaVariavel ); // aqui o arquivo é carregado

(pode parecer que é muita firula, mas este processo faz muita diferença numa porção de situações... principalmente quando incluímos algumas classes que depois não são usadas e esquecemos de tirar as respectivas linhas de código smile ).

Qual é o mecanismo do jimport? Bem, a função pega a última parte do caminho que indicamos ('joomla.utilities.utility'), adiciona um prefixo 'J' e registra 'JUtility' como o nome da classe para utility.php. Depois disto, quando usamos JUtility::dump ou MinhaClasse extends JUtility, ou class_exists('JUtility'), o arquivo utility.php é carregado.

O problema

Se você quiser derivar a classe JSessionStorageDatabase, localizada em /libraries/joomla/session/storage/database.php, esta história de sintaxe com pontos não vai dar certo. De acordo com a regra teríamos que usar jimport('joomla.session.storage.database'), o que faz com que o jimport registre a classe JDatabase... que não existe. Usar esta classe vai resultar em erro porque o arquivo que a contém não será carregado. Na verdade, nós não precisamos nos preocupar em carregar classes como a JSessionStorageDatabase no nosso código. O Joomla possui fábricas (factories) para isto.

O JFactory

Você não precisa se preocupar em instanciar certos objetos. Os mais específicos são manipulados pelo JFactory e uma porção de métodos getInstance. Por exemplo, JFactory::getDBO( ) pode prover um objeto JDatabaseMySQL, JDatabaseMySQLi ou até mesmo um JDatabasePostgresSQL. Já JFactory::getSession( ) fornece um objeto JSession. Este objeto contém um objeto JSessionStorage, que pode ser JSessionStorageDatabase (aquele que estávamos procurando), JSessionStorageApc ou outros. O X da questão é: você não precisa se preocupar com isto porque JFactory (e JSession::getInstance( ), JDatabse::getInstance( ), etc) cuidam de tudo.

As únicas classes que precisam de jimport são as com nomes simples como JNome, não classes como JNomeCompridoComplicado.

atencao Importante: antes de usar o jimport, confira o que o JFatory oferece:

  • getApplication( $id = null, $config = array() )
  • getConfig( $file = null, $type = 'PHP' )
  • getSession( $options = array() )
  • getLanguage( )
  • getDocument( )
  • getUser( $id = null )
  • getCache( $group = '', $handler = 'callback', $storage = null )
  • getACL( )
  • getTemplate( )
  • getDBO( )
  • getMailer( )
  • getXMLParser( $type = 'DOM', $options = array() )
  • getEditor( $editor = null )
  • getURI( $uri = 'SERVER' )

Mato sem cachorro

Se o que você precisa é de uma classe que não tenha um nome simples ou uma classe cujo nome não seja o mesmo do arquivo e que, além disto, não esteja contemplada no JFactory, então não tem outra saída a não ser fazer um require ou include. Por exemplo, a classe JHTMLGrid está no arquivo /libraries/joomla/html/html/grid.php. A esta altura do campeonato você já sabe que a classe registrada pelo jimport será JGrid, ou seja, o jimport não poderá ser utilizado. Para nosso azar, o JFactory também não oferece suporte a esta classe. Neste caso, não nos resta outra alternativa a não ser usar a chamada clássica:

$queroClasse = JPATH_SITE.DS.'joomla'.DS.'html'.DS.'html'.DS.'grid.php'; require_once( $queroClasse ); class novoJHTMLGrid extends JHTMLGrid { ... }

Finalmentes

Encontrei a maior parte destas explicações no blog do Mathias Verraes. Coloquei mais alguma coisinha que aprendi fazendo meus componentes e módulos. Espero que este tutorial ajude a esclarecer alguns pontos ainda meio obscuros porque a versão 1.5.x do Joomla é relativamente nova e tem pouca coisa espalhada pela net.

Abraços da vó vovo

broker mfxкисть для хайлайтера ценалобановский депутатсоздание системыобзоры китайских topodinполигон ооо

Informações adicionais