插件是獨立於原系統的程序模塊,目的是在不修改原程序的狀況下對系統進行擴展,便於修改和管理。目前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來應對咱們的需求.php