2017-09-29 4 views
0

Je travaille sur mon mode de paiement personnalisé pour opencart. Ce dont j'ai besoin, c'est d'écouter les changements de l'historique des commandes qui ont changé d'admin par le manager. Tout allait bien, mais je ne pouvais pas faire déclencher l'événement opencart à travailler, peu importe ce que je fais.Opencart Les événements addOrderHistory ne fonctionnent pas

Voici à quoi il ressemble maintenant:

public function install() { 
    $this->load->model('extension/event'); 

    $this->model_extension_event->addEvent('delayed_payment_oh_add', 'catalog/model/checkout/order/addOrderHistory/after', 'admin/controller/extension/payment/delayed_payment/send_instructions'); 
    $this->model_extension_event->addEvent('delayed_payment_oh_api', 'catalog/controller/api/order/history/after', 'admin/controller/extension/payment/delayed_payment/send_instructions'); 
} 

public function uninstall() { 
    $this->load->model('extension/event'); 

    $this->model_extension_event->deleteEvent('delayed_payment_oh_add'); 
    $this->model_extension_event->deleteEvent('delayed_payment_oh_api'); 
} 

Et l'auditeur lui-même:

public function send_instructions($route, $output, $order_id, $order_status_id) { 
    $this->load->model('checkout/order'); 

    $this->log->write(var_dump($output)); 
    echo var_dump($output); 

    $order_info = $this->model_checkout_order->getOrder($order_id); 

    if ($order_status_id == $this->config->get('delayed_payment_confirmed_order_status')) 
     $this->model_checkout_order->addOrderHistory(
      $order_id, 
      $this->config->get('delayed_payment_waiting_order_status'), 
      $this->config->get('delayed_payment_order_comment'), 
      true 
     ); 
} 

Il ne met rien à l'impression à la fois journal ou d'une sortie. Comment le faire fonctionner? (Opencart 2.3)

+0

Où est le fichier qui contient la fonction send_instructions? sur quel répertoire? – DigitCart

+0

@Mojtaba Je l'ai essayé à la fois dans les admin (admin/controller/extension/payment/delayed_payment.php) et les contrôleurs de catalogues (catalog/controller/extension/payment/delayed_payment.php) –

Répondre

0

Je l'ai finalement fait! Voici comment déboguer vos événements dans Opencart 2.3. Tout d'abord, regardez le fichier 'system/engine/event.php'. Nous devons enregistrer les événements exacts appelés, pour cela, changez la fonction de déclenchement comme ceci. Il enregistrera tous les événements et les actions avec leurs résultats pour déposer « système/stockage/logs/events.log »

public function trigger($event, array $args = array()) { 
    // echo 'Event fired: '.var_dump($event); 
    $log = new Log('events.log'); 
    $log->write('Event fired: '.$event); 

    foreach ($this->data as $trigger => $actions) { 
     if (preg_match('/^' . str_replace(array('\*', '\?'), array('.*', '.'), preg_quote($trigger, '/')) . '/', $event)) { 
      foreach ($actions as $action) { 
       $result = $action->execute($this->registry, $args); 
       $log->write('Action executed: '.$action->getId()); 
       $log->write('Action result: '.$result); 

       if (!is_null($result) && !($result instanceof Exception)) { 
        return $result; 
       } 
      } 
     } 
    } 
} 

La première chose que j'ai vu était ce nom d'événement est ok, mais je ne pouvais pas lire la chemin d'action (route). Alors j'ai changé mes méthodes d'installation:

public function install() { 
    $this->load->model('extension/event'); 

    $this->model_extension_event->addEvent('delayed_payment_oh_add', 'catalog/model/checkout/order/addOrderHistory/after', 'extension/payment/delayed_payment/send_instructions'); 
} 

I chemin changé et la ligne enlevée avec des « api/commande/histoire/après » ce ne est pas nécessaire pour atteindre ce que je dois quand même ...

Alors le plus intéressant partie arrive Si vous allez à rappel événement total/de bon, vous verrez que la déclaration de la méthode est:

public function send($route, $output, $order_id, $order_status_id) 

il y a une mauvaise utilisation ne completly comme un exemple! Si vous l'activez, dans votre journal, vous verrez une exception comme 'could not call ...'. C'est parce que les méthodes d'événement reçoivent 3 arguments qui devraient tous être des références. Et maintenant, ma fonction ressemble à ceci (pour ma méthode de paiement que je veux dire):

public function send_instructions(&$route, &$data, &$output) 

$ route est une route de nom appelé. $ data est un tableau d'arguments d'événement (0 => order_ir, 2 => order_state_id e t.c.) Vous pouvez supprimer $ output pour after methods si vous le souhaitez, c'est généralement NULL. Personnellement, je l'ai enlevé ...

Et vous êtes là! Tout fonctionne bien. J'espère que cela a aidé quelqu'un :) N'oubliez pas de supprimer les journaux dans event.php ...