-
361
/
/
插件文件名称
- 插件文件命名推荐使用自定义前缀,避免和其他插件冲突,如: myprefixtips ,其中 myprefix 为自定义前缀。
-
插件主文件名称必须与插件所在文件夹名称相同,如:
myprefix_tips/
myprefix_tips.php
myprefix_tips_setting.php
myprefix_tips_callback.php
-
279
/
/
插件后台功能页面(所有用户均可见)
如果你想让插件在后台有一个功能页面,可以:
在插件中添加文件: pluginname_user.php
该文件内要包含名为 plugin_user_view 的函数,其中可以输出功能内容 此时插件的后台功能地址为:https://yourdomain/admin/plugin_user.php?plugin=pluginname
该页面可以用来构建一些给普通注册用户使用的后台功能,比如文章收藏插件就使用了该特性。 -
353
/
/
插件前台展示页面
如果想让插件在前台输出一个页面,可以在插件中添加文件: pluginname_show.php 此时插件的前台显示地址为:https://yourdomain/?plugin=pluginname 或者 https://yourdomain/plugin/pluginname (需要开启伪静态规则) 这样就可以在 pluginname_show.php 文件中构建插件的前台展示页面了。
-
351
/
/
插件后台设置页面(仅管理员可见)
如果你想让插件在后台有一个设置页面,可以:
在插件中添加文件: pluginname_setting.php
该文件内要包含名为 plugin_setting_view 的函数,其中可以输出设置内容 此时插件的后台配置地址为:https://yourdomain/admin/plugin.php?plugin=pluginname -
340
/
/
插件数据存储(3):扩展核心表字段
尚未支持,目前可以使用插件数据存储(1):Storage和插件数据存储(2):自建数据表两种方式替代,后续会支持。
-
364
/
/
插件数据存储(2):自建数据表
如果上面的 Storage 数据存储方式无法满足更复杂的数据结构存储要求,插件可以自建数据库表存储数据。
创建插件数据表
利用上面提到的【事件回调】机制在自定义的 callback 函数中实现创建插件自己的表,下面给出一个简单的示例。
<?php !defined('EMLOG_ROOT') && exit('access denied!'); // 初始化插件数据表 function callback_init() { $db = MySql::getInstance(); $charset = 'utf8mb4'; $type = 'InnoDB'; $table = DB_PREFIX . 'stats'; $add = "ENGINE=$type DEFAULT CHARSET=$charset;"; $sql = " CREATE TABLE IF NOT EXISTS `$table` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `gid` int(11) unsigned NOT NULL, `title` varchar(255) NOT NULL default '', `views` bigint(11) unsigned NOT NULL default 0, `comments` bigint(11) unsigned NOT NULL default 0, `date` date NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `date_gid` (`date`,`gid`) )" . $add; $db->query($sql); } // 插件删除时删除插件数据表 function callback_rm() { $sql = "DROP TABLE IF EXISTS `" . DB_PREFIX . "stats`"; $db = MySql::getInstance(); $db->query($sql); }下面PHP代码是一个完整的维护插件自建数据库表的 callback 示例,可以直接用于自己插件 xxxx_callback.php ,修改对应建表语句即可。
<?php /** * 插件回调 */ !defined('EMLOG_ROOT') && exit('error!'); /** * 插件激活回调 */ function callback_init(){ Init_Database_Callback::instance()->pluginInit(); } /** * 插件更新回调 */ function callback_up(){ Init_Database_Callback::instance()->pluginUp(); } /** * 插件删除回调 */ function callback_rm(){ Init_Database_Callback::instance()->pluginRm(); } /** * 数据表操作类 */ class Init_Database_Callback { //实例 private static $instance; //数据库实例 private $db; //数据表配置 private $option = [ //数据表名称 "tableName" => DB_PREFIX."toEverColor_list", //卸载插件是否删除数据表 - true/false 对应 删除/不删除 默认为false(不删除) "checkDeleteTable" => false, //数据表字段信息,字段=>sql语句,请勿写错,程序根据这个来创建和检测字段 "fieldData" => [ "id" => "`id` int(50) NOT NULL AUTO_INCREMENT", "gid" => "`gid` int(50) NOT NULL COMMENT '文章ID'", "color" => "`color` varchar(200) DEFAULT NULL COMMENT '颜色'", "weight" => "`weight` enum('n','y') DEFAULT 'n' COMMENT '是否加粗(默认不加粗)'", "font_size" => "`font_size` int(50) DEFAULT NULL COMMENT '字号'", "line_through" => "`line_through` enum('n','y') DEFAULT 'n' COMMENT '删除线'", ] ]; /** * 私有构造函数,保证单例 */ private function __construct(){ //数据库实例赋值 $this->db = Database::getInstance(); } /** * 单例入口 */ public static function instance(){ if (self::$instance === null) { self::$instance = new self(); } return self::$instance; } /** * 检测数据表是否存在 */ public function checkDataTable() { if (isset($this->option['tableName'])) { $query = $this->db->query("SHOW TABLES LIKE '{$this->option['tableName']}'"); if ($this->db->num_rows($query) > 0) { return true; } return false; } return false; } /** * 检测数据表中字段是否存在 - 指定字段名 */ public function checkDataField($fieldName = '') { if (!empty($fieldName) && $this->checkDataTable()) { $query = $this->db->query("SHOW COLUMNS FROM {$this->option['tableName']} LIKE '{$fieldName}'"); if ($this->db->num_rows($query) > 0) { return true; } return false; } return false; } /** * 数据表创建函数 */ private function addDataTable() { if (!empty($this->option) && is_array($this->option) && isset($this->option['fieldData']) && is_array($this->option['fieldData'])) { $sql = "CREATE TABLE IF NOT EXISTS {$this->option['tableName']} ("; foreach ($this->option['fieldData'] as $field => $fieldSql) { $sql .= $fieldSql . ','; } $sql .= " PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='标题改色表';"; $this->db->query($sql); } } /** * 检测数据表字段是否存在,不存在则创建字段 */ private function addDataTableField() { if (!empty($this->option) && is_array($this->option) && isset($this->option['fieldData']) && is_array($this->option['fieldData'])) { $preForeachData = ''; foreach ($this->option['fieldData'] as $field => $fieldSql) { if (!$this->checkDataField($field)) { $after = !empty($preForeachData) ? " AFTER {$preForeachData}" : ''; $this->db->query("ALTER TABLE {$this->option['tableName']} ADD COLUMN {$fieldSql}{$after}"); } $preForeachData = $field; } } } /** * 插件启用执行函数 */ public function pluginInit() { if ($this->checkDataTable()) { $this->addDataTableField(); } else { $this->addDataTable(); } } /** * 插件更新执行函数 */ public function pluginUp() { $this->addDataTableField(); } /** * 插件卸载执行函数 */ public function pluginRm() { if (isset($this->option['checkDeleteTable']) && $this->option['checkDeleteTable'] === true) { $this->db->query("DROP TABLE {$this->tableName}"); } } }读取插件数据表
<?php // 读取插件数据 function getDetail($id) { $db = MySql::getInstance(); $row = $db->once_fetch_array("SELECT * FROM " . DB_PREFIX . "stats WHERE id = " . $id); $row['xxxx'] …… } -
398
/
/
插件数据存储(1):Storage
插件如果需要保存设置等信息,可以使用系统提供的Storage类来完成数据的存储读取,数据会被存储在MySQL数据库的storage表里。 该存储方式适合存储 key-value 类型的键值对数据,如插件的设置项等。
写入数据
$plugin_storage = Storage::getInstance('plugin_name');//使用插件的英文名称初始化一个存储实例 $plugin_storage->setValue('key', 'xxx'); // 设置key的值为 xxx,最大可以存储长度为65,535个字符的数据设置写入数据类型:数据存储还支持第三个参数指定存储数据的类型,读取时会返回相应的数据类型,目前支持4种类型,默认是string类型。
- string //读取时返回string
- number // 读取时返回float类型
- boolean // 读取时返回布尔类型
- array // 返回数组
如:
$plugin_storage = Storage::getInstance('plugin_name'); $data = ['name' => 'tom', 'age' => 19]; $plugin_storage->setValue('key', $data, 'array'); //存储为数组类型,这样数组会被序列化后存入数据库,读取的时候会被自动反序列化。读取数据
$plugin_storage = Storage::getInstance('plugin_name'); //使用插件的英文名称初始化一个存储实例 $ak = $plugin_storage->getValue('key'); // 读取key值清理删除数据清理删除数据
$plugin_storage = Storage::getInstance('plugin_name'); //使用插件的英文名称初始化一个存储实例 $ak = $plugin_storage->deleteName('key') // 删除此插件创建的一行名为key的数据 $ak = $plugin_storage->deleteAllName('YES'); //删除此插件创建的所有数据, 请传入大写的"YES"来确认删除 ,一般用于插件删除回调函数。 -
400
/
/
插件配置
插件配置
-
386
/
/
关于我们
关于我们
-
425
/
/
插件下载
插件下载