[RESOLU]intégration plugin comme page statique bénéficiant de la variable $format

10 févr. modifié dans Entraide

Bonjour,

De nombreux plugin se servent du hook plxShowStaticListEnd pour injecter une page .

Cela fonctionne bien mais reste rigide car cela ne permet pas d'appliquer la variable $format de façon a ce que l'affichage soit cohérent avec celui des autres liens de pages statique si l'on veut coller a un thème spécifique ou l’intégrer ailleurs que dans le menu. Le seul format affichage possible est celui que l'on met en dur dans le hook a dans le deuxiéme echo :

>exemple du code de Stephane F. dans mySearch $lt; cliquer pour voir le code

    /**
     * Méthode de traitement du hook plxShowStaticListEnd
     *
     * @return  stdio
     * @author  Stephane F
     **/
    public function plxShowStaticListEnd() {

        # ajout du menu pour accèder à la page de recherche
        if($this->getParam('mnuDisplay')) {
            echo "<?php \$status = \$this->plxMotor->mode=='".$this->url."'?'active':'noactive'; ?>";
            echo "<?php array_splice(\$menus, ".($this->getParam('mnuPos')-1).", 0, '<li class=\"static menu '.\$status.'\" id=\"static-search\"><a href=\"'.\$this->plxMotor->urlRewrite('?".$this->lang.$this->url."').'\" title=\"".$this->getParam('mnuName_'.$this->default_lang)."\">".$this->getParam('mnuName_'.$this->default_lang)."</a></li>'); ?>";
        }
    }

Si l'on veut un autre affichage , (pas de list , insérer une class, une icône, autre,... ) il faut modifier cette partie directement dans le plugin.

J'ai donc tenter d'ajouter cette page en amont à partir du hook plxShowStaticListBegin.

Avec une petite astuce ( ../ , cela fonctionne ...sauf que ... uniquement si l'urlrwriting est activé.

Voici en la fonction que j'utilise pour ajouter une page statique à la liste:


>hook plxShowStaticListBegin< cliquer pour voir le code
public function plxShowStaticListBegin() {
        #ajout de la page du plugin dans la liste des pages statiques
        // TODO  voir si  boucle pour enlever stats inactive est necessaire pour correspondre totalement à la position configurée
        # Si affichage requis 
        if($this->getParam('mnuDisplay')) { 
            global $plxMotor;
            // on lui donne un numéros compatible avec ceux existants des pages satiques déjà referencées
            $max = max(array_keys($plxMotor->aStats));
            $max++;
            $max= str_pad($max, 3, "0", STR_PAD_LEFT);
            // on alimente les données spécifiques à cette nouvelle page statique.
            $newStats[$max]['group'] = '';// pas de groupe // maybe todo voir si option ajout à groupe existant est pertinent
            $newStats[$max]['name'] = $this->getParam('mnuName');
            if($plxAdmin->aConf['urlrewriting']=='oui') {
            $newStats[$max]['url'] = '../'.$this->getParam('url'); // gestion URL spécifique.
            }
            else { // pas d'url rewriting
            $newStats[$max]['url'] = $this->getParam('url'); // gestion URL spécifique.     
                       // c'est ici que ça coince, car l'url générée n'est pas compatible. 
                       // + en tapant l'url compatible à la main, le  fichier du plugin du plugin est introuvable 
            }
            $newStats[$max]['active'] = '1';
            $newStats[$max]['menu'] = 'oui';
            $newStats[$max]['ordre'] = $this->getParam('mnuPos') - 1;
            $newStats[$max]['template'] = $this->getParam('template');
            $newStats[$max]['title_htmltag'] = $this->getParam('mnuName');
            $newStats[$max]['meta_description'] = 'plug plug';
            $newStats[$max]['meta_keywords'] = 'eplug';
            $newStats[$max]['date_creation'] = date('YmdHi');
            $newStats[$max]['date_update'] = date('YmdHi');
            array_splice($plxMotor->aStats,$this->getParam('mnuPos') - 1,0,$newStats);          
        }       
    }

Je tente alors de voir, à partir du hook initial éprouvé de Stéphane, si il y a moyen encore d’accéder à la variable $format . Je n'y arrive pas et j'ai le droit à <b>Notice</b>: Undefined variable: format in .
L'idée était de tenter de se servir de cette variable pour reconstruire le lien à injecter au format par défaut ou celui demandé à partir du thème avec $plxShow->catList() .

Je coince et je ne sais plus quelle approche avoir,

  • l'idée d'inclure une page a aStats est une fausse bonne idée car on ne peut pas modifier l'url finale a ce stade du script.
  • Surtout, je n'arrive pas a comprendre comment récupérer $format au niveau du second HOOK pour le preserver et l'appliquer aussi aux liens des pages ajoutées.

Quelqu'un peut-il m'orienter ?

♣♣♣♣ <°(((((-{ ~ Mon site avec PluXml: https://re7net.com | Mes plugins pour PluXml : https://github.com/gcyrillus }-))))°> ♣♣♣♣

Réponses

  • bazooka07bazooka07 Moderator

    Bonsoir,

    Effectivement le plugin mySearch ne tient pas compte de la valeur de $format dans plxShow::staticList().
    Voici le code php qui prend cette variable en compte. Il est nécessaire de faire de l'injection de code PHP dans PluXml.

    <?php
    public function plxShowStaticListEnd() {
    
        # ajout du menu pour accèder à la page de recherche
        if($this->getParam('mnuDisplay')) {
            # $this correspond au plugin
            $url = $this->lang . $this->url; 
            $pos = intval($this->getParam('mnuPos')) - 1;
            $name = $this->getParam('mnuName_' . $this->default_lang);
            # valeur par défaut de $format dans plxShow::staticList() :
            # <li class="#static_class #static_status" id="#static_id"><a href="#static_url" title="#static_name">#static_name</a></li>
            echo '<?php' . PHP_EOL;
    ?>
    # Injection de code par le plugin <?= __CLASS__ ?>
    $stat = strtr($format, array(
        '#static_class'     => 'static menu',
        '#static_status'    => ($this->plxMotor->mode=='<?= $url ?>') ? 'active' : 'noactive', 
        '#static_id'        => 'static-search', 
        '#static_url'       => $this->plxMotor->urlRewrite('?<?= $url ?>'), 
        '#static_name'      => '<?= $name ?>',
    ));
    array_splice($menus, <?= $pos ?>, 0, array($stat));
    <?php
            echo PHP_EOL . '?>';
        }
    }
    ?>
    

    On peut aussi injecter du commentaire pour aider au déboguage quand plusieurs plugins utilisent le même hook.
    L'emploi des variables $url, $pos et $name ne sont pas obligatoires mais donne un code plus clair et facilite le déboguage.
    L'emploi de str_replace() est à proscrire ! lire le manuel

  • 10 févr. modifié

    Bonjour,

    Superbe !

    J'ai d'abords était très confus sans comprendre comment cela fonctionner, Il est nécessaire de faire l'injection de code dans PluXml.
    pour moi $stat et $format étaient invisible depuis le hook , et en copiant /collant le code pour voir ce que cela faisait, ça ne marchait pas.

    Jusqu'à ce que je comprennent que l'injection du code se faisait bien par le hook de façon à ce qu'il soit interpréter par la fonction de pluxml et pas le plugin, du coup j'ai chercher du coté des écho et en modifiant légèrement , je suis arrivé a quelque chose qui fonctionne apparemment :


    /** * Méthode de traitement du hook plxShowStaticListEnd * * @author Bazooka07 https://forum.pluxml.org/discussion/7134/integration-plugin-comme-page-statique-beneficiant-de-la-variable-format **/ public function plxShowStaticListEnd() { # ajout du menu pour accèder à la page de recherche if($this->getParam('mnuDisplay')) { # $this correspond au plugin $url = $this->lang . $this->url;; $pos = intval($this->getParam('mnuPos')) - 1; $name = $this->getParam('mnuName_' . $this->default_lang); # valeur par défaut de $format dans plxShow::staticList() : # <li class="#static_class #static_status" id="#static_id"><a href="#static_url" title="#static_name">#static_name</a></li> echo '<?php' . PHP_EOL; ?> # Injection de code par le plugin __CLASS__ $stat = strtr($format, array( '#static_class' => 'static menu', '#static_status' => ($this->plxMotor->mode== '<?= $url ?>' ) ? 'active' : 'noactive', '#static_id' => 'static-<?= $url ?>' , '#static_url' => $this->plxMotor->urlRewrite('?<?= $url ?>'), '#static_name' => '<?= $name ?>' , )); array_splice($menus, '<?= $pos ?>' , 0, array($stat)); <?php echo PHP_EOL . '?>'; }

    J'ai replacé quelques guillemets et modifier '#static_id' => 'static-<?= $url ?>' pour caler l'ID sur le mode du plugin.

    J'ai eu quelques soucis avec une version 5.8.6 en ligne qui n'afficher pas la page du plugin en mode urlrewriting , en passant à la 5.8.7 , le défaut à disparu. Je n'ai pas réussi à mettre le doigt sur le pourquoi, ce n'était peut-être qu'une typo dans les fichier du plugin ou une mise à jour d'un fichier ratée.

    En tout cas, sans se super gros coup de pousse , je serais encore en train de chercher le comment du comment, merci beaucoup .

    ♣♣♣♣ <°(((((-{ ~ Mon site avec PluXml: https://re7net.com | Mes plugins pour PluXml : https://github.com/gcyrillus }-))))°> ♣♣♣♣

  • bazooka07bazooka07 Moderator

    #static_id sert uniquement pour appliquer les règles CSS. Mettre $url dans la valeur n'est pas pertinent.
    Si un utilisateur change l'url, il faudra réviser la feuille de style CSS.
    Il vaudrait mieux mettre l'$id de la page statique ou le nom de ton plugin. Comme cela l'utilisateur ne pourra pas y toucher.
    Evidemment si tu es le seul utilisateur .....

    j'ai écrit :

    # Injection de code par le plugin <?= __CLASS__ ?>
    

    Quand cela fonctionne de travers et que plusieurs plugins utilisent le même hook, on est bien content de savoir qui injecte chaque portion de code.
    C'est une règle de bonne conduite.

    L'injection de code peut sembler terrifiant de prime abord. Mais quand on a compris le truc, on peut faire ce que l'on veut avec PluXml. Même si au niveau sécurité, ce n'est pas forcément le top. Faut juste blinder l'accès administrateur avec un plugin qui va bien (kzOtPHP ou kzU2F)

  • 10 févr. modifié

    Oui effectivement $url est moyen, $name ne fait pas mieux , l'idée était de faciliter la réutilisation du code sans avoir à redéfinir le nom de l'id pour chaque plugin qui pourrait s'en servir.Il faudra que je trouve autre chose. __CLASS__ semble peut-être plus pertinent.

    Pour le commentaire j'ai corriger la syntaxe aprés coup .

    Ce coup de main m’éclaire beaucoup et effectivement me met beaucoup plus à l'aise devant les codes de PluXml , j’apprends doucement et continue à découvrir plein de chose à partir du forum.

    Cdt,
    GC

    ♣♣♣♣ <°(((((-{ ~ Mon site avec PluXml: https://re7net.com | Mes plugins pour PluXml : https://github.com/gcyrillus }-))))°> ♣♣♣♣

Connectez-vous ou Inscrivez-vous pour répondre.