initialisation plugin via variable de plxMotor

je-evrardje-evrard Member
août 2017 modifié dans Entraide
Bonjour,

Dans le cadre d'un projet perso j'ai besoin de définir des constantes à la construction de mon plugin.

Coté admin ça pose problème, voici mon code :
[== Indéfini ==]
class plugintest extends plxPlugin {
	public function __construct($default_lang) {
		
		parent::__construct($default_lang);
		
		$this->initconfiguration();
	}

	public function initconfiguration() {
		$plxMotor =  plxMotor::getInstance();
		
		$style = $plxMotor->aConf["style"];
			
		echo ("---------------------PLUGINTEST------------------\n<br>");
		
		echo ("plugintest initconfiguration style = ".$style."\n<br>");
			
		if (!defined('VIWTHEMENAME'))  define('VIWTHEMENAME', $style);
		
		echo ("VIWTHEMENAME = ".VIWTHEMENAME."\n<br>");	
		
		echo ("---------------------END PLUGINTEST------------------\n<br>");
		
		
	}


}

J'obtiens ceci coté backend :
[== Indéfini ==]
</br>---------------------PLUGINTEST------------------
<br>plugintest initconfiguration style = 
<br>VIWTHEMENAME = 
<br>---------------------END PLUGINTEST------------------
<br>---------------------PLUGINTEST------------------
<br>plugintest initconfiguration style = defaut
<br>VIWTHEMENAME = 
<br>---------------------END PLUGINTEST------------------


Ma constante reste vide, en effet
[list=*]
[*]Une constante ne peux etre redéfinie[/*]
[*]La fonction est appelé deux fois dans le contexte backend et dont la première fois avec un tableau de configuration vide[/*]
[/list]


D'ou ma question.

Avez-vous une idée simple et propre pour définir une constante à la construction d'un plugin en utilisant les variables plxMotor.

A noter que je pourrais faire ça mais ce n'est pas propre (la fonction du plugin étant appelée deux fois).
[== Indéfini ==]
class plugintest extends plxPlugin {
	public function __construct($default_lang) {
		
		parent::__construct($default_lang);
		
		$this->initconfiguration();
	}

	public function initconfiguration() {
		$plxMotor =  plxMotor::getInstance();
		
		$style = $plxMotor->aConf["style"];
			
		echo ("---------------------PLUGINTEST------------------\n<br>");
		
		echo ("plugintest initconfiguration style = ".$style."\n<br>");
			
		if ($plxMotor->aConf["style"]!=""){		
				if (!defined('VIWTHEMENAME'))  define('VIWTHEMENAME', $style);
		
				echo ("VIWTHEMENAME = ".VIWTHEMENAME."\n<br>");
		}
		
		echo ("---------------------END PLUGINTEST------------------\n<br>");
		
		
	}


}

merci. a++

jéjé

Réponses

  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    Cette constante ne dépend pas de ton plugin !
    Quand PluXml instancie ton plugin, c'est que $PlxMotor ou $plxAdmin existe déjà. Suffit juste de vérifier s'ils répondent présents :
    [== PHP ==]
    <?php
    if(!defined('VIEW_THEME_NAME')) {
    	if(isset($plxMotor)) {
    		// côté site
    		define('VIEW_THEME_NAME', $plxMotor->aConf['style']);
    	}
    }
    
    class Plugin_test extends plxPlugin {
    
    	public function __construct($default_lang) {
    		
    		parent::__construct($default_lang);
    		
    	}
    	
    	public function initconfiguration() {
    		if(define('VIEW_THEME_NAME')) {
    			echo "<!-- ".__CLASS__." -> VIEW_THEME_NAME : ".VIEW_THEME_NAME." -->\n";
    		} else {
    			echo "<!-- ".__CLASS__." -> VIEW_THEME_NAME n'existe pas ! -->\n";
    		}
    	}
    
    }
    ?>
    

    Pour info, on peut définir des constantes de class, mais il faut que cela soit une valeur littérale. Ce qui n'est pas le cas ici.
    Tu peux regarder kzUploader si tu veux un exemple.
  • Bonsoir,
    @je-evrard : j'ai été confronté au même problème que toi car je devais récupérer dans le constructeur de mon plugin le contenu de la variable $this->aUsers définie dans la classe plxMotor.
    J'ai fait la même erreur que toi en partant sur l'instruction $plxMotor = plxMotor::getInstance(); pour récupérer l'instance de la classe. Grosse erreur comme tu as pu le constater car le constructeur de cette classe n'est pas en private. Aussi, il peut exister plusieurs instances différentes de cette classe.
    Bref, je suis passé par le hook 'plxMotorConstruct' pour pouvoir récupérer et stocker le contenu des variables de plxMotor dans mon plugin comme ceci :
    [== PHP ==]
    class adm_users_rights extends plxPlugin
    {
            private $_plug_name = 'adm_users_rights';   // Nom du plugin
    	private $_aUsers = array(); // Tableau contenant les paramètres de tous les utilisateurs
    
           public function __construct($default_lang)
           {              
                   # Appel du constructeur de la classe plxPlugin (obligatoire)
    		parent::__construct($default_lang);
           
    	       # Ajouts des hooks
                   $this->addHook('plxMotorConstruct', 'plxMotorConstruct');
          }
    
          public function plxMotorConstruct()
         {
            echo "<?php
                \$this->plxPlugins->aPlugins['".$this -> _plug_name."']->set_aUsers(\$this->aUsers);
             ?>";
         }
    
         public function set_aUsers($users)
         {
            $this -> _aUsers = $users;
         }
    }
    

    Voilà, je ne dis pas que c'est la meilleure solution mais en tout cas, elle est propre et elle est reste interne au plugin (pas de risque de conflit avec d'autres plugins).
    Cordialement.
  • Merci pour vos retours, je vais regarder ça.

    ++

    jéjé
  • je-evrardje-evrard Member
    août 2017 modifié
    J'ai adopté la solution de memento.

    Je donne directement le $this a l'initconfiguration ce qui permet de toucher toutes les propiétés de $plxMotor en entrée de l'init. Ca a vraiment l'avantage de ne pas créer d'instance.

    Merci encore.
    [== Indéfini ==]
    <?php
    /**
     * Classe plugintest
     *
     * @package PLX
     * @author	jevrard
     **/
    class plugintest extends plxPlugin {
    
    	/**
    	 * Constructeur de la classe
    	 *
    	 * @return	null
    	 * @author	jevrard
    	 **/
    	 private $_plug_name = 'plugintest';   // Nom du plugin
    	 
    	 
    	public function __construct($default_lang) {
    		
    		# Appel du constructeur de la classe plxPlugin (obligatoire)
    		parent::__construct($default_lang);
    		
    		# add shorcode
    		
    		# Déclaration des hooks
    		# Ajouts des hooks
            $this->addHook('plxMotorConstruct', 'plxMotorConstruct');
    		
    	}
    	
    	 public function plxMotorConstruct() {
            echo "<?php
                \$this->plxPlugins->aPlugins['".$this -> _plug_name."']->initconfiguration(\$this);
             ?>";
         }
    
    	# add utils class
    	public function initconfiguration($plxMotor) {
    		$style = $plxMotor->aConf["style"];
    			
    		echo ("---------------------PLUGINTEST------------------\n<br>");
    		echo ("plugintest initconfiguration style = ".$style."\n<br>");
    		if (!defined('VIWTHEMENAME'))  define('VIWTHEMENAME', $style);	
    		echo ("VIWTHEMENAME = ".VIWTHEMENAME."\n<br>");
    		echo ("---------------------END PLUGINTEST------------------\n<br>");
    		//}
    	}
    }
    ?>
    

    Merci encore. Une solution simple et qui marche.
  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    Sauf cas particulier, l'usage de $_plug_name est inutile :
    Remplacer $this -> _plug_name par __CLASS__ tout simplement.

    Très pratique pour récupérer l'URL du dossier du plugin: PLX_PLUGINS.__CLASS__.'/'
  • Bonsoir,
    @je-evrard : content que ça ait pu te rendre service.

    @bazooka : l'utilisation de la constante __CLASS__ dans les exemples que tu proposes est potentiellement une future source de bug dans le cas où (on ne sait jamais) stéphane décide d'introduire un espace de nom dans une future version de pluxml. L'instruction basename(__CLASS__) serait plus appropriée pour être tranquille.

    Cordialement
  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    En utilisant les apostrophes simples, on obtient quelque chose un chouia plus propre:
    [== PHP ==]
    public function plxMotorConstruct() {
    	echo '<?php $this->plxPlugins->aPlugins["'.__CLASS__.'"]->initconfiguration($this); ?>';
    }
    

    @memento,
    Je ne comprends pas trop ta remarque.
    basename s'applique à un chemin de fichier.
    Or __CLASS__ ne renvoie que le nom de la class et contient éventuellement l'espace de nom
    Lire la doc sur php.net en français

    Si tu parles de la dernière remarque en bas de cette doc, c'est une vieille remarque de 6 ans ( quelle version de PHP ? ) et le gars avoue utiliser cela sous Windows ]:D ( Très courant sur Internet comme chacun sait :D )

    Merci quand même pour l'astuce.
    Cela m'évite de tester la présence de $plxMotor ou $plxAdmin.
    Il permet de remplacer la constante PLX_PLUGINS qui ne donne pas une url absolue ( J'en ai besoin pour paramétrer ma nouvelle version du plugin Tinymce (coming soon..))
    [== PHP ==]
    class MonPetitPlugin extends plxPlugin {
    
    	public function plxMotorConstruct() {
    		echo '<?php $this->plxPlugins->aPlugins["'.__CLASS__.'"]->get_context($this); ?>';
    	}
    
    	public function get_context($plxMotor) {
    		$this->plx_racine = $plxMotor->racine;
    		$this->plx_plugin_root = $plxMotor->racine.$plxMotor->aConf['racine_plugins'].__CLASS__.'/';
    		$this->plx_aConf = $plxMotor->aConf;
    		$this->plx_theme = $plxMotor->racine.$plxMotor->aConf['racine_themes'].$plxMotor->style;
    	}
    
    }
    
    
    $this->plx_plugin_root permet de renseigner l'attribut src d'un script JS. quand on est sur le net
    PLX_PLUGINS est à remplacer par __DIR__ quand on est dans le système de fichiers
    IL serait sympa si on pouvait intégrer cela dans la class plxPlugin.
  • bazooka07 a écrit:
    PLX_PLUGINS est à remplacer par __DIR__ quand on est dans le système de fichiers
    Euh, non. Si tu dois utiliser les urls, utilise plutôt les fonctions de PluXml comme plxMotor::urlRewrite()
  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    Euh non !

    PluXml mélange urls et chemin de fichiers.
    PLX_PLUGINS est un des hacks pour contourner ce problème.
    Quand on regarde le code source généré, on trouve les href ou des src commençant par ../../. Je trouve que cela fait un peu bidouillage.

    plxMotor::urlRewrite() n'est pas une fonction statique, comme par exemple plxUtils::showMessage.
    Il faut, soit déclarer une instance de plxMotor, soit mettre en global $plxMotor ou $plxAdmin, à l'intérieur d'une fonction du plugin.
  • Salut,
    bazooka07 a écrit:
    Je ne comprends pas trop ta remarque.
    basename s'applique à un chemin de fichier.
    Or __CLASS__ ne renvoie que le nom de la class et contient éventuellement l'espace de nom
    L'expérience m'a montré qu'il faut prendre en compte toute éventualité pour éviter les futurs bugs. Maintenant, tu as raison avec basename(), cela ne fonctionne qu'en environnement windows. Une meilleure solution serait ceci :
    [== PHP ==]
    $plug_name = str_replace(__NAMESPACE__ . '\\', '', __CLASS__);
    
    Cordialement.
  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    Apparemment cela n'est pas nécessaire.

    Voir extrait de la doc ci-dessous :
    [== Manuel de PHPi ==]
    __CLASS__ 	Le nom de la classe courante.
    Le nom de la classe contient l'espace de nom dans lequel cette classe a été déclarée (i.e. Foo\Bar).
     Notez que depuis PHP 5.4, __CLASS__ fonctionne aussi dans les traits.
    Lorsqu'elle est utilisée dans une méthode de trait, __CLASS__ est le nom de la classe dans laquelle le trait est utilisé. 
    
    En clair __CLASS__ contient déjà l'espace de nom. Voir exemple : Foo\Bar

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