oMi- Posted September 27, 2011 Share Posted September 27, 2011 Bonjour à tous, Je viens de me lancer dans la création d'un module et j'ai cru comprendre que le hook postUpdateOrderStatus était appelé APRÈS la mise à jour du statut de la commande en admin. L'appel fonctionne bien mais lorsque je veux faire une simple vérification je m’aperçois qu'il est appelé avant l'update du statut en base de donnée. Voici l’aperçu de mon code : public function hookPostUpdateOrderStatus($params) { $laststateupdated = Db::getInstance()->ExecuteS(' SELECT `id_order_state` FROM '._DB_PREFIX_.'order_history WHERE id_order='.$params['id_order'].' order by date_add DESC LIMIT 0,1'); } $laststateupdated[0]['id_order_state'] me retourne le statut AVANT la modification, alors que qu'un $params['newOrderStatus']->id me retourne bien l'id que je viens de choisir pour mon nouveau statut. Aurais-je mal compris l'utilisation de ce hook ? Si oui comment agir après la réelle mise à jour du statut. Merci d'avance pour votre aide. Version de Prestashop: 1.4.4.1 Nouvelle install Informations sur votre serveur: Linux #1 SMP Mon Sep 20 19:34:25 UTC 2010 i686 Version du logiciel serveur: Apache Version de PHP: 5.2.14 Version de MySQL: 5.1.58 Link to comment Share on other sites More sharing options...
oMi- Posted September 27, 2011 Author Share Posted September 27, 2011 Personne n'a une petite idée sur le sujet s'il vous plait ? Link to comment Share on other sites More sharing options...
Patric Posted September 27, 2011 Share Posted September 27, 2011 Topic déplacé dans la section "Développement". Link to comment Share on other sites More sharing options...
oMi- Posted September 28, 2011 Author Share Posted September 28, 2011 Toujours aucune suggestion s'il vous plait ? Link to comment Share on other sites More sharing options...
oMi- Posted September 29, 2011 Author Share Posted September 29, 2011 Bon j'ai finalement trouvé une solution, un override de la classe OrderHistory.php trouver la ligne 73 : public function changeIdOrderState($new_order_state = NULL, $id_order) remplacer par : public function changeIdOrderState($new_order_state = NULL, $id_order, $autodate = true) puis trouver la ligne 107 / 108 : $order->valid = $newOS->logable; $order->update(); et rajouter en dessous : if (!parent::add($autodate)) return false; Avec cette modification, le hook postUpdateOrderStatus agit bien après la mise a jour du statut en BDD, et donc je pense que le problème est résolu (sauf erreur de ma part). J'espère que les devs prestashop corrigeront ce "bug" pour une futur version. Link to comment Share on other sites More sharing options...
jeckyl Posted July 9, 2012 Share Posted July 9, 2012 Bonjour, je rencontre exactement le même soucis sur une 1.3.7. Je vais re tester votre correction mais cela ne semble pas être la solution pour cette version. quelle version prestashop correspond à votre topic ? Link to comment Share on other sites More sharing options...
jeckyl Posted July 9, 2012 Share Posted July 9, 2012 Je viens de tester sur une 1.4 et maintenant j'ai mon statut qui est doublé. Statut Statut nouveau Statut nouveau Statut c'est étrange Link to comment Share on other sites More sharing options...
oNine Posted July 10, 2012 Share Posted July 10, 2012 Bonjour Jeckyl, j'ai le même résultat que toi, le statut est doublé (toujours après le statut Paiement accepté) et de nouveau le statut paiement en dernier. Cette solution ne fonctionne donc pas du tout pour une 1.4.8.2 Toujours à la recherche de LA solution pour ce problème, les aides seront très appréciées. Merci d'avance. D. Link to comment Share on other sites More sharing options...
jeckyl Posted July 10, 2012 Share Posted July 10, 2012 Il semble qu'il n'existe pas de solution. Donc j'ai contourné le soucis en faisant un cron ce qui n'est pas l'idéal mais permet de pallier le problème. Link to comment Share on other sites More sharing options...
oNine Posted July 10, 2012 Share Posted July 10, 2012 Ok. C'était une solution que je ne voulais pas =) Merci quand même. Si je trouve comment remédier à ça, je posterai ici Link to comment Share on other sites More sharing options...
jeckyl Posted July 10, 2012 Share Posted July 10, 2012 Je précise que c'est un membre de la team qui m'a remonté cela. Et je suis totalement d'accord avec toi ce n'est pas normal en plus c'est un bug remonté la première fois en 2011 lors de la première version de la 1.4 et déjà ils annonçaient une correction pour la 1.5 et pas la 1.4. Link to comment Share on other sites More sharing options...
oNine Posted July 11, 2012 Share Posted July 11, 2012 (edited) Chose promise chose due =) J'ai finalement coder la solution moi-même à l'aide d'override et en m'inspirant de la solution mise en place dans la 1.5 La voici donc pour tous ceux qui souhaite le mettre en place dans la 1.4 Les changements et codes suivant permettent d'avoir le statut "X" (que vous choisirez de mettre dans votre module personnel) directement après le statut 'paiement accepté' lorsque le statut 'paiement accepté' est défini. (C'est dans votre module au niveau de l'appel hookNameNouveauHook(params) que vous choisirez également à partir de quel statut on ajoute le nouveau statut mais attention, vous devez prendre garde car le risque est d'ajouter ce nouveau statut n'importe quand, puisque le hook sera appelé à chaque addWithemail (voir la suite). Cette solution fonctionne donc pour paiement accepté, car il n'y a aucune raison qu'une commande repasse par le statut paiement accepté, à mois de le faire à la main (pas propre ou erreur, ça arrive). Pour les autres statuts réfléchissez bien avant pour utiliser cette méthode. Maintenant que les choses sont posées place à la solution. Il vous faut créer un nouveau hook (base de données et classe hook override) vous le nommez comme bon vous semble pour moi c'était du genre postUpdateOrderStatusXXX où XXX était la raison du besoin que j'avais à faire çà. La requête SQL : INSERT INTO `votreprefixeprestashop_hook` ( `id_hook` , `name` , `title` , `description` , `position` , `live_edit` ) VALUES ( NULL , 'postUpdateOrderStatusXXX', 'Post update of order status for XXX', NULL , '1', '0'); La classe Hook override est comme suit : class Hook extends HookCore { public static function postUpdateOrderStatusXXX($newOrderStatusId, $id_order) { $order = new Order((int)($id_order)); $newOS = new OrderState((int)($newOrderStatusId), $order->id_lang); $return = Module::hookExec('postUpdateOrderStatusXXX', array('newOrderStatus' => $newOS, 'id_order' => (int)($order->id))); return $return; } } Tu override la classe OrderHistory ainsi que la classe Order afin de créer trois nouvelles fonctions : - méthode ajoutée à OrderHistory (n°1): public function addWithemail($new_order_state = NULL, $id_order) Celle-ci n'est pas nouvelle et écrase la fonction addWithemail de base. L'ajout est en fin de méthode, on intègre un appel à notre nouveau hook : Ajouter le code suivant juste avant le "return true" en fin de méthode : Hook::postUpdateOrderStatusXXX((int)($this->id_order_state), (int)($this->id_order)); - méthode ajoutée à OrderHistory (n°2): public function changeIdOrderStateXXX($new_order_state = NULL, $id_order) Cette fonction est identique à changeIdOrderState mais n'intègre pas les appels aux hook updateOrderStatus et postUpdateOrderStatus en début et fin de méthode : l'idée est d'éviter toute boucle d'appel à des hooks puisque le premier appel se fera suite au changement de statut en Paiement accepté. Ceci évite ce qui vous est peut-être arrivé avec certaine solution proposée dans le forum : plusieurs fois le nouveau statut dans l'historique de la commande. - méthode ajoutée à Order: public function setCurrentStateXXX($id_order_state, $id_employee = 0) Cette fonction est identique à setCurrentState mais fait un appel à la méthode définie précédemment changeIdOrderStateXXX, en lieu et place de l'appel à changeIdOrderState. L'idée est d'appeler le nouveau hook pour ajouter son nouveau statut de commande à partir de la méthode addWithemail, on est cette fois sûr que l'appel se fera après le changement de statut, 'Paiement accepté' pour notre cas. Je n'ai pas détaillé l'installation du hook dans votre module personnel ni la défintion de la méthode pour son appel (hookPostUpdateOrderStatusXXX(params)) dans le module également. Je pense que vous êtes tous capable, sinon vous ne chercheriez pas en ce moment à trouver la solution à ce vieux problème de hook pour mettre à jour les statuts. En espérant avoir été le plus clair possible, si ce n'est pas le cas ou que vous avez besoin de précision vous répondez au topic ou me mp directement ! A vous de jouer Edited July 11, 2012 by oNine (see edit history) Link to comment Share on other sites More sharing options...
daquity36 Posted April 22, 2013 Share Posted April 22, 2013 (edited) If anyone wants to change the order status dynamically via PHP, $history = new OrderHistory(); $history->id_order = (int)(3); $history->changeIdOrderState(5,3); //5 is new status. 3 is the order ID whose status you want to change $history->addWithemail(); //THIS added. Otherwise, entries don't get made! Edited April 22, 2013 by daquity36 (see edit history) 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