Capture modifications de produits de commande

  • Posts: 503
  • Thank you received: 36
  • Hikaserial Subscription Hikashop Business
6 days 5 hours ago #368781

Bonjour,

petite question, à quel moment puis-je capturer l'état des produits de commande avant modification ?
si par exemple, dans l'admin, on modifie la quantité d'un produit de commande, je cherche à détecter tout changement pour les logs, emails et admins

J'ai tenté une capture avec onBeforeOrderUpdate ,puis onBeforeOrderProductsUpdate, malheureusement à chaque fois la valeur des products est la nouvelle, et products n'est pas dans old pour avoir l'ancienne

Je cherche à capturer l'ancienne valeur, de quantité, ou même de prix, a quel moment est-ce possible ?

Merci d'avance

Please Log in or Create an account to join the conversation.

  • Posts: 84441
  • Thank you received: 13738
  • MODERATOR
6 days 2 hours ago #368784

Bonjour,

Ce sont les bons évènements. En effet, le "old" n'est pas fourni pour les produits des commandes. Cependant, vous pouvez faire une requête MySQL sur la table order_product en utilisant le order_product_id pour avoir les données avant modification.

Please Log in or Create an account to join the conversation.

  • Posts: 503
  • Thank you received: 36
  • Hikaserial Subscription Hikashop Business
5 days 9 hours ago #368807

Bonjour,

merci pour votre réponse, en fait, c'est exactement ce que j'ai fait, mais

    public function onBeforeOrderProductsUpdate(&$order, &$do)
    {

        $db = Factory::getDbo();
        $query = 'SELECT * FROM `#__hikashop_order_product` 
	        WHERE `order_id` = ' . $db->quote($order->order_id);
        $db->setQuery($query);
        $results = $db->loadObjectList();
        echo '<pre>onBeforeOrderProductsUpdate<br>';
        var_dump($results);
        echo '</pre>';
        exit;
me renvoie la valeur déjà modifiée de order_product_quantity, order_product_price ou tout autre champ que je cherche à capturer, je ne comprends pas, j'avais même basé tout le reste de mon code sans vérifier cette donnée qui semblait tellement logique, c'est seulement au débogage que j'ai remonté la piste jusqu'à cette source improbable

j'avais au début utilisé onBeforeOrderUpdate, en découvrant le souci j'e suis partie à la recherche d'une source en amont dans le code, c'est là que j'ai trouvé onBeforeOrderProductsUpdate que je ne connaissais pas (elle n'est pas dans la doc ), qui m'a semblé être la bonne selon la logique du code observé autour, et pourtant

Last edit: 5 days 9 hours ago by Minie.

Please Log in or Create an account to join the conversation.

  • Posts: 84441
  • Thank you received: 13738
  • MODERATOR
5 days 4 hours ago #368816

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.

Please Log in or Create an account to join the conversation.

Time to create page: 0.060 seconds
Powered by Kunena Forum