Problème sur Order API

  • Posts: 134
  • Thank you received: 4
  • Hikashop Business
4 years 3 days ago #326249

-- HikaShop version -- : 4.4.0
-- Joomla version -- : 3.9.22
-- PHP version -- : 7.3

Bonjour,

Je chercher à développer un plugin simple qui va lancer un process à la création d'une commande.

Pour réaliser mes tests j'ai fait un plugin test qui se lance sur function onAfterOrderUpdate(&$order,&$send_email), premier problème concernant cette fonction, elle ne s'exécute que lors du passe en passage en statut "annulé" tous les autres statut ne déclenchent pas ?

Le but étant finalement de l'exécuter avec onAfterOrderCreate(&$order,&$send_email) ou onAfterOrderConfirm(&$order,&$methods,$method_id) pour ne lancer qu'a la création de la commande via le frontoffice, mais ca ne s'exécute pas non plus.

Je passe surement à coté d'un truc, si qqun a une idée ?

Le plugin est installé, ci-dessous le code

<?php
defined('_JEXEC') or die('Restricted access');
?><?php
class plgHikashopCncPlgCmd extends JPlugin
{

    function onAfterOrderUpdate(&$order,&$send_email) {

        $orderClass= hikashop_get('class.order');
        $orderInDB = $orderClass->loadFullOrder($order->order_id);

        $db = JFactory::getDBO();

        foreach($order->products as $product) {

            $productClass = hikashop_get('class.product');
            $productData = $productClass->get($product->product_id);
            //test echo $orderInDB->order_number;echo "--";
            //test echo $productData->product_weight;
            //test echo $productData->description;
            //test var_dump($productData);

            //test echo $orderInDB->order_full_price;

            $db->setQuery("INSERT INTO `cc_hikashop_order_ebp` (`order_id`, `order_full_price`, `nom`) VALUES ('".$orderInDB->order_number."', '".$orderInDB->order_full_price."', '".$productData->product_name."');");
            $db->execute();

        }

    }

}


Merci d'avance.

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

  • Posts: 82865
  • Thank you received: 13373
  • MODERATOR
4 years 2 days ago #326272

Bonjour,

Non, n'importe quel changement de statut de commande va appeler les fonctions onAfterOrderUpdate des plugins du groupe hikashop et system.
Donc pour moi c'est un soucis avec votre plugin.
Mais avec juste le code fourni je ne vois pas de soucis.
Peut être est-ce lié au nom de votre class plgHikashopCncPlgCmd et ce qu'il y a dans le XML du plugin.
Pourriez-vous fournir une cpoie du XML ?

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

  • Posts: 134
  • Thank you received: 4
  • Hikashop Business
4 years 2 days ago #326276

Bonjour Nicolas,

Oui surtout que le bout de code fonctionne, mais uniquement en passant d'un statut lambda vers annulé. Test refait à l'instant avec ce plugin passage de annulé à confirmer : rien, repassage de confirmer à annuler : remplissage de la base.

Je suis repartit d'une copie du plugin history à la base.

ci-joint le xml

<?xml version="1.0" encoding="utf-8"?>
<extension type="plugin" version="2.5" method="upgrade" group="hikashop">
    <name>Hikashop Clicetcom Plugin</name>
    <creationDate>22 octobre 2020</creationDate>
    <version>4.4.0</version>
    <author>clicetcom</author>
    <authorEmail>dev@hikashop.com</authorEmail>
    <authorUrl>http://www.hikashop.com</authorUrl>
    <copyright>(C) 2010-2020 HIKARI SOFTWARE. All rights reserved.</copyright>
    <license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
    <description>Plug test</description>
    <files>
        <filename plugin="cncplgcmd">cncplgcmd.php</filename>
    </files>

</extension>

et le plugin
<?php
/**
 * @package	HikaShop for Joomla!
 * @version	4.4.0
 * @author	hikashop.com
 * @copyright	(C) 2010-2020 HIKARI SOFTWARE. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><?php
class plgHikashopCncPlgCmd extends JPlugin
{

    function onAfterOrderUpdate(&$order,&$send_email) {

        $orderClass= hikashop_get('class.order');
        $orderInDB = $orderClass->loadFullOrder($order->order_id);

        $db = JFactory::getDBO();

        foreach($order->products as $product) {

            $productClass = hikashop_get('class.product');
            $productData = $productClass->get($product->product_id);
            //test echo $orderInDB->order_number;echo "--";
            //test echo $productData->product_weight;
            //test echo $productData->description;
            //test var_dump($productData);

            //test echo $orderInDB->order_full_price;

            $db->setQuery("INSERT INTO `cc_hikashop_order_ebp` (`order_id`, `order_full_price`, `nom`) VALUES ('".$orderInDB->order_number."', '".$orderInDB->order_full_price."', '".$productData->product_name."');");
            $db->execute();

        }




    }

}

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

  • Posts: 82865
  • Thank you received: 13373
  • MODERATOR
4 years 2 days ago #326288

Bonjour,

Je pense que le soucis vient bien du nom de la class de votre plugin.
D'après votre XML, le nom devrait être plgHikashopCncplgcmd et non plgHikashopCncPlgCmd

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

  • Posts: 134
  • Thank you received: 4
  • Hikashop Business
4 years 2 days ago #326306

Merci pour votre retour Nicolas, j'ai changé le nom de classe comme indiqué mais cela ne change rien au comportement.

J'ai désinstallé le plugin, réinstallé. Le plugin de s'exécute que lors du passage en statut 'annulé', je suis perplexe... s'il ne s'exécutait jamais je chercherais l'erreur ailleurs, mais la, il fonctionne bien en passage au statut annulé. je ne comprend même pas comment le trigger onAfterOrderUpdate ne peut se lancer que dans ce cas.

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

  • Posts: 82865
  • Thank you received: 13373
  • MODERATOR
4 years 1 day ago #326312

Peut être que le soucis vient de la manière dont vous faite vos tests ?
Comment changez vous le statut de la commande ?
Comment vérifiez vous que le plugin est appelé ?

Le mieux c'est d'ajouter la ligne:
hikashop_writeToLog('du statut '.$order->old->order_status.' au statut '.@$order->order_status);
au début de votre fonction onAfterOrderUpdate
Cela va ajouter une ligne au fichier de log de paiement d'Hikashop (disponible dans la section "fichiers" de la configuration).
Ainsi, vous pourrez facilement voir si le plugin est appelé ou non, peu importe comment vous faites vos tests, en vérifiant le contenu du fichier de log après le test.

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

  • Posts: 134
  • Thank you received: 4
  • Hikashop Business
4 years 1 day ago #326340

Bonjour Nicolas,

Merci pour l'astuce du log, ca me confirme mon incompréhension du pb.

Je réalisais mes tests avec une requête d'insert dans ma base et j'en contrôle le remplissage après chaque exécution. Je réalise le changement de statut via le listing de commande dans le backoffice.

J'ai donc intégré

hikashop_writeToLog('du statut '.$order->old->order_status.' au statut '.@$order->order_status);

En début de fonction et un autre dans ma boucle foreach et je constate qu'en fait, ma boucle ne s'exécute que lors du passage en statut cancel, ce que je ne comprend pas à vrai dire.

Ci-joint le résultat du log, pour le passage d'une commande avec 2 articles de refounded à confirmed puis a cancel puis à confirmed

11.24.20 08:53:31
du statut refunded au statut confirmed
11.24.20 08:55:32
du statut confirmed au statut cancelled
11.24.20 08:55:32
du statut confirmed au statut cancelled
11.24.20 08:55:32
du statut confirmed au statut cancelled
11.24.20 08:56:36
du statut cancelled au statut confirmed

Voyez-vous une raison pour que la trigger n'exécute la boucle que lors du passage en cancel?

Je vous remet en joint l'exact code en place pour ce test, on ne peut plus simple du coup il me semble.
<?php
/**
 * @package	HikaShop for Joomla!
 * @version	4.4.0
 * @author	hikashop.com
 * @copyright	(C) 2010-2020 HIKARI SOFTWARE. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><?php
class plgHikashopCncplgcmd extends JPlugin
{

    function onAfterOrderUpdate(&$order,&$send_email) {

        hikashop_writeToLog('du statut '.$order->old->order_status.' au statut '.@$order->order_status);


        foreach($order->products as $product) {

            hikashop_writeToLog('du statut '.$order->old->order_status.' au statut '.@$order->order_status);


        }
        

    }

}

Merci par avance.

Last edit: 4 years 1 day ago by clicetcom.

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

  • Posts: 82865
  • Thank you received: 13373
  • MODERATOR
4 years 1 day ago #326343

Bonjour,

Ah oui, je comprends le soucis.
Vous utilisez $order->products
Mais dans $order vous avez juste l'id de la commande et les informations de la commande qui sont changés.
Le code

$orderClass= hikashop_get('class.order');
        $orderInDB = $orderClass->loadFullOrder($order->order_id);
était donc une bonne idée pour charger toutes les infos de la commande, mais il fallait aussi utiliser $orderInDB->products au lieu de $order->products

The following user(s) said Thank You: clicetcom

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

  • Posts: 134
  • Thank you received: 4
  • Hikashop Business
3 years 11 months ago #326505

Ha mais oui !

Merci bcp Nicolas !

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

Time to create page: 0.050 seconds
Powered by Kunena Forum