[Résolu] Comment ajouter des fonctions PHP dans PluXML pour 1 Plugin ?

SuricatSuricat Member
juin 2016 modifié dans Entraide
Bonjour,

Y a-t-il un moyen d'ajouter une librairie de fonctions PHP à PluXML par plugin ?
Cette librairie devrait être incluse avant class.plx.admin.php afin de pouvoir appeler certaines de ses fonctions dans le hook plxAdminEditArticle.

J'ai bien peur que la réponse soit non, mais vous avez peut-être des solutions alternatives...

Merci.

Réponses

  • je-evrardje-evrard Member
    mai 2016 modifié
    Ton post devrait plutot aller dans entraide et non dans plugins

    Exemple d'inclusion de librairies php coté frontend

    Dans le plugin
    [== Indéfini ==]
    public function __construct($default_lang) {
    		
    		# Appel du constructeur de la classe plxPlugin (obligatoire)
    		parent::__construct($default_lang);
    		
    		# Déclarations des hooks
    		
    		if(!defined('PLX_ADMIN')) {
    			$this->addHook('IndexBegin', 'IndexBegin');
    		}
    }
    
    
    # include 
    public function IndexBegin() {
    	require(PLX_PLUGINS.'monplugin/assets/lib/myfunction.php');
    		
    }
    

    Coté admin tu as un hook
    [== Indéfini ==]
    # Hook Plugins
    eval($plxAdmin->plxPlugins->callHook('AdminPrepend'));
    

    [== Indéfini ==]
    public function __construct($default_lang) {
    		
    		# Appel du constructeur de la classe plxPlugin (obligatoire)
    		parent::__construct($default_lang);
    		
    		# Déclarations des hooks
    		
    		if(defined('PLX_ADMIN')) {
    			$this->addHook('AdminPrepend', 'AdminPrepend');
    		}
    }
    
    
    # include 
    public function AdminPrepend() {
    	require(PLX_PLUGINS.'monplugin/assets/lib/myfunction.php');
    		
    }
    
  • SuricatSuricat Member
    mai 2016 modifié
    Ton post devrait plutot aller dans entraide et non dans plugins
    C'est pas faux. Comme ça concerne les plugins, j'ai mis dans Plugin, mais j'aurai du mettre dans Entraide, c'est vrai...
    Coté admin tu as un hook
    J'ai vu le hook AdminPrepend dans prepend.php, mais il est appelé après les include_once, et notamment avant le
    include_once(PLX_CORE.'lib/class.plx.admin.php');

    Donc, les fonctions ajoutées après par ce "require" ne seront pas appelables dans le hook plxAdminEditArticle qui est dans class.plx.admin.php, me trompe-je ?
  • SuricatSuricat Member
    mai 2016 modifié
    Bon, pas moyen d'exécuter une fonction perso depuis le hook plxAdminEditArticle.
    J'ai aussi essayé avec call_user_func, mais ça ne fonctionne pas.
    J'image que c'est une contrainte de sécurité qui l'empêche...
  • mathieumathieu Member
    ça va être compliqué de vous aider si vous nous voulez pas nous montrer ce que vous voulez faire
  • StéphaneStéphane Member, Former PluXml Project Manager
    Suricat a écrit:
    Bon, pas moyen d'exécuter une fonction perso depuis le hook plxAdminEditArticle.
    J'ai aussi essayé avec call_user_func, mais ça ne fonctionne pas.
    J'image que c'est une contrainte de sécurité qui l'empêche...

    non c'est juste toi, qui t'y prends mal.

    Voilà plusieurs façon de faire différement.
    Désolé je donne pas d'explication faute de temps.
    En revanche, n'hésite pas à poser des questions si besoin.

    METHODE 1: injection directe de code php dans le code PluXml au niveau d'un hook

    fichier: /plugins/monplugin/monplugin.php
    <?php
    class monplugin extends plxPlugin {
    
    	/**
    	 * Constructeur de la classe
    	 *
    	 * @param	default_lang	langue par défaut utilisée par PluXml
    	 * @return	null
    	 * @author	Stephane F
    	 **/
    	public function __construct($default_lang) {
    
    		# Appel du constructeur de la classe plxPlugin (obligatoire)
    		parent::__construct($default_lang);
    		
    		$this->addHook('plxAdminEditArticle', 'plxAdminEditArticle');
    	}
    
    	public function plxAdminEditArticle() {
    		echo '<?php $content["chapo"] .= "MON CHAPOOOOO"; ?>";
    	}
    }
    ?>
    

    METHODE 2: utilisation d'un fichier librairie perso avec classe et méthode statique

    fichier: /plugins/monplugin/lib.monplugin.php
    <?php
    class libMonplugin extends plxPlugin {
    
    	public function __construct() {
    	}
    
    	public static function maFonction() {
    	}
    }
    ?>
    

    fichier: /plugins/monplugin/monplugin.php
    <?php
    
    include(dirname(__FILE__).'/lib.monplugin.php');
    
    class monplugin extends plxPlugin {
    
    	/**
    	 * Constructeur de la classe
    	 *
    	 * @param	default_lang	langue par défaut utilisée par PluXml
    	 * @return	null
    	 * @author	Stephane F
    	 **/
    	public function __construct($default_lang) {
    
    		# Appel du constructeur de la classe plxPlugin (obligatoire)
    		parent::__construct($default_lang);
    		# déclaration du hook
    		$this->addHook('plxAdminEditArticle', 'plxAdminEditArticle');
    	}
    
    	public function plxAdminEditArticle() {
    		echo '<?php libMonplugin::maFonction() ?>';
    	}
    }
    ?>
    

    METHODE 3: utilisation d'un fichier librairie perso avec instanciation d'une classe

    fichier: /plugins/monplugin/lib.monplugin.php
    <?php
    class libMonplugin extends plxPlugin {
    
    	public function __construct() {
    	}
    
    	public function maFonction() {
    	}
    }
    ?>
    

    fichier: /plugins/monplugin/monplugin.php
    <?php
    
    include(dirname(__FILE__).'/lib.monplugin.php');
    
    class monplugin extends plxPlugin {
    
    	/**
    	 * Constructeur de la classe
    	 *
    	 * @param	default_lang	langue par défaut utilisée par PluXml
    	 * @return	null
    	 * @author	Stephane F
    	 **/
    	public function __construct($default_lang) {
    
    		# Appel du constructeur de la classe plxPlugin (obligatoire)
    		parent::__construct($default_lang);
    		# déclaration du hook
    		$this->addHook('plxAdminEditArticle', 'plxAdminEditArticle');
    	}
    
    	public function plxAdminEditArticle() {
    		
    		$obj = new libMonplugin();
    		$obj->maFonction();
    
    	}
    }
    ?>
    

    METHODE 4: utilisation d'un fichier librairie perso avec instanciation d'une classe au niveau de l'injection de code dans un hook

    fichier: /plugins/monplugin/lib.monplugin.php
    <?php
    class libMonplugin extends plxPlugin {
    
    	public function __construct() {
    	}
    
    	public function maFonction() {
    	}
    }
    ?>
    

    fichier: /plugins/monplugin/monplugin.php
    <?php
    
    include(dirname(__FILE__).'/lib.monplugin.php');
    
    class monplugin extends plxPlugin {
    
    	/**
    	 * Constructeur de la classe
    	 *
    	 * @param	default_lang	langue par défaut utilisée par PluXml
    	 * @return	null
    	 * @author	Stephane F
    	 **/
    	public function __construct($default_lang) {
    
    		# Appel du constructeur de la classe plxPlugin (obligatoire)
    		parent::__construct($default_lang);
    		# déclaration du hook
    		$this->addHook('plxAdminEditArticle', 'plxAdminEditArticle');
    	}
    
    	public function plxAdminEditArticle() {
    		
    		echo '<?php 
    			$obj = new libMonplugin();
    			$obj->maFonction(); 
    		?>';
    	}
    }
    ?>
    

    Consultant PluXml

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

  • SuricatSuricat Member
    juin 2016 modifié
    C'est bon, j'ai trouvé la solution qui était toute simple en fait.
    Ce que je voulais faire, c'est lancer des fonctions écrites dans mon plugin depuis le hook plxAdminEditArticle.
    (Ma question initiale paraît différente, mais je ne pensais pas qu'on pouvait le faire comme ça et je cherchais donc une autre façon de faire...)

    Il suffit d'écrire le code suivant dans le plugin :
    [== PHP ==]
    public function plxAdminEditArticle(){
            echo "<?php 
    		        \$this->plxPlugins->aPlugins['nomDeMonPlugin']->maFonction();
                   ?>";
    }
    

    J'ai utilisé cet appel de fonction dans la nouvelle version du plugin SuggestAvecImage.

    Merci je-evrad et Stéphane pour les exemples de code. Ils peuvent être très utiles.
Connectez-vous ou Inscrivez-vous pour répondre.