我们如何使用opencart事件?

时间:2014-10-17 15:57:22

标签: php opencart opencart2.x opencart-events

我已经搜索了很多关于opencart触发器但没有找到合适的例子。在opencart 2.0中,有一些触发器,开发人员可以在其中挂钩函数并执行类似wordpress操作和过滤器的操作。例如在

catalog/model/checkout/order.php

有一个触发器$this->event->trigger('post.order.history.add', $order_id)

有人可以帮助我将功能挂钩到上面的触发器上吗?

3 个答案:

答案 0 :(得分:5)

重要提示:此答案适用于OC> 2.0.x.x和< 2.2.x.x。

这里的问题是使用(并搜索)了一个错误的单词 - 您应该搜索的正确单词是 event ,并从中派生事件监听器触发事件(遗憾的是,在尝试搜索这些事件时仍然没有运气,而且仍然缺少2.0的文档。)

现在我相信整个背景更容易理解,特别是如果你对其他框架中的事件有一些了解(也许是 jQuery ?),这里只是一个如何处理事件的快速指南(在OC 2.0中):

  • 首先我们需要注册一个事件监听器,如下所示:

    $this->event->register('post.order.history.add', 'checkout/order/send_email');

  • 在某些地方触发事件,例如

    $this->event->trigger('pre.order.history.add', $order_id);

    $this->event->trigger('post.order.history.add', $order_id);

  • 如果事件(由其名称post.order.history.add)监听器标识,则会在触发器上调用

如需了解更多信息或自行解决问题,您可以查看system/engine/event.php(现在没有其他工作可做)。

答案 1 :(得分:5)

重要提示:此答案适用于OC> 2.0.x.x和< 2.2.x.x。

事件系统的工作原理如下:

  1. OpenCart从数据库加载包含所有已注册事件处理程序的列表。这发生在index.php文件的末尾。
  2. 然后事件处理程序在$ event对象中注册,该对象是Event类的一个实例(system / engine / event.php)
  3. 然后从系统的不同部分调用$ event-> trigger()方法。触发器方法接受事件名称作为参数,并且正在执行为此事件名称注册的所有事件处理程序。
  4. 您可以使用$ event对象在运行时注册事件处理程序或触发事件,但仅在特殊情况下执行此操作。请记住,您很可能需要通过$ this->事件来访问$ event对象,而不是$ event(取决于您需要它的位置)。

    通常,您需要使用扩展/事件模型在db表中注册一次事件处理程序。例如,您可以在管理员控制器的 install()方法中执行此操作。像这样:

    public function install() {
        $this->load->model('extension/event');
        $this->model_extension_event->addEvent('mymodule', 'pre.admin.store.delete', 'module/mymodule/on_store_delete');
        $this->model_extension_event->addEvent('mymodule', 'post.customer.add', 'module/mymodule/on_customer_add');
    }
    

    事件处理程序是addEvent()方法的第三个参数,它们采用标准路径的形式。

    您可以在此处找到有关活动系统的更多信息:http://isenselabs.com/posts/opencart2-event-system-tutorial。这是一个教程,解释了事件系统的工作原理,并提供了简单的示例,向您展示如何在扩展中使用它。

答案 2 :(得分:0)

我认为,由于OpenCart v2.3.x OC事件的更新已发生了巨大变化,因此应该更新此问题。

在它们类似于Wordpress方法之前。您将具有beforeafter触发器的预定义事件列表。

从2.3.x版开始,然后在3.x版中进行了一些更改,OC事件变得更加动态,其中根据文件的路径结构动态定义触发器。

使用事件有什么好处。

  1. 更少的冲突。使用修改系统,您将更改代码本身,而使用事件,您将修改传递的数据,这些数据是数组,对象或字符串。
  2. 您可以轻松更新事件逻辑。由于事件代码位于简单的控制器文件中,因此您可以更新事件文件以进行更新,这与OCmod不同,在OCmod中,您需要删除旧的Ocmod文件并上传新文件。
  3. 更多地控制您的数据。因为您要更改数据而不是代码,所以您拥有更多的权力。
  4. 更清晰的代码。好吧,因为您只是在编写php。没有xml之类的东西。
  5. 让您更轻松地升级OpenCart。 OpenCart可以更改代码,但不会从根本上更改数据。因此,在大多数情况下,您的事件将正常进行。

当然,有一些缺点:

  1. 很难学习和理解。
  2. 事件仅适用于控制器,模型,视图,库和配置。如果要编辑其他内容,则必须使用OCmod。
  

我建议在可能的情况下使用“事件”,并在事件无法访问的情况下使用OCmod。

OpenCart活动如何工作

当通过加载程序类加载控制器(模型,视图,库或语言)时,如下所示:

$this->load->controller('common/header');

文件controller()中的方法system/engine/loader.php执行以下操作

  1. 首先触发路线before的事件common/header
$trigger = $route;

$result = $this->registry->get('event')->trigger('controller/' . $trigger . '/before', array(&$route, &$data));
  1. 然后运行用于加载控制器的代码
$action = new Action($route);
$output = $action->execute($this->registry, array(&$data));
  1. 最后触发路线after的事件common/header
$result = $this->registry->get('event')->trigger('controller/' . $trigger . '/after', array(&$route, &$data, &$output));

对于模型,语言,库和配置,这几乎是相同的。

什么是OpenCart事件触发器

OpenCart将当前正在加载的控制器路由(例如我们上面加载的控制器路由)common/header(与模型,视图,语言和配置相同)与系统中已注册的事件进行匹配。

注册事件时,您将添加一个触发器。

  

对于目录中的控制器common/home,在加载之前

触发器将如下所示: catalog/controller/common/home/before

  

对于模型sale/order的目录getOrder中方法after的加载方式

触发器将如下所示: catalog/model/sale/order/getOrder/after

  

重要的是,在模型中,您将始终为方法设置触发器,这与控制器不同,在控制器中,默认方法index经常被丢弃

     

在管理员之后查看catalog/product_form.twig

触发器将如下所示: admin/view/catalog/product_form/after

  

请记住,之后向视图添加事件时,您将修改&$ output veriable,到目前为止,它不是twig文件,而是完全编译的HTML。因此,代码中不再包含树枝标签。

     

使用PHP Simple HTML Dom Parser

修改视图的最佳方法

如何注册活动

有三种注册OpenCart活动的选项。

  1. 通过模型$ this-> model_setting_event-> addEvent()注册; (推荐)
  2. 通过system/config/catalog编辑$_['action_event']中的配置文件注册
  3. 在d_event_manager模块的帮助下通过管理员注册。

我将向您展示如何通过模型进行添加,因为这是推荐的方法。

  1. 添加用于注册状态更新事件的代码。

在文件admin/controller/extension/module/my_module.php


$this->load->model('setting/event');
$this->model_setting_event->deleteEventByCode('my_module');
if($this->request->post['module_my_module_status']){
    $this->model_setting_event->addEvent('my_module', 
    'admin/view/catalog/product_form/before', 
    'extension/module/my_module/view_catalog_product_form_before');
}

  

请注意,我首先删除所有事件,然后检查状态是否为真并添加事件。这样,我可以确定不会添加任何旧的或意外的事件。

  1. 删除所有卸载事件
public function uninstall(){
    $this->load->model('setting/event');
    $this->model_setting_event->deleteEventByCode('my_module');
}
  

如果要卸载模块,则删除所有事件是一个好习惯。

我在哪里编写OpenCart Event函数?

现在您知道有些事件具有触发器。但是触发器实际上是做什么的?

他们只是加载事件的控制器并通过引用传递数据。

这就是为什么:

  1. 您将始终将事件逻辑添加到admin或catalog文件夹中的控制器中。 (即使您正在为配置或库设置事件)
  2. 使用事件功能,您可以修改before事件的$ route和$ data以及after事件的$ route和$ output

这是文件admin/controller/extension/module/my_module.php中的事件函数的示例

public function view_catalog_product_form_before(&$route, &$data){
    if($data && isset($this->request->get['product_id'])){
        $product_id = $this->request->get['product_id'];
        $this->load->model('extension/module/my_module');

        $product_info = $this->model_extension_module_my_module->getMoreProductInfo($product_id);

        if($product_info){
            //here I am modifying the $data and it will pass on to the view with this new data because it was passed to this function by referance. 
            $data['more_info'] = $product_info;
        }
    }
    //there is no result returned in Event functions. 
    //if you do return a result, you will override the default result that can cause unexpected consequences. best to avoid it. 
}

享受!如有任何疑问,请发送电子邮件至https://dreamvention.com