eventstriggersopencartopencart2.3

Opencart addOrderHistory events not working


I'm working on my custom payment method for opencart. What I need is to listen to order history changes which is changed from admin by manager. It was all ok, but I couldn't make the opencart event trigger work, no matter what I do.

Here is what it looks like right now:

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');
}

And listener itself:

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
        );
}

It is not printing anything to both log or output. How can make it work? (Opencart 2.3)


Solution

  • I FINALLY MADE IT! This is how to debug your events in Opencart 2.3.

    First of all, take a look at file 'system/engine/event.php'. We need to log what exact events are called, to do this change the trigger function like this. It will log all events and actions with their results to file 'system/storage/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;
                    }
                }
            }
        }
    }
    

    The first thing i saw was that event name is ok, but i could not read the action path (route). So I changed my install methods:

    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 changed path and removed line with 'api/order/history/after' its not needed to achieve what I need anyway...

    Then the most interesting part comes up If you go to total/voucher event callback you will see that method declaration is:

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

    It's completly wrong dont use it as an example! If you enable it, in your log will see an exception like 'could not call...'. Its because event methods recieve 3 arguments which all should be references. And now my function looks like this (for my payment method I mean):

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

    $route is a name route called. $data is an array of event arguments (0 => order_ir, 2 => order_state_id e t.c.) You can remove $output for after methods if you want, its usually is NULL. Personally I removed it...

    And here you are! Everything works fine. I hope it helped someone :) Don't forget to remove logs in event.php...