We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 20394
    • 134 Posts
    Bonjour,

    le code de ce post a subi quelques corrections depuis le début tongue

    en attendant ModX 0.9.5, nous pouvons être tenté d’insérer les nouvelles API proposées dans les forums à la classe DocumentParser (qui est la classe de la variable $modx).
    Une méthode pour ne pas tout perdre lors de la prochaine mise à jour (qui ne saurait tarder wink) est de mettre toutes ses nouvelles fonctions dans le répertoire assets et de faire un include à l’intérieur de la classe DocumentParser.
    Mais lorsque l’on veut modifier le comportement par défaut d’une fonction, bien souvent, on modifie directement son code ce qui le rend difficile à maintenir.

    Je pense pouvoir proposer une solution avec php5. Je crée une classe MyDocumentParser. Celle-ci fera référence à la variable globale $modx (oui ce n’est pas terrible mais je pense être obligé d’utiliser cette variable), elle implémente de nouvelles fonctions ou en redéfinit des anciennes. Pour pouvoir l’utiliser comme la variable $modx, j’utilise les fonctions magiques __call(), __set() et __get() :
    class MyDocumentParser{
    
    //placez ici définition des nouvelles variables
    //placez ici l'implémentation des nouvelles fonctions
    //placez ici la réimplémentation des anciennes fonctions
    public function __call($name, $arguments){
    global $modx;
    if(count(arguments==1)) return $modx->$name($arguments[0]);
    else return $modx->$name($arguments);
    }
    public function __set($var, $value){
    global $modx;
    $modx->$var=$value;
    }
    public function __get($var){
    global $modx;
    return $modx->$var;
    }
    
    }
    

    puis on crée l’objet :
    $modx2=new MyDocumentParser();
    

    et l’on a accès a toute l’API de modx sur $modx2.
    Si vous voulez utiliser les anciennes implémentations des fonctions, vous utilisez $modx, sinon vous utilisez $modx2.
      • 20394
      • 134 Posts
      Le problème avec le code présenté plus haut est que les fonctions appellent obligatoirement les fonctions de $modx et pas de $modx2.
      Une solution serait d’avoir l’implémentation de la méthode singleton pour $modx, singleton que l’on récupérerait dans les fonctions __set(), __call() et __get().

      Mais j’ai l’impression que cela ne marcherait pas non plus.
        • 18219
        • 826 Posts
        Oui interressant.

        Tu peux aussi créer modx2 comme étant une classe étendue de modx et dans ce cas tu profite à la fois de l’objet modx et donc de tous les fonctions et applications existantes + des fonctions nouvelles que tu incorporent dans modx2 (ton propre API)
          Marc
          I'm French... Sorry for my bad English, I use ' Google Translator' or other... but that remains that tools wink
          • 20394
          • 134 Posts
          Tu peux aussi créer modx2 comme étant une classe étendue de modx
          En effet, cependant dans ce cas les variables de l’objet $modx sont dupliquées et lorqu’on les modifie dans $modx2 les modifications ne sont pas répercutées dans $modx. Par exemple $modx->placeHolders et $modx2->placeHolders sont deux tableaux distincts, ce qui n’est pas le cas en définissant une classe qui utilise la variable globale $modx.
          De plus c’est la variable $modx qui est utilisée pour l’affichage final de la page. Ainsi si l’on utilise $modx2 lors d’un plugin pour modifier disons $modx2->documentOject[’content’], cela ne sera pas répercuté dans $modx et donc dans le rendu final avec la classe étendue, mais le sera avec la solution présentée dans le premier post.


          Sinon l’intérêt d’étendre la classe est que cela fonctionne avec php4 et les contraintes sont tout de même faibles en ce qui concerne les snippets (on a souvent besoin de récupérer la valeur des variables de $modx, rarement besoin de les modifier).