Acessar JSession por fora de um site Joomla!

Bom dia a todos,

O framework CMS Joomla! possui um recurso de sessions muito bacana que é a JSession, para utilizá-la você precisa de uma instância válida da classe factory JFactory. O Joomla! inicia automaticamente esta factory ao iniciar a execução de uma requisição dentro da sua aplicação, mas externamente não.
Para podermos utilizar os recursos do Joomla! através de um diretório externo ao CMS precisamos importar e inicializar as configurações básicas. O código abaixo mostra os includes e a definição das variáveis estáticas necessárias.

A variável _JEXEC é uma variável estática de segurança para evitar que alguem tente acessar algum arquivo diretamente.

Para a variável JPATH_BASE é a referência para o diretório do seu site Joomla! e a variável DS é carregada com o valor da variável estática global do PHP que define o tipo de separador de diretórios, ou seja, no linux utiliza-se “/” e no windows “”.

Para inicializar a aplicação Joomla! precisamos instanciar as classes corretas, para isso temos a codificação abaixo:

Quando este método é chamado todos os métodos (recursos) da classe JFactory ficam disponíveis, como por exemplo:

  • Sessions;
  • DBO;
  • Mailer;
  • Config (referência da configuração do JConfig);
  • Cache handler;

Logo para acessarmos alguns dos recursos podemos fazer assim:

Através dos métodos definidos na JFactory do Joomla! podemos utilizar todos os recursos que a aplicação Joomla! tem, assim podemos reaproveitar o código da estrutura do CMS em outros projetos.

Utilizando a JSession do Joomla!

O controle de sessões do CMS Joomla! é muito seguro e prático, logo porque o próprio CMS possui camadas de gerenciamento do tempo de sessão e validações. Para criarmos uma sessão registrada pelo CMS Joomla! utilizamos o seguinte código.

Espero que tenham gostado, para dúvidas ou sugestões utilizem a área de comentários abaixo.

Um forte abraço e uma feliz páscoa a todos.

Blog PHP
  • Oi Carlos!

    Primeiramente parabéns pela explicação, cheguei até aqui pois estou a procura de como fazer para exibir alguns relatórios no Joomla, gostaria de saber se pode me ajudar?

    Para exibir estou fazendo páginas do tipo “exibe.php”. Conecto a base usando as seguintes variáveis

    $usuario = “root”;
    $senha = “root”;
    $banco_de_dados = “bd”;

    mysql_connect(“localhost”,$usuario,$senha) or die(“Erro ao conectar no banco de dados”);
    mysql_select_db($bd) or die(“Erro ao selecionar o banco de dados”);

    Em fim minha pergunta é:

    Como faço para exibir um relatório fazendo um select no usuário logado e as tabelas ligadas a ele ?

    Vi que a Jsession pode fazer isto, só não sei como chama-la destes meus arquivos externos definidos por mim como “exibe.php”

    Obrigado! e Parabéns pela página.

    Eric

    • Bom dia Eric,

      Senão me engano o Joomla bloqueia o acesso à session gerada dentro do site, mas se você estiver ainda dentro do Joomla!, você pode desenvolver com um componente para gerar estes relatórios…

      Caso for por fora do Joomla! acho que não tem muito jeito, caso o usuário esteja logado no Joomla!, você pode pegar ele através do método getUser da JFactory, assim:
      [sourcecode language=”php”]
      $usuario =& JFactory:getUser();
      [/sourcecode]
      Caso o usuário esteja logado irá retornar os dados dele, caso contrário retorna um objeto ‘guest’, ou seja, do cara que não está logado. Para verificar isso você pode fazer assim:
      [sourcecode language=”php”]
      if($usuario->guest)
      {
      //…faz alguma coisa quando não está logado..
      }
      else
      {
      //…alguma coisa quando está logado.
      }
      [/sourcecode]
      Quanto as SQLs, você deve adionar manualmente os parâmetros de filtros do usuário nelas, o Joomla! não faz automaticamente isso :/, seria assim +-
      [sourcecode language=”php”]
      $user =& JFactory::getUser();
      $query = "SELECT * FROM #__articles a WHERE a.userid = ‘$user->id’ ";

      $dbo =& JFactory::getDBO();
      $dbo->setQuery($query);

      $result = $dbo->loadObjetList();

      // for…..
      [/sourcecode]
      Não sei se expliquei bem, mas é bem tranquilo de entender, recomendo essas leituras:

      Session do Joomla – como usar
      http://docs.joomla.org/JFactory/getUser

      os métodos da classe DBO:
      http://api.joomla.org/Joomla-Framework/Database/JDatabase.html

  • Carlos!

    Muito obrigado pela ajuda, vou estudar o que me disse e tentar fazer, depois posto o resultado se deu certo ou não, obrigado pela atenção!

    Sucesso!

  • nilton

    essa funcao($mainframe = JFactory::getApplication(‘site’);

    ), me retorna o seguinte erro fatal:

    Allowed memory size of 268435456 bytes exhausted (tried to allocate 64 bytes)

    • carlosspohr

      Buenas nilton,

      Faz um bom tempo que postei este código, e na épica era no auge da versão 1.5.[8-12] mais ou menos…mas acho que se for uma versão diferente desta não vai ter mudado muita coisa…

      Este erro é referente a um estouro de memória no PHP para alguma operação…você pode ver como configurar isso através da documentação de referência aqui http://php.net/manual/en/ini.core.php

      Mas o fato de isto estar acontecendo, sujere que o Joomla possa estar fazendo algum procedimento (lógicas, validações, etc.) no momento da invocação do método getApplication(‘site’), tecnicamente teria que ver se o próprio site que tem esse Joomla está executando normalmente.

      Mas comece verificando a quantidade de memória habilitada no seu servidor PHP, tipo, elimine possibilidades. Outra coisa também seria usar inline a alocação de memória…tem uma referência legal aqui:

      http://www.hostucan.com/webmaster-tutorials/increase-php-memory-limit