ti-enxame.com

Os eventos onUserLogin e onUserAfterLogin parecem não disparar

Estou tentando escrever um plug-in simples que é executado depois que o usuário faz logon no sistema. Eu escrevi plug-ins de conteúdo e autenticação antes sem problemas. Nesse caso, reduzi o plugin ao seguinte e ainda não vejo nenhuma evidência de que ele seja executado.

<?php 
  defined('_JEXEC') or die; 
  class Plgtest extends JPlugin {   
    public function onUserLogin($user, $options = array()) {
      JFactory::getApplication()->enqueueMessage('I Ran!.', 'message');   
    } 
  } 
 ?>

Eu tentei os eventos onUserLogin e onUserAfterLogin e nunca vejo o plug-in sendo executado. Meu arquivo xml é o seguinte:

<?xml version="1.0" encoding="utf-8"?>
<extension type="plugin" version="3.0" method="upgrade" group="user">
    <name>User - test</name>
    <creationDate>2014-07-19</creationDate>
    <version>1.0</version>
    <releaseDate>2014-07-19</releaseDate>
    <releaseType>First release!</releaseType>
    <author>me</author>
    <authorEmail>[email protected]</authorEmail>
    <authorUrl>www.me.com</authorUrl>
    <copyright>(c) 2014 me</copyright>
    <description>test</description>
    <files>
    <filename plugin="test">test.php</filename>
    </files>
    <config>            
        <fields name="params">
            <fieldset name="general_settings" label="Connection Settings">
                <field name="Host" type="text" default="127.0.0.1" label="Host" description="Database Host." />
                <field name="database" type="text" default="" label="Database" description="Database name." />
                <field name="prefix" type="text" default="" label="Prefix" description="Database prefix, may be blank." />
                <field name="user" type="text" default="" label="User" description="User name." />
                <field name="password" type="password" default="" label="Password" description="User password." />
            </fieldset>
        </fields>
    </config>
</extension>

Qualquer ajuda ou código de exemplo de um plug-in funcional seria apreciada. Nunca tive esses problemas antes, espero que seja o que estiver faltando, é dolorosamente óbvio.

Além disso, as configurações de conexão são irrelevantes neste exemplo. O plugin real se conecta a um banco de dados externo.

2
Andy

Você não mencionou uma versão do Joomla, então estou assumindo o 3.x, embora isso deva ser praticamente o mesmo para o 2.5.x.

Como mencionado, o nome da classe do seu plug-in está incorreto, o nome da classe é derivado do nome e do tipo do plug-in, e as convenções e estrutura de nomes de arquivos/pastas para o plug-in ajudam o Joomla a encontrar e carregar os arquivos php certos.

Se o seu plug-in estiver em /plugins/user/ E sua pasta for test, o arquivo principal for test.php (Com um arquivo test.xml), Sua classe será chamada PlgUserTest.

JPluginHelper basicamente carrega uma categoria de plugins (authentication, captcha, content, ... user etc) na função ::importPlugin() com base no tipo, por exemplo user. Primeiro, ele obtém os plugins publicados do banco de dados (para que seu plugin precise ser registrado no Joomla, isso acontece no processo de instalação ou você pode usar a opção "Discover" no Extension Manager).

O método importPlugin() então percorre os plugins publicados correspondentes ao $type Que foi solicitado a carregar, a cada partida import() é o principal dos plugins php arquivo, construindo o $path para ele assim:

$path = JPATH_PLUGINS . '/' . $plugin->type . '/' . $plugin->name . '/' . $plugin->name . '.php';

A partir disso, você pode ver o caminho para o seu arquivo:

/plugins/users/test/test.php

Depois de obter o arquivo, ele carrega a classe criando o $className A partir dos atributos que já possui usando esta linha:

$className = 'Plg' . $plugin->type . $plugin->name;

A partir disso, você pode ver que o nome da sua classe deve ser PlgUserTest

6
Craig

Eu acho que se você fizer o seu plugin parte do grupo user, precisará alterar o nome da classe para:

PlgUserTest
0
Valentin Despa