Jump to content

[Résolu] hook postUpdateOrderStatus avant ou après ?


oMi-

Recommended Posts

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

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

  • 9 months later...

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

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

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

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 by oNine (see edit history)
Link to comment
Share on other sites

  • 9 months later...

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 by daquity36 (see edit history)
Link to comment
Share on other sites

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...