Bonjour,
Ce n'est pas possible, à ma connaissance, avec le fonctionnement normal d'HikaShop.
Si vous cherchez onBeforeOrderProductsUpdate dans les fichiers d'HikaShop, il n'y a qu'un seul endroit, dans le fichier administrator/components/com_hikashop/classes/order.php
Voici le code en question:
$recalculate = false;
$recalculate_dimensions = false;
if(!empty($order->product)) {
$do = true;
$app->triggerEvent('onBeforeOrderProductsUpdate', array(&$order, &$do) );
if(!$do)
return false;
$orderProductClass = hikashop_get('class.order_product');
if(is_array($order->product)) {
foreach($order->product as &$product) {
$orderProductClass->update($product);
}
unset($product);
} else {
$orderProductClass->update($order->product);
}
$recalculate = true;
$recalculate_dimensions = true;
}
Le process de if(!empty($order->product)) est effectué lorsqu'un produit est modifié via l'interface du backend d'HikaShop. Dans la fonction "saveForm" du même fichier, vous avez toute la gestion de la sauvegarde des modifications d'une commande, et après la ligne:
$currentTask = 'products';
vous avez la gestion pour les modifications des produits. Vous pouvez voir par exemple la ligne:
$order->product = array( $product );
qui va remplir cette variable pour la mise à jour d'un produit d'une commande.
Et pour revenir au code au dessus, vous pouvez voir que l'évènement onBeforeOrderProductsUpdate est appelé avant l'appel à $orderProductClass->update() qui va faire la modification de la quantité dans order_product.
Donc, ce que tout cela indique, c'est que le processus que vous étudiez n'est surement pas le processus de mise à jour d'un produit via l'interface normale du backend d'HikaShop. Vous devez avoir du code qui appel $orderProductClass->update() avant, ensuite, d'appeler $orderClass->save() et, par chance, $order->product est rempli, et cela passe dans ce code qui va appeler onBeforeOrderProductsUpdate, et à nouveau faire un appel (inutile) à $orderProductClass->update(). Et alors oui, dans ce cas, les données en base de données seront déjà mises à jour.
Bref, dans ce genre de cas, vous voulez rajouter cette ligne :
var_dump(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS));
Cela va vous afficher le call stack et vous verrez que votre code vient de save de class.order, et que ce save ne vient pas de saveForm de class.order mais d'ailleurs, et c'est à cet endroit qu'est le problème. En tout cas c'est ma théorie avec les éléments que vous avez fourni.