插件是独立于原系统的程序模块,目的是在不修改原程序的情况下对系统进行扩展,便于修改和管理。目前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插件机制的更多相关文章

  1. 浅谈 Golang 插件机制

    我们知道类似 Java 等半编译半解释型语言编译生成的都是类似中间态的字节码,所以在 Java 里面我们想要实现程序工作的动态扩展,可以通过 Java 的字节码编辑技术([[动态代理#ASM]]/[[ ...

  2. 浅谈Nutch插件机制(含开发实例)

    plugin(插件)为nutch提供了一些功能强大的部件,举个例子,HtmlParser就是使用比较普遍的用来分析nutch抓取的html文件的插件. 为什么nutch要使用这样的plugin系统? ...

  3. 浅谈JVM线程调度机制及主要策略

    在之前有说过线程,应该都知道,所谓线程就是进程中的一个子任务,一个进程有多个线程.今天的话主要就是谈一谈JVM线程调度机制.我们结合线程来说,当我们在做多线程的案例时,如一个经典案例,火车站卖票. * ...

  4. 浅谈java发射机制

    目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...

  5. 浅谈java反射机制

    目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...

  6. 浅谈android binder机制

    binder机制 是谷歌优化在android上更适合终端的IPC(多进程通信方式),满足系统对通信方式,传输性能和安全性的要求. 特性: 1. 用驱动程序来推进进程间的通信.2. 通过共享内存来提高性 ...

  7. 浅谈Java回调机制

    像许多网上介绍回调机制的文章一样,我这里也以一个现实的例子开头:假设你公司的总经理出差前需要你帮他办件事情,这件事情你需要花些时间去做,这时候总经理肯定不能守着你做完再出差吧,于是就他告诉你他的手机号 ...

  8. 浅谈java编译机制和运行机制

    源文件和字节码的组成方式 源文件: 拓展名后跟java的文件即java的源文件. Java 源码编译由以下三个过程组成: 1.分析和输入到符号表 2.注解处理 3.语义分析和生成class文件 流程图 ...

  9. 浅谈利用同步机制解决Java中的线程安全问题

    我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等 ...

随机推荐

  1. Gruntjs提高生产力(一)

    gruntjs是一个基于nodejs的自动化工具,只要熟悉nodejs或者又一定js经验就可以熟练应用. 1. 安装 a. 保证已安装了nodejs,并带有npm b.安装客户端命令行工具,grunt ...

  2. Back Track5学习笔记

    1.BT5默认用户名:root.密码:toor(公司是yeslabccies) 2.进入图形化界面命令:startx 3.更改密码:sudo passwd root 扫描工具 第一部分网络配置: 4. ...

  3. JavaScript---forEach( ) 、map( )和 filter()

    循环数组,最先想到的就是for循环:  for(var i=0;i<count;i++) { //逻辑代码} 除此之外,就是forEach()方法了. Firefox 和Chrome 的Arra ...

  4. css实现水平 垂直居中

    css实现水平居中 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  5. 初次使用Quartus II 13.0的疑惑及解决方法

    初次接触Quartus II 13.0,遇到了很多的问题,把问题总结如下: 1.Quartus II 13.0的安装及破解 下载地址:http://t.cn/Rh2TFcz,密码是:g3gc (参考贴 ...

  6. Datesheet 参数手册

    1 明白P/N每一个字是代表什么含义... 这很重要! EP6095-01-381 (CL10C010CBNNNC=CL10C010CB8NNNC ?)----8 代表Ni plating in te ...

  7. 《gradle 用户指南中文版》目录

    gradle 用户指南 版权所有©2007-2017 Hans Dockter,Adam Murdoch只要您不对这些副本收取任何费用,并且进一步规定,每个副本都包含本版权声明,无论是以印刷版还是电子 ...

  8. React-Native基础_5.列表视图ListView

    列表视图ListView 用来显示垂直滚动列表,需要指定两个东西,1 数据的来源 dataSource,2 渲染列表的条目布局 rendRow 'use strict' import React, { ...

  9. 有关项目依赖包发生 Manifest Merge 冲突的详细解决方案

    安卓开发使用 Gradle 插件管理依赖包确实非常方便,尤其是在解决一些依赖冲突的问题上.比如,重复依赖的问题,具体内容请我之前写的一篇文章: 有关 Android Studio 重复引入包的问题和解 ...

  10. 程序设计入门-C语言基础知识-翁恺-期中测试

    一.试题 程序设计入门—C 语言期中测评 试题下载地址: http://nos.netease.com/edu-lesson-pdfsrc/217E194E46A6595A3F554380337490 ...