web-dev-qa-db-fra.com

Comment arrêter (ou "désarmer") un événement Joomla, par exemple onUserLogin

Utiliser J3.7.2 avec MySQL 5.7.14 et PHP 5.6.25. J'ai construit un plugin utilisateur Joomla (appelons-le "My_Plugin") qui fait tout ce que le plugin utilisateur par défaut de Joomla "User-Joomla", avec quelques extras. Le site fonctionne parfaitement lorsque le plug-in User-Joomla n'est pas publié et que My_Plugin est publié, SAUF ... lorsque vous essayez d'ajouter un nouvel utilisateur enregistré à partir du panneau de l'utilisateur principal. Joomla puis jette un avis (non fatal) "essayant d'obtenir une propriété de non-objet ...". La raison en est que com_users/models/user.php tente de récupérer $ pluginParams dans la fonction getForm ($ plugin-> params ligne 116) .Cette ligne échoue lorsque le plug-in User-Joomla est désactivé.

Toutefois, pour que My_Plugin fonctionne correctement, la fonction d'événement onUserLogin doit être appelée une seule fois. Lorsque User-Joomla est également activé (ce qui doit être dû à com_users), la fonction onUserLogin est exécutée deux fois: une fois par My_Plugin et une fois par User-Joomla.

QUESTION Comment puis-je arrêter ou "désactiver" cet événement dans My_Plugin pour l'empêcher de déclencher la même fonction dans User-Joomla? Il en va de même pour toutes les autres fonctions d'événement, par exemple. onUserAfterDelete, onUserAfterSave, onUserLogout, etc. Il va sans dire que je ne veux pas pirater le noyau de Joomla.

La classe My_Plugin est déclarée comme suit (tous les commentaires supprimés):

use Joomla\Registry\Registry;

class plgMy_Plugin_User extends JPlugin
{
protected $app;
protected $db;

public function onUserAfterDelete($user, $success, $msg)
{
     .............
}

public function onUserAfterSave($user, $isnew, $success, $msg)
{
     .............
}

public function onUserLogin($user, $options = array())
     .............
}

etcetera....
1
RobNL

Il semble que quelqu'un de l'équipe principale ait lu votre message et, en tant que tel, a ajouté une condition pour vérifier si le plug-in utilisateur est activé et, le cas échéant, les paramètres du plug-in. En substance, le développeur a changé ce code:

$plugin = JPluginHelper::getPlugin('user', 'joomla');
$pluginParams = new Registry($plugin->params);

à:

$pluginParams = new Registry;

if (JPluginHelper::isEnabled('user', 'joomla'))
{
    $plugin = JPluginHelper::getPlugin('user', 'joomla');
    $pluginParams->loadString($plugin->params);
}

Cela signifie que si vous mettez à jour votre version de Joomla vers la dernière version, vous ne rencontrerez plus ce problème.

Le mérite revient au développeur qui a lu votre message et corrigé le code.

Maintenant, pour répondre à votre question initiale, pour le moment, vous ne pouvez pas annuler le déclenchement ni empêcher un événement de se déclencher à moins de faire quelques modifications fondamentales. Et, même si cela était possible, cela ne résoudrait pas votre problème, car le problème que vous rencontriez était dû à un bogue de Joomla, qui supposait que le plug-in d'utilisateur principal était toujours activé.

Remarque: Joomla 4.0 contiendra une méthode stopPropagation() qui arrêtera la propagation d'un événement. Ce n'est pas exactement ce dont vous avez besoin, mais c'est néanmoins un bon élément.

1
itoctopus