Gestion des événements de plugin

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [RÉGLÉ] Gestion des événements de plugin

    Bonjour à tous.

    J'essaie de développer mon premier plugin, et je rencontre un petit souci.
    J'ai parcouru un peu la doc Joomla, et plus particulièrement la liste des événements pour plugins : https://docs.joomla.org/Plugin/Events
    et je me demande s'il est possible de déclencher mon plugin sur une page composant (type Community Builder, K2, ou autre) ?

    L'idée, c'est que je veux exécuter une mise à jour sur d'autres table de ma base de données lorsqu'un membre modifie son profil (géré par Community Builder).
    A la base, je suis parti sur un plugin de type "user", avec un événement "onUserAfterSave".
    Et ça fonctionne plutôt pas mal : quand un membre met à jour son profil, le plugin s'exécute correctement, et ma base est bien mise à jour.

    Mais le souci, c'est que l'événement "onUserAfterSave" se déclenche (a priori, vu ce que je comprends) avant la mise à jour des tables Community Builder.
    Donc je ne mets pas à jour ma base avec les bonnes données... Il faut sauvegarder une 2eme fois pour avoir les bonnes infos...

    Je souhaiterais donc déclencher ma mise à jour après la mise à jour du profil Community Builder.
    Je pensais qu'il était possible, dans mon plugin, de déclencher mon bout de code lorsque je sors de ma page d'édition de profil CB, et que je reviens sur la page de profil CB.
    J'ai regardé un peur du côté de l'événement "onContentPrepare", pour voir la liste des contextes disponibles, et identifier le contexte qui correspond à la page que je veux cibler.

    J'ai fait un petit plugin de test qui affiche le contexte sur les pages type "article" de Joomla, mais rien sur les pages type "composant" (CB, K2, etc.).
    Bref, je patauge


    Est-ce que quelqu'un pourrait me dire si je suis sur la bonne voie, et comment déclencher mon plugin sur la page désirée, ou s'il existe une autre (meilleure) façon de procéder ?

    Merci d'avance pour votre aide.
    Dernière édition par plastic1st à 12/03/2019, 17h06

  • #2
    Je suis pas développeur, mais il y a un excellent livre consacré à 100% aux plugins Joomla : https://www.yireo.com/books/programm...a-plugins-book
    Présentations : slides.woluweb.be | Coordonnées complètes : www.woluweb.be

    Un message d’erreur sur votre site Joomla... ayez le reflexe de consulter la base de connaissance : https://kb.joomla.fr

    Ce forum, vous l'aimez ? Il vous a sauvé la vie ? Vous y apprenez régulièrement ? Alors adhérer à l'AFUJ, l'Association Francophone des Utilisateurs de Joomla : https://www.joomla.fr/association/adherer

    Commentaire


    • #3
      Hello.

      Chaque composant a ses triggers (ou pas).

      Dans le cas de CB c'est le cas.

      La doc que tu as lue concerne le framework de Joomla.
      Mais là tu veux attraper une mise à jour d'un user de CB.

      Il est normal que CB commence par lancer la fonction d'enregistrement du user de joomla, car CB doit bien récupérer l'id de l'user pour faire son propre enregistrement et le lier avec celui de la table #__users de Joomla.

      Donc dans ton cas, ce n'est pas un plugin de Joomla que tu dois faire mais un plugin de CB à placer dans /components/com_comprofiler/plugin/user/plug_lenomdetonplugin/

      Mais la logique de programmation n'est pas tout à fait identique et la documentation de CB pas trop à jour.

      Il faut donc t'inspirer d'un autre plugin dans le dossier de CB.

      Un truc du genre (juste pour donner une idée, pas testé) :
      Code PHP:
      <?php

      if ( ! ( defined'_VALID_CB' ) || defined'_JEXEC' ) || defined'_VALID_MOS' ) ) ) { die( 'Direct Access to this location is not allowed.' ); }

      global 
      $_PLUGINS;

      use 
      Joomla\CMS\Component\ComponentHelper;

      use 
      Joomla\CMS\Factory as JFactory;
      use 
      Joomla\CMS\Table\Table as JTable;

      $_PLUGINS->registerFunction'onAfterUserUpdate''UserAfterSave','getMonPluginTab' );
      $_PLUGINS->registerFunction'onAfterNewUser''UserAfterSave','getMonPluginTab' );
      $_PLUGINS->registerFunction'onAfterUpdateUser''UserAfterSave','getMonPluginTab' );
      $_PLUGINS->registerFunction'onAfterDeleteUser''userDelete','getMonPluginTab' );

      class 
      getMonPluginTab extends cbTabHandler {

              protected 
      $_Tchamps_gskiuser = array();

              protected 
      $_PrefixFormFields "";
              var 
      $installed true;

              var 
      $_MyDir '';

              protected 
      $_myplugin_params;


              function 
      __construct()
          {
                  
      $lang JFactory::getLanguage();
                  
      $lang->load('plug_monplugin',$this->_MyDir);

                  
      parent::__construct();


          }

          function 
      userDelete($user$success) {
              if(!
      $this->installed){ return $this->errorMessage;}

              if (!
      $success) return;

                      
      $CLuser =JTable::getInstance('Users''MaTable');
                      if(
      $CLuser->load(array('jid' => $user->user_id))){
                          
      $CLuser->delete();
                      }
          }

             function 
      UserAfterSave($user$rowExtra$Bool)
             {
                  global 
      $_CB_framework$_PLUGINS;

                  
      $app JFactory::getApplication();

                  if(empty(
      $user->user_id) OR !$this->installed){
                      
      $Msg JText::_('CBPLG_GSKITITRES_FORBIDEN_ACTION');
                      
      $_PLUGINS->_setErrorMSG$Msg );
                      
      $_PLUGINS->raiseError);
                      
      JFactory::getApplication()->enqueueMessage($Msg'error');
                      return 
      false;
                  }

                  
      $my JFactory::getUser();

                  if(!
      $Bool){ // lors d'un enregistrement $my->id == 0 et $Bool = true
                      
      if ($my->id != $user->user_id && !$my->get('isRoot')){
              
      /* Accès non autorisé, ce n'est pas l'user courrant, ni un admin */
                          
      $Msg JText::_('CBPLG_GSKITITRES_FORBIDEN_ACTION_FOR_USER');
                          
      $_PLUGINS->_setErrorMSG$Msg );
                          
      $_PLUGINS->raiseError);
                          
      //JFactory::getApplication()->enqueueMessage($Msg, 'error');
                          
      return false;
                      }
                  }
                  
      $CLuser =JTable::getInstance('Users''MyTable');

                  if(!
      $CLuser->load(array('jid' => $user->user_id))){
                      
      $CLuser->reset();
                  }

      ....            


                  if(!
      $CLuser->store()){
                      
      //JError::raiseWarning('', JText::sprintf('COM_GSKITITRES_STORE_GSKIUSER_ERROR',$my->id));
                      
      $_PLUGINS->_setErrorMSGJText::sprintf('COM_GSKITITRES_STORE_GSKIUSER_ERROR',$my->id) );
                      
      $_PLUGINS->raiseError();
                      return 
      false;

                  }

                  return 
      null;
             }        

      }
      Dernière édition par roland_d_alsace à 11/03/2019, 20h33
      plastic1st aime ceci.
      A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
      Rejoignez le Joomla Users Groupe Alsace...
      roland_d_alsace va-t-il devenir roland_du_grand_est ?

      Commentaire


      • #4
        Merci roland_d_alsace pour ta réponse détaillée.
        C'est super sympa de ta part d'avoir pris le temps de bien m'expliquer la marche à suivre.
        J'ai une bonne base de départ.
        Je vais analyser tout ça et me mettre au boulot.

        Commentaire


        • #5
          Encore un énorme merci à toi roland_d_alsace !
          Mon plugin fonctionne, et c'est en grande partie grâce à toi !

          Commentaire


          • #6
            Bonjour

            C'est sûr que la réponse fournie par Roland était superbe; quasi du prêt à l'emploi. Bravo Roland !
            Christophe (cavo789)
            Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
            Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

            Commentaire

            Annonce

            Réduire
            Aucune annonce pour le moment.

            Partenaire de l'association

            Réduire

            Hébergeur Web PlanetHoster
            Travaille ...
            X