renaud2263 Posted June 8, 2018 Share Posted June 8, 2018 Bonjour à tous, j'ai ajouté un champ à la table produit, le champ "fragile". J'ai overridé la classe : class Product extends ProductCore{ public $fragile; public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, \Context $context = null) { Product::$definition['fields']['fragile'] = array('type' => self::TYPE_BOOL,'required' => false, 'size' => 1); parent::__construct($id_product, $full, $id_lang, $id_shop, $context); } } Dans un de mes modules qui modifie les produits en masse, je passe un produit à fragile = 1. Dans la table, c'est OK, la modif se fait bien. Mais là où je comprends pas c'est que si j'appelle la classe après le update de la table, je n'ai pas la modif. Db::getInstance()->execute('update ps_product SET fragile = 1 WHERE id_prodict = 1200') // la table est modifiée $prod = new Product(1200); echo $prod->fragile; // Et là ça donne 0 Qu'est ce que j'ai raté ? Link to comment Share on other sites More sharing options...
doekia Posted June 9, 2018 Share Posted June 9, 2018 id_prodict Link to comment Share on other sites More sharing options...
renaud2263 Posted June 9, 2018 Author Share Posted June 9, 2018 Merci, mais non: c'est juste une faute de frappe ici. Ma BDD se met bien à jour par la requête. Link to comment Share on other sites More sharing options...
doekia Posted June 9, 2018 Share Posted June 9, 2018 Et ton champ, il est dans la field definition de l'object model? Sinon, évidement PrestaShop n'est pas au courant de ce dernier et ne le ramène pas Link to comment Share on other sites More sharing options...
renaud2263 Posted June 9, 2018 Author Share Posted June 9, 2018 Oui c'est bien le cas. Si sur une page de test, je fais $prod = new Product(1200); echo $prod->fragile Ca me le retourne bien. Mon problème se situe au niveau d'un module d'édition de masse de produits. Si je modifie le param fragile, j'ai bien la requête update mais si je test new Product tout de suite après le execute->requete, mon fragile n'a pas changé (alors que le champ a bien changé dans la table). Truc de ouf. Link to comment Share on other sites More sharing options...
doekia Posted June 9, 2018 Share Posted June 9, 2018 Possible, cache sql mais j'ai de sérieux doutes car ce même fonctionnement existe nativement dans prestashop (validateOrder par exemple) et n'a jamais posé de soucis. Tu es absolument certain que la bdd est à jour ? Tu n'as ce champ que dans ps_product, pas aussi dans ps_product_shop ? Tu as vérifié avec le mode debug que tu n'as pas une erreur SQL ? Tu n'as pas dans le contructeur de ton Product un code qui reset fragile à une valeur 0 ? Link to comment Share on other sites More sharing options...
renaud2263 Posted June 11, 2018 Author Share Posted June 11, 2018 Merci de t'être penché sur ma question, Doekia. Je vais encore vérifier mais après plusieurs tests, j'ai l'impression que mon override de la classe Product ne fonctionne pas sur ma version 1.7.1.2 alors que sur une autre de mes boutiques (version 1.7.2.4) l'override fonctionne très bien. Ce serait quand même l'hallu... Link to comment Share on other sites More sharing options...
renaud2263 Posted June 11, 2018 Author Share Posted June 11, 2018 Bon, je confirme. Question de version et d'override. Par contre j'ai quand même un problème de séquence. Fonction myUpdate du module A public function myUpdate($id_product){ //traitements et mise à jour de la table product via requête update. C'est OK et vérifié $Product = new Product($id_product); //Appel du hook Hook::exec('actionProductUpdate', array('id_product' => (int)$id_product, 'product' => $Product)); } Dans un module B, la fonction hookActionProductUpdate normalement appelée par la fonction ci-dessus. public function hookActionProductUpdate($params){ $id_product = $params['id_product']; echo $params->fragile; } Et le résultat est 0 quand j'ai passé fragile à 1 et 1 quand je l'ai passé à 0. Il y a un décalage entre le exec du module A et l'exécution du hook dans le B. Donc ma question: entre le Hook::exec du module A et le hook du module B, que se passe-t-il ? Le exec est-il mal formulé ? Y-a-t-il un problème de position des hooks ? Je sèche... Link to comment Share on other sites More sharing options...
doekia Posted June 11, 2018 Share Posted June 11, 2018 Oui la position des hooks importe. Je lis ton code là tel qu'il est est j'espère que c'est parce que tu en as raccourci les traitements, sinon ce que je lis n'a aucun sens Pourquoi faire 2 modules qui sont visiblement complémentaires Et tu ne peux pas relancer un hook au sein de ce même hook, c'est une boucle infinie. Link to comment Share on other sites More sharing options...
renaud2263 Posted June 11, 2018 Author Share Posted June 11, 2018 Oui, tout est raccourci ici. Le module A est une édition rapide de masse qui me permet de modifier des paramètres produits par simple clic sur des coches, genre fragile O/N. Le module B crée un fichier csv transmis via FTP à ma plateforme logistique dès qu'il y a une modif produit (ou une créa). Il fonctionne principalement avec la fiche produit classique mais je veux aussi qu'il joue avec le module d'édition rapide. Link to comment Share on other sites More sharing options...
doekia Posted June 11, 2018 Share Posted June 11, 2018 Je ne comprends pas, tu veux de l'aide, tu montre du code et ce code n'a aucun sens Comment pourrions nous t'aider ? public function hookActionProductUpdate($params){ $id_product = $params['id_product']; echo $params->fragile; } Il sort de quel chapeau ce params ? si c'est celui passé à la fonction, c'est un tableau, tu ne peux pas l'interroger comme un objet Fait toi une fleur, commence par activer tous les debug possible, passe ton code dans lint, ne fait pas des echo dans un hook non display (d'ailleurs ne jamais faire d'écho, c'est le meilleur moyen de ne rien comprendre. utilise xdebug, et les directives p() ça va te faire gagner un temps fou pour enlever les bugs de ton code avant de chercher si le bug n'est pas ailleurs. Link to comment Share on other sites More sharing options...
renaud2263 Posted June 11, 2018 Author Share Posted June 11, 2018 Woaw ! Tu décoiffes ! En fait ce n'est pas ça qui compte. C'est une manière de dire que le paramètre "fragile" que je récupère n'est pas celui qui vient d'être transmis par le exec. Je ne fais pas un "echo", j'ai fait un fwrite d'un fichier témoin dans lequel j'affiche le print_r du tableau. J'aurais pu écrire, et c'est vrai que c'eût été plus juste $params['product']->fragile Je peux difficilement activer le debug car le site est en exploitation et tourne à plein régime. Je voudrais seulement comprendre pourquoi lorsque j'appelle le hook avec exec et APRES avoir update la table, le tableau new Product() qui est envoyé dans params n'est pas le reflet de ce qui vient d'être modifié. Toutes mes excuses pour m'être mal exprimé. Link to comment Share on other sites More sharing options...
renaud2263 Posted June 12, 2018 Author Share Posted June 12, 2018 Je fais ce simple test, sur une page à part, qui explique que mon hook::exec échoue...bien que je ne comprenne toujours pas pourquoi: //Début du test: fragile vaut 0 pour ce produit dans la table $id_product = 2212; Db::getInstance()->execute("update ps_product SET fragile=1 WHERE id_product=".$id_product); $prod = new Product($id_product); echo "fragile : " . $prod->fragile; //affiche 0 alors que le champ BDD vaut 1 la requête ayant bien été exécutée. Donc quand je charge la classe après l'update la donnée n'est pas à jour alors que la table oui. Pourquoi ? Cache SQL ? Je ne sais plus où chercher... Link to comment Share on other sites More sharing options...
doekia Posted June 12, 2018 Share Posted June 12, 2018 Oui mais, tu t'efforces d'éviter le framework à moitié, or ce dernier contient moult cache (misère), notamment dans product properties, donc code comme tu le devrait en mettant ta propriété dans l'ObjectModel puis $p->fragile = 1; $p->save(); $p = new Product(xx); au demeurant inutile ou code tout en dehors du framework: Db::execute(update) et Db::executeS(select) 1 Link to comment Share on other sites More sharing options...
renaud2263 Posted June 12, 2018 Author Share Posted June 12, 2018 Effectivement. Merci beaucoup, vraiment. Très sympa. Il fallait effectivement utiliser les méthodes fournies... Bonne soirée. PS: je ne vois pas d'option pour mettre ce post en résolu. 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