Odjavel Posted March 19, 2011 Share Posted March 19, 2011 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 FOMa 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 More sharing options...
coeos.pro Posted March 19, 2011 Share Posted March 19, 2011 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 More sharing options...
Odjavel Posted March 19, 2011 Author Share Posted March 19, 2011 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.caract120.caract230.caract3etc...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 More sharing options...
Broceliande Posted March 19, 2011 Share Posted March 19, 2011 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 More sharing options...
Odjavel Posted March 19, 2011 Author Share Posted March 19, 2011 Non, ça ne change rien.Bizarre quand même. D'une manière ou d'une autre, c'est supposé réagir de la même façon, non ? Link to comment Share on other sites More sharing options...
Broceliande Posted March 20, 2011 Share Posted March 20, 2011 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 More sharing options...
Odjavel Posted March 20, 2011 Author Share Posted March 20, 2011 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.phpUn 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 More sharing options...
coeos.pro Posted March 20, 2011 Share Posted March 20, 2011 Dans ton override, tu n'as que les 2 fonctions ? essaye de tout mettre pour voir Link to comment Share on other sites More sharing options...
Odjavel Posted March 20, 2011 Author Share Posted March 20, 2011 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.phpAprè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 More sharing options...
amerigeau Posted August 16, 2011 Share Posted August 16, 2011 Bonjour à tous, Je suis sur le problème et j'avoue que cela n'est pas forcément évident à effectuer comme manipulation. L'équipe Prestashop devrait intégrer cette fonction dans les prochaines versions Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now