浅谈ecmall插件机制
插件是独立于原系统的程序模块,目的是在不修改原程序的情况下对系统进行扩展,便于修改和管理。目前web开发中大多是使用钩子形式来定义插件, 比较典型的有
wordpress, drupal系统
ecmall的插件机制:
ecmall提供了3中扩展系统功能的方法. 挂件,模块,插件.
方便我们进行二次开发。下面我们就演示一下如何制作一个插件。
首先在 external/plugins目录下新建一个目录,命名为hello_world,然后进入该目录,新建2个文件
main.plugin.php 和 plugin.info.php。
main.plugin.php
是运行的文件,所以的操作都包含在这个文件内。plugin.info.php
是对该插件的信息,比如:插件名称,作者,功能,版本,钩子等等…下面展示出2个文件的源代码.
main.plugin.php
<?php
class Hello_worldPlugin extends BasePlugin
{
function execute()
{
echo 'hello world';
}
}
?>所有的插件类都必须以插件名称(第一个字母大写) +
‘Plugin’命名,而且是继承BasePlugin类,execute是插件的入口,ecmall会在钩子处调用插件的execute函数
plugin.info.php
<?php
return array(
'id'
=> 'hello_world',
'name' =>
'hello world',
'author' => 'jack',
'desc' => 'hello world',
'hook' => 'on_run_action',
);
?>该文件主要是对插件的描述,id 是插件的名称,必须与文件夹的名称保持一致.
name,author,desc都是可选的参数,但hook必须要填写,它告诉ecmall在什么时候执行该插件,如果不填或者填写错误,该插件将不会起到任何效果.好了,一个简单的ecmall插件就定义好了,然后我们进入后台,在’扩展’->’插件管理’->点击 hello_world
后面的开启 即可
下面我们就来具体的分析一下这个插件的工作流程.
当我们从后台开启一个插件时,ecmall会在 /data
目录下生成一个 plugins.inc.php
的文件,该文件记录了当前系统所有开启的插件信息,我们打开来看一下它的内容
<?php
return array
(
'on_run_action' =>
array (
'short_store_url' =>
array (
),
'hello_world' =>
array (
),
),
);
?>返回一个数组,键是hook的名称,代表什么时候执行,值是个多维的数组,代表该hook下所有需要执行的插件.
ecmall程序会用 $this->_hook(‘on_run_action’)的方式来调用插件,_hook函数定义在/includes/ecapp.base.php
文件中,下面贴出主要代码
/* 获取可用插件列表 */
$plugin_list =
$plugins[$event];
if (empty($plugin_list))
{
return null;
}
foreach ($plugin_list as $plugin_name
=> $plugin_info)
{
$plugin_main_file = ROOT_PATH .
"/external/plugins/{$plugin_name}/main.plugin.php";
if
(is_file($plugin_main_file))
{
include_once($plugin_main_file);
}
$plugin_class_name = ucfirst($plugin_name) . 'Plugin';
$plugin =
new $plugin_class_name($data, $plugin_info);
$this->outcall =
true;
/* 返回一个结果,若要停止当前控制器流程则会返回true */
$stop_flow = $this->_run_plugin($plugin);
$plugin =
null;
$this->outcall = false;可以看到,ecmall 会循环 包含当前hook下的插件文件,然后
$this->run_pugin($plugin) 来执行, 而 _run_plugin
其实就是调用插件的execute函数,整个插件流程就这样串联起来
function
_run_plugin(&$plugin)
{
$plugin->execute();
}
总结,
虽然ecmall提供的插件机制可以让我们很简单的进行扩展,但是目前系统自带的hook太少(只有5种),与wordpress的几十种来说还相差甚远,
所以很多情况下我们都不得不自己添加一些hook来应对我们的需求.
浅谈ecmall插件机制的更多相关文章
- 浅谈 Golang 插件机制
我们知道类似 Java 等半编译半解释型语言编译生成的都是类似中间态的字节码,所以在 Java 里面我们想要实现程序工作的动态扩展,可以通过 Java 的字节码编辑技术([[动态代理#ASM]]/[[ ...
- 浅谈Nutch插件机制(含开发实例)
plugin(插件)为nutch提供了一些功能强大的部件,举个例子,HtmlParser就是使用比较普遍的用来分析nutch抓取的html文件的插件. 为什么nutch要使用这样的plugin系统? ...
- 浅谈JVM线程调度机制及主要策略
在之前有说过线程,应该都知道,所谓线程就是进程中的一个子任务,一个进程有多个线程.今天的话主要就是谈一谈JVM线程调度机制.我们结合线程来说,当我们在做多线程的案例时,如一个经典案例,火车站卖票. * ...
- 浅谈java发射机制
目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...
- 浅谈java反射机制
目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...
- 浅谈android binder机制
binder机制 是谷歌优化在android上更适合终端的IPC(多进程通信方式),满足系统对通信方式,传输性能和安全性的要求. 特性: 1. 用驱动程序来推进进程间的通信.2. 通过共享内存来提高性 ...
- 浅谈Java回调机制
像许多网上介绍回调机制的文章一样,我这里也以一个现实的例子开头:假设你公司的总经理出差前需要你帮他办件事情,这件事情你需要花些时间去做,这时候总经理肯定不能守着你做完再出差吧,于是就他告诉你他的手机号 ...
- 浅谈java编译机制和运行机制
源文件和字节码的组成方式 源文件: 拓展名后跟java的文件即java的源文件. Java 源码编译由以下三个过程组成: 1.分析和输入到符号表 2.注解处理 3.语义分析和生成class文件 流程图 ...
- 浅谈利用同步机制解决Java中的线程安全问题
我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等 ...
随机推荐
- 1-15-2-RAID10 企业级RAID磁盘阵列的搭建(RAID1、RAID5、RAID10)
RAID10的搭建: 有两种方法, 第一种:直接使用四块磁盘,创建级别为10的磁盘阵列 第二种:使用四块磁盘先创建两个RAID1,然后在用RAID1创建RAID0 第一步:添加五个磁盘到虚拟机 开机后 ...
- JS判断键盘上的上下左右键
document.onkeydown=function(event){ var e = event || window.event || arguments.callee.caller.argumen ...
- linux 常用一些指令
1.后台执行 nohup /bin/bash import.sh 1>&2 2>log & 2.生成脚本 for i in `ls` ; do echo "mys ...
- 一、html <!doctype>标签
一.html <!doctype>标签 定义和用法 <!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前. <!DOCTYP ...
- 使用LeakCanary进行内存泄漏追踪
LeakCanary使用 1.在build.gradle 中 dependencies { //添加 debugCompile 'com.squareup.leakcanary:lea ...
- JSP的EL和JSTL解析
1. EL 简介EL 全名为Expression Language,所有EL都是以${ 为起始.以} 为结尾的.EL 语法很简单,它最大的特点就是使用上很方便. 接下来介绍EL 主要的语法结构: ${ ...
- 自己定义的Excetpion继承哪个异常有什么讲究?[待解答]
try catch的地方需要用到一个自定义的DBException,如下: 于是我就自定义了一个DBException,继承Excetpion,以父类Exception构造器创建构造器: DBExce ...
- Linux:cd命令详解
cd 用来变更用户所在目录的 绝对路径:路径的写法一定由根目录 "/" 写起.例如 /usr/local/mysql 这就是绝对路径.相对路径:路径的写法不是由根目录 " ...
- Getsystime()与Getlocaltime()函数 相差8个小时
转自 http://xujinzeng.blog.163.com/blog/static/260083420086114747452/ 今天看一个有关时间的例程,发现Getsystime()与Getl ...
- ISO 18000-6c 访问标签--应用程序访问操作ISO 18000-6C标签的方法
标签访问操作包含三部分: 1.标签选择.某些场景,应用程序只对特定的标签进行操作,Indy Host Library可以指定标签选择条件. 2.执行盘存操作.上报单化后标签EPC区的数据. 3.标签单 ...