web-dev-qa-db-fra.com

Joomla 3.6 Core Override

J'ai développé un composant personnalisé pour un client et ils devaient pouvoir réutiliser les adresses électroniques pour les utilisateurs. Comme Joomla exigeait des adresses électroniques uniques, j'ai créé un plug-in système qui se déclenche sur "onAfterRoute" et charge à la place ma classe JTableUser.

Je sais que ce n’est pas idéal mais c’était le meilleur moyen d’atteindre le résultat final.

Je viens d’installer Joomla 3.6 et jette maintenant une erreur fatale en disant que je ne peux pas redéclarer la classe JTableUser lorsque j’essaie d’utiliser quoi que ce soit à partir du. Je suppose que la classe d'origine est maintenant appelée avant le déclencheur onAfterRoute.

class PlgSystemMyComponentOverride extends JPlugin
{
public function __construct(&$subject, $config = array()) {
      parent::__construct($subject, $config);
  }

  public function onAfterRoute() {
      $app = JFactory::getApplication();
      $option = JRequest::getCMD('option');
      if('com_users' == JRequest::getCMD('option')) {
          require_once('path_to_my_code.php');
      }
  }
}

Est-il possible de résoudre ce problème dans Joomla 3.6?

Merci

Lee

3
Lee Wiggins

JTableUser est très délicat. Étant donné qu'il est chargé dès la première initialisation de la structure, il ne peut pas être facilement surchargé par un plugin système et il ne peut pas être supprimé de la mémoire une fois qu'il est là.

Pour résoudre le cas, je devais créer une fonction patch, dans laquelle la classe d'origine JUser est remplacée dans le noyau par le plug-in système:

$this->patch('JTableUser', '/libraries/joomla/table/user.php');
1
Anibal