插件是独立于原系统的程序模块,目的是在不修改原程序的情况下对系统进行扩展,便于修改和管理。目前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. C#/Java 程序员转GO/golang程序员笔记大全(day 01)

    前言: 整理一下学习 Go 语言的笔记,作为一名老程序,学习一名新的开发语言自然不需要像小白那样从 HelloWorld 看起. 简单整理一下 Go 的一些差异处,希望对大家学习 go 有点帮助,不正 ...

  2. phpMyAdmin 应用程序“DEFAULT WEB SITE”中的服务器错误

    分析原因:没有“C:\inetpub\wwwroot\phpmyadmin\”此目录 解决办法:新建路径 分析原因:IIS设置少了一项,需添加"服务端包含"选项 解决办法:控制面板 ...

  3. IOS-CocoaPods进阶篇

    一.Podfile.lock文件 上文讲过,在开始使用CocoaPods,执行完pod install之后,会生成一个Podfile.lock文件.这个文件看起来跟我们关系不大,实际上绝对不应该忽略它 ...

  4. Xshell高级后门完整分析报告(ZT)

    1. 前言 近日,Xshell官方发布公告称其软件中存在后门.我们的实习生同学对该后门进行了详细的分析,确认这是一个具备恶意代码下载执行和数据回传等能力的高级木马. 后门代码存在于nssock2.dl ...

  5. MySQL中文入库问题

    中文测试没有问题了,此处bug源于MySQL自身编码的问题,创建数据库默认指定相关编码即可. 创建数据库时,指定utf8编码 CREATE DATABASE mydb DEFAULT CHARACTE ...

  6. vue项目搭建 (一)

    vue项目搭建 (一) 由于一直想要有自己的框架,因而一直在尝试搭建各类结构,结合vue官网及git上大神bailicangdu的项目,再看看网上一些意见,及个人思考,总结的一些,不到之处希望大家可以 ...

  7. zhx'code1

    void dandiao() { ,tail=; ;a<=k;a++) { ]) tail--; tail++; q[tail][]=z[a];q[tail][]=a; } ;a<=n;a ...

  8. React 与 可视化

    一般会想到 canvas 和 svg ; svg更适合画图, 但由于cavans在移动端的良好兼容性, 使用的更广; 什么是svg, scalable vector graphics  全称 可缩放矢 ...

  9. PostgreSQL统计信息挖掘

    PG提供了丰富的统计信息,但是没有将这些统计信息使用的简单查询搞成存储过程,需要我们自己根据需要灵活的去挖掘,最近做了数据库监控,用了一些简单的东西,于是想往深了挖一下. 首先看看系统表和视图,他们都 ...

  10. EasyPlayer RTSP Android安卓播放器修复播放画面卡在第一帧bug

    本文转自EasyDarwin团队成员John的博客:http://blog.csdn.net/jyt0551/article/details/75717097 最近发现某些手机在运行EasyPlaye ...