A chaque usage son plugin

bazooka07bazooka07 PluXml Lead Developer, Moderator
Bonjour,

On peut classer basiquement les plugins en 3 catégories :
* ceux qui ne servent que du côté admin : la plupart des éditeurs ckEditor, TinyMCE, Codemirror, Ace, d'autres utilitaires moveMyDatas, kzUploader, ...
* ceux qui ne servent que du côté site : ceux qui servent à rendre votre site plus attractif: sliders, Lightbox, réseaux sociaux, ...
* ceux qui servent des 2 côtés : filtre anti-captcha, calendrier, ....

Et PluXml charge à chaque fois tous les plugins activés sans tenir compte de vos besoins d'administrateur ou de simple visiteur.

Par exemple, je doute de l'intérêt pour un visiteur de charger un éditeur Wisiwyg. On aura un moins un accès disque dur inutile pour télécharger la déclaration de class du plugin, voire envoyer au visiteur un grosse librairie Javascript ( coucou JQuery ) si les hooks sont mal utilisés. A cela s'ajoutent des risques d'intrusion si la sécurité est le dernier des soucis de l'auteur du plugin ( Qui filtre ses posts avec filter_input ? )

Pour éviter de charger des plugins inutiles à son utilisation, il serait simple d'ajouter un attribut ou une balise xml dans le fichier infos.xml de chaque plugin qui pourrait être absent, ou avoir la valeur 'admin' ou 'site'. Et à l'activation du plugin conserver cette valeur avec le nom du plugin dans le fichier de configuration plugins.xml.
Ensuite au démarrage de PluXml, il suffit dans la méthode plxPlugins::loadPlugins() de vérifier la présence de la constante PLX_ADMIN pour charger uniquement les plugins nécessaires à l'admin du site ou commun côtés admin et site. En l'absence de cette constante, on ne charge que les plugins nécessaires pour le côté site et commun côtés site et admin.

Mettre cela en place est relativement facile avec PLuXml et encore plus pour tous les plugins.

Qu'en pensez-vous ?

Réponses

  • StéphaneStéphane Member, Former PluXml Project Manager
    Bonjour

    Dans les devs en cours que je prepare pour la suite de PluXml, j'ai intégré une notion de "scope" pour définir lors de la déclaration d'un hook (appel de la fonction addHook) quand le hook doit etre chargé en fonction de la page affichée.
    Ce qui mettra par exemple de charger un fichier externe .js que si on est sur la page article.php de l'admin
    C'est facile à faire coté admin car il suffit de regarder en fonction du fichier .php présent dans l'url et de rajouter un parametre dans l'appel du hook

    ex: $this->addHook('Hook', 'monHook', 'article.php');

    de cette façon on ne charge et garde en mémoire la définition du hook que si on est sur la page article.php de l'admin

    Coté visiteur, c'est un peu plus compliqué car il tenir compte du mode d'affichage (home, article, statique, etc...) car on passe toujours par le fichier index.php et le mode d'affichage est définit après le chargement des plugins. Donc difficile d'appliquer le meme raisonnement que coté admin. Il faut encore que je réfléchisse comment faire au mieux coté visiteur.

    C'est en cours de réflexion et ça demande à murir, mais ça rejoins ton sujet

    Consultant PluXml

    Ancien responsable et développeur de PluXml (2010 à 2018)

  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    Pour décider quel hook activer, il faut d'abord charger le plugin.

    Ce que je propose est d'un niveau plus bas.
    Constituer 3 listes de plugins :
    * ceux exclusifs à l'admin
    * ceux exclusifs au site
    * ceux communs aux deux côtés

    Pour ne pas tout bouleverser, l'idée est d'ajouter un attribut ou une balise dans infos.xml et de l'enregistrer dans la liste des plugins activés dans le fichier plugins.xml.
    Et cette valeur définit les plugins à télécharger dans loadPlugins selon l'existence de la constante PLX_ADMIN.
    Cela évite d'aller lire les fichiers des plugins inutiles.

    Il revient juste à chaque auteur de plugin de rajouter cet attribut ou cette basile dans leur fichier infos.xml
  • StéphaneStéphane Member, Former PluXml Project Manager
    ça me va. et pour gérer la non regression si la balise n'est pas présente dans le fichier .xml on charge pour les 3 cas.
    modif très simple à faire et qui ne devrait prendre que quelques lignes de code en plus.
    tres bien vu JP. Merci

    Consultant PluXml

    Ancien responsable et développeur de PluXml (2010 à 2018)

  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    décembre 2017 modifié
    Voir Pull-request https://github.com/pluxml/PluXml/pull/269

    copies d'écran :
    https://flic.kr/p/HDQA8c
    https://flic.kr/p/21fErAF
    Exemple de fichier infos.xml d'un plugin
    [==infos.xml ==]
    <?xml version="1.0" encoding="UTF-8"?>
    <document>
        <title><![CDATA[moveMyDatas]]></title>
        <author><![CDATA[Jean-Pierre Pourrez]]></author>
        <version>1.0.0</version>
        <date>16/12/2017</date>
        <site>http://www.kazimentou.fr</site>
        <description><![CDATA[Gérez les dossiers de vos données]]></description>
        <usage>admin</usage>
    </document>
    
    La balise usage peut prendre la valeur admin, site, être vide ou absente.

    Pour connaitre la liste des plugins chargés côté site, ajouter la ligne suivante à la fin du fichier footer.php du thème courant et afficher le code source de la page HTML (Ctrl-U) :
    [== PHP ==]
    <?php echo "<!--\n\$plugins = array(\n\t'".implode("',\n\t'", array_keys($plxShow->plxMotor->plxPlugins->aPlugins))."'\n);\n-->\n"; ?>
    

    En attendant la validation du pull-request, utiliser Git pour tester :
    [== bash ==]
    https://github.com/bazooka07/PluXml.git -b classification-plugins
    
  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    La balise <usage> s'appellera <scope> au final.
    Ce qui donne pour le plugin moveMyDatas :
    [== infos.xml ==]
    <?xml version="1.0" encoding="UTF-8"?>
    <document>
        <title><![CDATA[moveMyDatas]]></title>
        <author><![CDATA[Jean-Pierre Pourrez]]></author>
        <version>1.0.1</version>
        <date>16/12/2017</date>
        <site>http://www.kazimentou.fr</site>
        <description><![CDATA[Gérez les dossiers de vos données]]></description>
        <scope>admin</scope>
    </document>
    
Connectez-vous ou Inscrivez-vous pour répondre.