如何使用OpenCart 2.x Event事件系统
如何使用OpenCart 2.x Event事件系统
OpenCart 2.x 包含很多新特性,其中之一就是专为开发者提供的事件系统,Event System。它允许你在不修改原有系统代码的基础上( 当然也不使用vQmod或者是2.x版本新增的OCMOD修改代码,这样可以规避代码冲突的风险。 ),规定某些特定操作执行的时候,触发特定的动作。比如说:在用户下单或是注册的时候,你可以使用事件系统向后台发送通知信息。
使用原理:
使用事件系统需要两个步骤:
注册事件处理器。
接入事件处理器。
在控制器文件中注册事件处理器十分简单。你可以使用一个包含所有方法的单独文件作为事件处理器 ,也可以使用在控制器里分出一个方法。注册事件处理器你需要使用 extension/event 模型(OpenCart 2.0.1+)或者 tool/event 模型(OpenCart 2.0.0.0)。 extension/event 模型有两个方法: addEvent($code, $trigger, $action) 注册事件 和 deleteEvent($code) 删除事件。你可以在你开发插件时,在intsall()方法里面使用addEvent。在卸载插件的方法 uninstall()中使用 deleteEvent。
$code 参数用于组合你的事件处理器。
$trigger 参数用于规定触发时的动作参数 .这里有许多预定的opencart系统触发参数: https://github.com/opencart/opencart/wiki/Events-(script-notifications) .
$action 参数用于定位你的事件处理器。它通常是一组标准的控制器路由,比如:module/mymodule/on_user_created。
实例
环境:opencart 2.0.1+。
假设我们要开发一个名叫“My Module”的模块。
后台控制器: admin/controller/module/mymodule.php .
前台文件: catalog/controller/module/mymodule.php .
需求:当有用户注册或是删除一个店铺的时候,发送一份email给网站管理员。触发的参数我们可以定义为 pre.admin.store.delete 和 post.customer.add。
首先我们可以在我们的模块中使用 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');
}
卸载模块的流程方法 uninstall 如下:
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');
}
接下来我们接入事件处理器。`pre.admin.store.delete` 处理后台事件,所以他的处理器必须接入admin/中的控制器文件中。当店铺被删除时,我们需要一个处理器方法来发送通知给后台管理员。以 pre. 开头的事件表示在控制器方法执行前触发,以 post. 开头的事件则表示控制器方法执行之后触发。同时,我们也想要在我们的信息中包含店铺地址的域名,如果先执行完删除店铺的操作,那么我们就无法得到被删店铺 的域名了。
事件处理器:
public function on_store_delete($store_id) {
$this->load->model('setting/store');
$store_info = $this->model_setting_store->getStore($store_id);
$admin_mail = $this->config->get('config_email');
mail($admin_mail, "A store has been deleted", "The store " . $store_info['url'] . " was deleted.");
}
post.customer.add 需要在前台控制器catalog中写入事件处理器。当有新用户注册时,通知后台管理员。类似的方法如下:
public function on_customer_add($customer_id) {
$this->load->model('account/customer');
$customer_info = $this->model_account_customer->getCustomer($customer_id);
$admin_mail = $this->config->get('config_email');
mail($admin_mail, "New Customer", "A new customer has just registered with the following e-mail: " . $customer_info['email']);
}
注意: 我们使用 mail() 函数发送邮件真实情况,我们可能要用到 OpenCart 的 Mail 类 发送 e-mails。
最后的代码如下:
admin/controller/module/mymodule.php
<?php
class ControllerModuleMyModule extends Controller
{
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');
}
public function uninstall() {
$this->load->model('extension/event');
$this->model_extension_event->deleteEvent('mymodule');
}
public function on_store_delete($store_id) {
$this->load->model('setting/store');
$store_info = $this->model_setting_store->getStore($store_id);
$admin_mail = $this->config->get('config_email');
mail($admin_mail, "A store has been deleted", "The store " . $store_info['url'] . " was deleted.");
}
}
catalog/controller/module/mymodule.php
<?php
class ControllerModuleMyModule extends Controller {
public function on_customer_add($customer_id) {
$this->load->model('account/customer');
$customer_info = $this->model_account_customer->getCustomer($customer_id);
$admin_mail = $this->config->get('config_email');
mail($admin_mail, "New Customer", "A new customer has just registered with the following e-mail: " . $customer_info['email']);
}
}
进阶
除了上述的标准用法,事件系统也能用做创建跨模块接口。使用Event 对象 ($this->event),你可以在任何地方触发任何的事件。你可以使用它触发你自定义的事件。设想你正在开发一个用户评论的模块。你可以在客 户发送评论的时候触发一个事件,这就允许其他的模块开发者为你的事件处理期创建自定义的处理方法,而不需要使用vQmod或者OCMOD来修改代码。它可 以确保Opencart变得更加稳定。
PS:Event类定义在 system/engine/event.php 文件中。
如何使用OpenCart 2.x Event事件系统的更多相关文章
- Angular this vs $scope $event事件系统
this vs $scope ------------------------------------------------------------------------------ 'this' ...
- laravel Event执行顺序
laravel一大特色就是event事件系统.一般首先要listen一个事件,随后fire那个事件,这时执行路径将会调用event handler,返回后继续执行.例如: Event::listen( ...
- jQuery源码解读 - 数据缓存系统:jQuery.data
jQuery在1.2后引入jQuery.data(数据缓存系统),主要的作用是让一组自定义的数据可以DOM元素相关联——浅显的说:就是让一个对象和一组数据一对一的关联. 一组和Element相关的数据 ...
- Unity3D研究院编辑器之Editor的GUI的事件拦截
OnGUI是Unity上一个时代的UI系统,而现在运行时的UI系统已经被UGUI取代,但是Editor的UI还是在用老的这一套GUI系统.比如unity编辑器里的所有窗口,布局,按钮,拖动条.滚动等等 ...
- laravel源码解析
本专栏系列文章已经收录到 GitBooklaravel源码解析 Laravel Passport——OAuth2 API 认证系统源码解析(下)laravel源码解析 Laravel Passport ...
- jquery源码分析(二)——架构设计
要学习一个库首先的理清它整体架构: 1.jQuery源码大致架构如下:(基于 jQuery 1.11 版本,共计8829行源码)(21,94) 定义了一些变量和函数jQu ...
- React源码深度解析视频 某课网(完整版)
<ignore_js_op> [课程介绍]: React毫无疑问是前端界主流的框架,而框架本身就是热点.课程以讲解React实现原理为主,并在实现过程中讲解这么做的原因,带来 ...
- Dean-Edward的事件系统实现
jQuery早期的事件系统,主要借鉴自Dean-Edward的事件模型.虽说早期的该事件模型也有些许bug,诸如: 1,绑定的事件及其处理程序等数据并未存储到缓存中,而是直接存储在dom元素上,这样不 ...
- jQuery-1.9.1源码分析系列(十) 事件系统——事件体系结构
又是一个重磅功能点. 在分析源码之前分析一下体系结构,有助于源码理解.实际上在jQuery出现之前,Dean Edwards的跨浏览器AddEvent()设计做的已经比较优秀了:而且jQuery事件系 ...
随机推荐
- SQL Server--实体再复习
前些天小编所在的组织部重构.组长交给小编一项设计实体的活儿,它是我们软件灵魂(数据)的载体,实体的抽象影响到数据库设计,数据库设计的质量影响到整个程序的运营,以下是我设计的实体关系图: 系统核心业务逻 ...
- TestNG入门教程
阅读目录 TestNG介绍 在Eclipse中在线安装TestNG 在Eclipse中离线安装Testng TestNG最简单的测试 TestNG的基本注解 TestNG中如何执行测试 使用testt ...
- 【RF库Collections测试】Dictionary Should Not Contain Key
Name:Dictionary Should Not Contain KeySource:Collections <test library>Arguments:[ dictionary ...
- Linux mysql 命令
mysql 是 MySQL 服务的一个命令行工具,常见用法如下: [root@localhost ~]$ mysql -uroot -p' # 本地连接 MySQL 服务 [root@localhos ...
- long()
long() 用于将一个对象转换为长整数 In [35]: long(') # 将纯数字的字符串转换为长整数 Out[35]: 123L In [36]: long(12.3) # 将浮点数转换为长整 ...
- php 数据库练习之租房子
题目: 示例图 本次只做图4这个表,因为之前的都已做过 自己在mydb数据库建了一个house表 如图: 自己做的代码: <!DOCTYPE html PUBLIC "-//W3C// ...
- Change Base
Given an integer m in base B (2 ≤ B ≤ 10) (m contains no more than 1000 digits), find the value of t ...
- Module 'null' not found异常解决办法
百度原因:是因为在 /WEB_INF/web.xml文件中 <servlet> <servlet-name>ActionServlet</servlet-name ...
- C/C++程序编译流程
单个文件的编译过程 多个文件的编译过程
- 【BZOJ5109】[CodePlus 2017]大吉大利,晚上吃鸡! 最短路+拓扑排序+DP
[BZOJ5109][CodePlus 2017]大吉大利,晚上吃鸡! Description 最近<绝地求生:大逃杀>风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏.在游戏 ...