Opencart addOrderHistory 事件不起作用

Opencart addOrderHistory events not working

我正在为 opencart 开发自定义支付方式。我需要的是听取订单历史变化,这些变化是由经理从管理员处更改的。一切正常,但无论我做什么,我都无法使 opencart 事件触发器工作。

这是现在的样子:

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

和听众本身:

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

它没有在日志或输出中打印任何内容。 如何让它发挥作用? (Opencart 2.3)

我终于成功了! 这是在 Opencart 2.3 中调试事件的方法。

首先,看一下文件'system/engine/event.php'。我们需要记录调用的确切事件,为此更改触发器函数。它会将所有事件和操作及其结果记录到文件 '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;
                }
            }
        }
    }
}

我首先看到的是事件名称可以,但我无法读取操作路径(路线)。所以我改变了我的安装方法:

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

我更改了路径并删除了带有 'api/order/history/after' 的行,无论如何它都不需要实现我需要的...

然后最有趣的部分来了 如果您转到 total/voucher 事件回调,您将看到该方法声明为:

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

完全错误不要拿来举例!如果你启用它,在你的日志中会看到像 'could not call...' 这样的异常。这是因为事件方法收到 3 个参数,它们都应该是引用。现在我的功能看起来像这样(我的意思是我的付款方式):

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

$route 是一个名称路由调用。 $data 是一个事件参数数组(0 => order_ir, 2 => order_state_id e t.c。)如果你愿意,你可以删除后方法的 $output,它通常是 NULL .我个人删除了它...

你来了!一切正常。我希望它对某人有所帮助 :) 不要忘记删除 event.php...

中的日志

调试 Opencart 3+ 中的事件

查找并替换(或注释并插入)波纹管函数到文件中 'system/engine/event.php'.

    public function trigger($event, array $args = array()) {

        $log = new Log('events.log');
        $log->write('Event fired: '.$event);

        foreach ($this->data as $value) {
            if (preg_match('/^' . str_replace(array('\*', '\?'), array('.*', '.'), preg_quote($value['trigger'], '/')) . '/', $event)) {
                $result = $value['action']->execute($this->registry, $args);

                $log->write('Action executed: '.$value['action']->getId());
                $log->write('Action result: '.$result);

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