构成插件文件结构如下:
info.php
插件信息文件,用于标注插件的基本信息,格式如下:
<?PHP
return array(
'name' => '测试插件',
'idx' => basename(realpath(__DIR__)),
'ver' => '1.0',
'intro' => '插件应用示例',
'copyright' => '版权所有 2019-2021 Windy2000',
'description' => '测试插件,包含插件设置示例,模版标签添加,语言信息设置,代码钩子设置等。'
);
class.php
插件核心文件包含接口中所要求的三种方法,以及插件核心的功能扩展代码,示例如下:
<?PHP
class plugin_sample implements interface_plugin {
public static function check(&$result = '') {
$result = "";
$theList = array(
"dir1/",
"dir2/",
);
$flag = true;
$dir = __DIR__;
foreach($theList as $cur) {
if(myFile::rewritable($dir.'/'.$cur)) {
$result .= $cur . ' - <span >Writable</span><br />';
} else {
$result .= $cur . ' - <span >Readonly</span><br />';
$flag = false;
}
}
return $flag;
}
public static function install() {
$dir = __DIR__;
myFile::mkdir($dir.'/dir1');
myFile::mkdir($dir.'/dir2');
myFile::del(CACHE.'script');
}
public static function uninstall() {
$dir = __DIR__;
myFile::del($dir.'/dir1');
myFile::del($dir.'/dir2');
myFile::del(CACHE.'script');
}
public static function setPage($content) {
return str_replace('<title>', '<title>插件调整(可关闭) - ', $content);
}
}
除了基础的三个方法之外,还可以添加其他静态扩展方法,由于插件类不会实例化,所以所有扩展方法必须都为静态模式。
index.php
插件入口文件,非自定义路由模式外,所有插件功能引入均通过此文件。其基本内容都是利用框架核心类实例所提供的各类接口方法插入功能代码,示例如下:
<?PHP
//初始化程序一般在页面初始化程序之前执行,用于相关设置
require_once(__DIR__."/class.php");
$this->regModule("test", __DIR__."/show.php");
$this->regTag('test_tag', function() {return 'Plugin tag test.';});
$this->setLanguage(['test_lng'=>'模版语言测试']);
$this->setFunction('page', 'plugin_sample::setPage');
$this->editorSetPlugin('
editor.addCommand( "test_cmd", function() {
let selected_text = editor.selection.getContent();
let return_text = "";
return_text = "<h1>" + selected_text + "</h1>";
editor.execCommand("mceInsertContent", 0, return_text);
});
');
$this->editorSetPlugin('
editor.addButton("test_button", {
text : "按钮",
title : "插入测试文字",
cmd: "test_cmd"
});
', 'test_button');
由于插件是在核心实例的内部引入,所以核心类直接通过 $this 变量进行调用
首先,必须要应用插件功能类,即第一行的内容;
第二行注册了一个名为“test”的模块,该模块指向插件目录下的 show.php。
第三行设置了个一模版扩展标签 test_tag ,通过给定的函数可以了解对应的标签都将被替换为 “Plugin tag test.” 的字符串。
第四行设置了一个自定义的语言索引,页面模版标签中的语言标签 <!--lng_test_lng--> 都将被自动替换为 “模版语言测试”。
第五行设置了一个页面钩子,模版页面编译完成后,将对页面结果执行 plugin_sample::setPage 方法 ,通过上文可了解到其作用是在网页标题前加上 “插件调整(可关闭) - ” 的文字。
第六行及后面是给 tinyMCE 富文本编辑器增加了一个名为 “test_cmd” 的命令并添加对应按钮,作用是将选定文字变为一号标题。
config.php
插件配置文件,本文件不是插件所必须的,可根据实际情况选择是否使用。
配置文件的格式与应用设置基本类似,但只允许一维,并于框架后台统一管理。
示例配置文件如下:
<?PHP
$setting = array();
$setting['para_1'] = 'test1';
$setting['para_2'] = 123456.78;
$setting['para_3'] = '2,3';
$setting['para_4'] = true;
$setting['para_5'] = 'select_2';
$setting['para_6'] = '200820e3227815ed1756a6b531e7e0d2';
$setting['para_7'] = 'y';
$setting['para_8'] = '111
222
333';
return $setting;
以上代码实际上包含了各种格式的设置模式,对应的结构文件存放于插件目录下的config子目录,按语种分文件,默认为 default.php ,对应以上设置的结构代码如下:
<?PHP
return array(
'name' => '设置示例',
'list' => [
'para_1' => array(
'name' => '文本测试',
'describe' => '不可为特殊符号,限长50字',
'type' => array('text', 'name', '50')
),
'para_2' => array(
'name' => '数字测试',
'describe' => '只可为合法实数,限长10位',
'type' => array('text', 'number', '10')
),
'para_3' => array(
'name' => '复选测试',
'describe' => '可多选',
'type' => array('checkbox', array('选项 1'=>1, '选项 2'=>2, '选项 3'=>3, '选项 4'=>4))
),
'para_4' => array(
'name' => '单选测试',
'describe' => '单选',
'type' => array('radio', array('开启'=>'true', '关闭'=>'false'))
),
'para_5' => array(
'name' => '选单测试',
'describe' => '下拉列表',
'type' => array('select', array('选项 1'=>'select_1', '选项 2'=>'select_2', '选项 3'=>'select_3', '选项 4'=>'select_4'))
),
'para_6' => array(
'name' => '密码测试',
'name2' => '重新输入',
'describe' => '请输入两次密码,限长15位',
'type' => array('password', 'md5', '6-10')
),
'para_7' => array(
'name' => '开关测试',
'describe' => '相当于只有一个项目的复选框',
'type' => array('switch', 'y', '是否开启')
),
'para_8' => array(
'name' => '多行文本',
'describe' => '用于输入多行长文本内容',
'type' => array('textarea', '', 5)
),
]
);
可以对比以上两端代码,相关规则不难理解,具体解释也可参见设置管理。
language
本项不是文件,而是一个语言包,里面包含以各类语言索引代码命名的语言文件,如 chs.php、en.php 等,默认文件为 default.php。语言包代码示例如下:
<?PHP
return array (
'plugin_sample_info_name' => '测试插件',
'plugin_sample_info_intro' => '插件应用示例',
'plugin_sample_info_copyright' => '版权所有 2019-2021 <a href="mailto:windy2006@gmail.com">Windy2000</a>',
'plugin_sample_info_description' => '<i>测试插件</i>,包含插件设置示例,模版标签添加,语言信息设置,代码钩子设置等。',
);
为避免冲突,建议在索引以 "plugin_[插件名称]_[属性]_[具体索引]" 的模式命名。
只要在 index.php 文件中调用以下代码即可引入,然后在框架中就可以通过 <!--lng_[idx]--> 的方式调用了。
$this->setLanguagePack(dirname(__FILE__).'/language/', $mystep->setting->gen->language);
route.php
通过插件也可以自定义路由规则,格式与应用对应脚本格式一致,也包含 $format, $rule 和 $api 三个项目,具体可参见路由模块和路由设置。本项目是可选项,可根据需要自行定义,示例代码如下:
<?PHP
$rule = array(
array('/sample_route/[any]', array('plugin_sample::main')),
);
$api = array(
'sample' => 'plugin_sample::api',
);
框架后台
结合自定义路由规则,插件可以在框架后台的插件扩展栏目添加一个或多个栏目,通过 showPluginPage 方法展现页面,此方法有两个参数,第一个参数是插件索引(即插件目录名),第二个参数为调用索引,对应此索引的php脚本和tpl模版分别存储于 module 和 template 目录,其中模版文件为框架后台的子模版,具体格式可参见框架后台应用相关子模版的格式。
用户页面
插件可以通过模块模式为前台用户提供交互页面,其中模块通过核心类 regModule($module, $script) 方法,注册名为 $module 的模块,并制定其所对应的脚本为 $script(完整路径)。所对应的脚本和模版文件分别存放在插件目录下module 和 template 子目录。