PluXml.org

Blog ou CMS à l'Xml

Vous n'êtes pas identifié(e).

#1 18/08/2017 16:12:45

je-evrard
Pluxml Staff
Lieu : pau
Inscription : 08/05/2012
Messages : 1 128
Site Web

initialisation plugin via variable de plxMotor

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

  • 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


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é

Dernière modification par je-evrard (18/08/2017 16:13:25)


Petit à petit l'oiseau fait son nid.
- Sites : Création web - Création artistique
- pluxml : Plugins - Simplebox - Visual Wizard
- Projet SPX : Vitrine - Blog
facebook

Hors ligne

#2 18/08/2017 17:20:05

bazooka07
Membre
Lieu : Quelque part en Rhône-Alpes
Inscription : 06/02/2014
Messages : 754
Site Web

Re : initialisation plugin via variable de plxMotor

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.

Hors ligne

#3 18/08/2017 21:03:10

memento
Membre
Inscription : 09/11/2008
Messages : 63

Re : initialisation plugin via variable de plxMotor

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.

Hors ligne

#4 21/08/2017 09:31:29

je-evrard
Pluxml Staff
Lieu : pau
Inscription : 08/05/2012
Messages : 1 128
Site Web

Re : initialisation plugin via variable de plxMotor

Merci pour vos retours, je vais regarder ça.

++

jéjé


Petit à petit l'oiseau fait son nid.
- Sites : Création web - Création artistique
- pluxml : Plugins - Simplebox - Visual Wizard
- Projet SPX : Vitrine - Blog
facebook

Hors ligne

#5 21/08/2017 09:44:03

je-evrard
Pluxml Staff
Lieu : pau
Inscription : 08/05/2012
Messages : 1 128
Site Web

Re : initialisation plugin via variable de plxMotor

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.

Dernière modification par je-evrard (21/08/2017 09:44:51)


Petit à petit l'oiseau fait son nid.
- Sites : Création web - Création artistique
- pluxml : Plugins - Simplebox - Visual Wizard
- Projet SPX : Vitrine - Blog
facebook

Hors ligne

#6 21/08/2017 10:55:01

bazooka07
Membre
Lieu : Quelque part en Rhône-Alpes
Inscription : 06/02/2014
Messages : 754
Site Web

Re : initialisation plugin via variable de plxMotor

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__.'/'

Hors ligne

#7 21/08/2017 21:31:44

memento
Membre
Inscription : 09/11/2008
Messages : 63

Re : initialisation plugin via variable de plxMotor

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

Hors ligne

#8 21/08/2017 22:46:27

bazooka07
Membre
Lieu : Quelque part en Rhône-Alpes
Inscription : 06/02/2014
Messages : 754
Site Web

Re : initialisation plugin via variable de plxMotor

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  devil ( Très courant sur Internet comme chacun sait big_smile )

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.

Hors ligne

#9 22/08/2017 13:59:52

Jerry Wham
Membre
Inscription : 13/07/2011
Messages : 2 526
Site Web

Re : initialisation plugin via variable de plxMotor

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()


Mangez un castor, vous sauverez un arbre !

J'ai la tête dans le  ...code

Hors ligne

#10 22/08/2017 16:32:53

bazooka07
Membre
Lieu : Quelque part en Rhône-Alpes
Inscription : 06/02/2014
Messages : 754
Site Web

Re : initialisation plugin via variable de plxMotor

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.

Hors ligne

#11 22/08/2017 17:18:19

memento
Membre
Inscription : 09/11/2008
Messages : 63

Re : initialisation plugin via variable de plxMotor

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.

Hors ligne

#12 22/08/2017 18:57:36

bazooka07
Membre
Lieu : Quelque part en Rhône-Alpes
Inscription : 06/02/2014
Messages : 754
Site Web

Re : initialisation plugin via variable de plxMotor

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

Hors ligne

Pied de page des forums

A propos Nous soutenir Contact Twitter Google+
Copyright © 2006-2017 PluXml.org, tous droits réservés