Constructeur de classe plx:admin et plx:motor

je-evrardje-evrard Member
mai 2015 modifié dans Discussions générales
Bonjour,

Je viens de m'apercevoir de quelquechose d'assez important dans le moteur de pluxml.

la classe plxAdmin étend la classe plxMotor jusque la pas de soucis.
[== Indéfini ==]
class plxAdmin extends plxMotor {

}

Les deux classes possèdent la meme nom de fonction de construction
[== Indéfini ==]
protected function __construct($filename) {
}

La classe plxAdmin fait ceci :
[== Indéfini ==]
protected function __construct($filename) {

		parent::__construct($filename);

		# Hook plugins
		eval($this->plxPlugins->callHook('plxAdminConstruct'));
	}

Et c'est la qu'il y a un truc bizarre. En effet si vous mettez un echo par exemple dans la fonction constructeur du motor vous verrez qu'il est appelé deux fois au lieu de une.

En commentant la ligne on voit que la fonction contruct du moteur est appelé une fois
[== Indéfini ==]
// dans plxAdmin
protected function __construct($filename) {

		// parent::__construct($filename);

		# Hook plugins
		eval($this->plxPlugins->callHook('plxAdminConstruct'));
	}

En attente de vos commentaires. Attention il y a peut-être une raison et je ne suis pas spécialiste des classes étendues.

a+

jéjé

Réponses

  • je-evrardje-evrard Member
    mai 2015 modifié
    A la réflection tout est à cause du getInstance du motor (qui est appelé au départ quand le moteur n'a pas d'instance la première fois). C'est lui qui appel sa propre fonction construct.

    Je pense qu'il faudrait donc commenter la ligne dans l'admin... Si je suis pas claire dites le.
  • Après une mure réflexion il faudrait surement faire ça :
    [== Indéfini ==]
    protected function __construct() {
    		$spxmotor = spxMotor::getInstance();
    		//parent::__construct();
    }
    
    
    
  • mathieumathieu Member
    je viens de tester et de mettre "var_dump("plxMotor::__construct");" dans le constructeur de plxMotor et je ne vois qu'un seul appel dans chaque page
    dans l'espace d'administration c'est plxAdmin qui est construit et dans les pages publiques c'est plxMotor donc pas de problème de mon côté.

    tu as peut-être une extension qui appel plxMotor depuis l'espace d'administration ?
  • je-evrardje-evrard Member
    mai 2015 modifié
    Oui effectivement je suis dans ce contexte. Je cherche une solution pour éviter le doublon.
  • mathieumathieu Member
    ah je viens de comprendre, tu demandais cela pour le développement d'une tes extensions. je pensais que tu avais lancé la discussion pour essayer d'améliorer le cœur de pluXML

    je pense que tu peux utiliser les "hook" pour savoir où tu es. si "AdminPrepend" est appelé, tu es sur une page de l'espace d'administration. et si "Index" est appelé, c'est une page publique
  • je-evrardje-evrard Member
    mai 2015 modifié
    Tout a fait :) merci.
  • Si tu veux que plxAdmin hérite des méthodes de plxMotor, il faut appeler depuis plxAdmin le constructeur du parent (ici plxMotor). Il n'y a rien d'anormal ici.
  • GariGari Member
    Salut,

    Voici une astuce pour pouvoir instancier le moteur sans se soucier de l'endroit où on est (site public = plxMotor et administration = plxAdmin) :
    $plxMotor = class_exists('plxAdmin') ? plxAdmin::getInstance() : plxMotor::getInstance();
    
  • FrancisFrancis Member
    Merci Gari pour l'info, j'ai noté ça dans un coin :)
Connectez-vous ou Inscrivez-vous pour répondre.