Jump to content

Créer une surcharge (override)


Recommended Posts

Bonjour,

J'ai installé un PS 1.4 et je tente de comprendre comment fonctionne la bête.

J'ai notamment de grosses difficultés à comprendre comment fonctionne le système de surcharge. J'ai pas mal de modifs à faire dans certains fichiers PHP du core, et je voudrais utiliser cette nouvelle fonction.

Le mieux, c'est un exemple concret : dans PS 1.4, il n'y a toujours pas la possibilité d'ordonner les caractéristiques des produits. Or j'ai besoin que ces caractéristiques apparaissent dans un ordre bien spécifique.

Avant la v1.4, j'avais fais la modif suivante dans /classes/Product.php :

J'avais remplacé ceci...

   public static function getFrontFeaturesStatic($id_lang, $id_product)
   {
       if (!array_key_exists($id_product.'-'.$id_lang, self::$_frontFeaturesCache))
       {
           self::$_frontFeaturesCache[$id_product.'-'.$id_lang] = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
           SELECT name, value, pf.id_feature
           FROM '._DB_PREFIX_.'feature_product pf
           LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.')
           LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.(int)$id_lang.')
           WHERE pf.id_product = '.(int)$id_product);
       }
       return self::$_frontFeaturesCache[$id_product.'-'.$id_lang];
   }



...par cela

   public static function getFrontFeaturesStatic($id_lang, $id_product)
   {
       if (!array_key_exists($id_product.'-'.$id_lang, self::$_frontFeaturesCache))
       {
           self::$_frontFeaturesCache[$id_product.'-'.$id_lang] = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
           SELECT name, value, pf.id_feature
           FROM '._DB_PREFIX_.'feature_product pf
           LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.')
           LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.(int)$id_lang.')
           WHERE pf.id_product = '.(int)$id_product.' ORDER BY name');

           $resultsArray = array();
           $result = self::$_frontFeaturesCache[$id_product.'-'.$id_lang];
           foreach ($result AS $row)
           {
               $row['name'] = product::hideFeaturePosition($row['name']);
               $resultsArray[] = $row;
           }
       }
       return $resultsArray;
   }


   static public function hideFeaturePosition($name)
   {
       return preg_replace('/^[0-9]+\./', '', $name);
   }



Dans le BO, j'ajoute donc un numéro avant chaque caractéristique.
La fonction transformée getFrontFeaturesStatic me permet ensuite de les ordonner par nom (donc par numéro).
La fonction ajoutée hideFeaturePosition permet ensuite de cacher ces numéros dans le FO


Ma question est donc : comment faire exactement la même chose (remplacer une fonction + ajouter une fonction dans un fichier PHP) à l'aide des surcharges ?

Merci d'avance pour vos explications !

Link to comment
Share on other sites

Bonjour, suffit de créer un fichier override/classes/Product.php et d'y mettre:

class Product extends ProductCore
{
public static function getFrontFeaturesStatic($id_lang, $id_product)
   {

    ...

   }


   static public function hideFeaturePosition($name)
   {
       return preg_replace('/^[0-9]+\./', '', $name);
   }
}

Link to comment
Share on other sites

Merci pour ta réponse !

Je viens de tester.
Résultat bizarre...

Les caractéristiques sont bien ordonnées, mais on voit s'afficher les numéros.
J'ai donc :
10.caract1
20.caract2
30.caract3
etc...

Donc, j'ai voulu tester en plaçant ces 2 mêmes fonctions directement dans /classes/Product.php (à l'ancienne ;-) )
Et là, surprise ! On ne voit plus les numéros et tout est ordonné.

Donc, il y a une différence, et pourtant c'est le même code.
Y-a-t-il une explication ? Quelque chose à modifier ?

Merci pour ton aide et ton temps !

Link to comment
Share on other sites

Je suis pas sûr mais ,dans cette partie là , dans ta classe surchargée :

            foreach ($result AS $row)
           {
               $row['name'] = product::hideFeaturePosition($row['name']);
               $resultsArray[] = $row;
           }



on ne devrait pas plutôt avoir :

$row['name'] = self::hideFeaturePosition($row['name']);




?

Link to comment
Share on other sites

En theorie oui , et même dans la pratique lors de mes propres tests , mais sur d'autres surcharges.

Les erreurs que l'on peut commettre lors d'une surcharge sont quasiment toujours des appels parent:: manquants ou des choses de ce type, genre appel du parent au lieu de la classe dérivée , accès à des champs protegés de la classe parent....

Link to comment
Share on other sites

Bon, ça fait 3 heures que je tente des variantes dans tous les sens, mais rien n'y fait.

Ces 2 fonctions marchent parfaitement quand je modifie /classes/Products.php directement, mais ne fonctionnent plus quand je les mets dans /overrides/classes/Product.php

Un vrai mystère...

C'est bête, parce que du coup, je comprends encore moins bien ce système de surcharges.

Ce serait vraiment sympa si quelqu'un pouvait faire quelques tests afin de trouver le "pourquoi".

En plus, je suis sur que ça va aider pas mal de monde derrière.
On pourra ouvrir un topic "Les erreurs à ne pas commettre" ;-)

Merci à coeos et broceliande qui ont déjà prit du temps pour creuser un peu le problème.

Link to comment
Share on other sites

Pas bête le coeos !

J'ai donc tout mis et... ça fonctionne !

J'en déduis donc qu'il manque une ou plusieurs fonctions à intégrer aussi dans mon /overrides/classes/Product.php

Après quelques minutes de tatonage, j'ai trouvé.
Il s'agit de la fonction :

public function getFrontFeatures($id_lang)
   {
       return self::getFrontFeaturesStatic($id_lang, $this->id);
   }



Une fois cette fonction intégrée dans l'override, tout fonctionne !

Donc, déjà, MERCI !

Maintenant, ce serait intéressant de comprendre le pourquoi.
Mais c'est déjà une très bonne piste pour nos futurs problèmes : quand ça marche pas, essayer de mettre tout le fichier concerné dans l'override, juste pour faire un test.
Si en faisant cela, ça marche, alors il y a une ou plusieurs fonctions à intégrer en plus pour que ça fonctionne.
Je sais, c'est pas du langage de dev super technique, mais ça aura le mérite d'être clair pour tout ceux qui ne cassent pas des briques en PHP (comme moi !)

Link to comment
Share on other sites

  • 4 months later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...