2014-10-17 102 views
10

我已经搜索了很多关于opencart触发器,但没有找到合适的例子。在opencart 2.0中有触发器,开发人员可以在这些触发器上挂接函数并执行类似wordpress动作和过滤器的操作。例如,在我们如何使用opencart事件?

catalog/model/checkout/order.php 

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

谁能帮我钩住上述触发我的功能?

+2

小心任何人来这个问题:不要使用事件!所有触发器已从opencart 2.2中删除。我不知道他们在不久的将来仍然会在那里...... – redochka 2016-04-08 18:14:34

+4

我花了一段时间才找出来,但是旧的触发器在2.2中并没有被删除,而是被一个通用的系统所取代,模型(和控制器,并通过注册表和加载程序)。这样做的是loader.php拦截所有对模型对象的调用并触发前后触发器。尽管事件名称已被更改:post.order.history.add现在是catalog/model/checkout/order/addOrderHistory/after(以触发它的模型和方法命名)。更多信息:https://github.com/opencart/opencart/wiki/Events-(script-notifications)-2.2.x.x – fietserwin 2016-09-15 13:02:32

+0

事件在2.0中引入,*完全*在2.3中改变,并在3.0中再次改变。伟大的理念,只是不够稳定。 – 2017-06-21 18:23:01

回答

5

重要说明:此答案适用于OC> 2.0.x.x和< 2.2.x.x.

这里的问题正在使用错误的单词(和搜索) - 正确的,你应该寻找是事件,以及它的衍生事件侦听器触发事件(不幸的是,尝试搜索这些文件时没有运气,2.0的文档仍然丢失)。

现在,我相信整个背景更加可以理解的,特别是如果您有其他框架中的事件(也许jQuery的?)有一定的了解,但这里仅仅是一个快速指导如何使用这些事件(在OC 2.0) :

  • 我们首先需要注册一个事件监听器,像这样:

    在某些地方$this->event->register('post.order.history.add', 'checkout/order/send_email');

  • 事件是TR igig,例如

    $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(现在没有更多的工作了)。

+0

非常感谢这样一个有用的信息和是的事件监听和触发事件是正确的话:) – Adnan 2014-10-20 09:24:56

+0

不客气。 – shadyyx 2014-10-20 10:38:25

+0

请参阅评论#2以回应OP;此解决方案不再正确。 – 2017-06-18 20:01:24

5

重要说明:此答案适用于OC> 2.0.x.x和< 2.2.x.x.

事件系统的工作原理是这样的:

  1. Opencart的加载与数据库中的所有注册的事件处理程序的列表。这发生在index.php文件的末尾。
  2. 然后,事件处理程序在$ event对象中注册,该对象是Event类的一个实例(system/engine/event.php)
  3. 然后从不同的方法调用$ event-> trigger()方法系统的一部分。触发器方法接受事件名称作为参数,并且正在执行为该事件名称注册的所有事件处理程序。

您可以使用$ event对象在运行时注册事件处理程序或触发事件,但仅在特殊情况下才能执行此操作。请记住,您很可能需要通过$ this-> event而不是$ event访问$ event对象(取决于您需要它的位置)。

大多数情况下,您只需要使用扩展/事件模型在db表中注册事件处理程序一次。例如,您可以在您的管理控制器的安装()方法中执行此操作。例如:

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。它是一个教程,解释事件系统如何工作,并有简单的例子,告诉你如何在你的扩展中使用它。

+3

鼓励与外部资源的链接,但请在链接上添加上下文,以便您的同行用户了解它是什么以及它为何存在。如果目标网站无法访问或永久离线,请始终引用重要链接中最相关的部分。 http://stackoverflow.com/help/how-to-answer – Eeji 2014-12-15 21:59:41

+0

好吧,必需品在这里。我不会花费10分钟或更长时间将链接页面上的内容复制到此处。 – raxbg 2014-12-31 18:17:18

+0

请参阅评论#2以回应OP;此解决方案不再正确。 – 2017-06-18 20:01:32

相关问题