插件开发文档:配置文件

插件Config配置规则

插件信息文件:Config/App.php

 'app', // 固定app不变
    //'ftype' => 'module', // 可选,做完插件来安装模块使用
    'name' => '插件名称', // 填写插件的名字
    'author' => '宸逸程序设计', // 作者名字
    'icon' => 'fa fa-eye', // 插件图标
    //'uri' => '插件目录/控制器/方法函数', //安装后默认跳转路径

];


安装时的SQL文件:Config/Install.sql

DROP TABLE IF EXISTS `{dbprefix}app_web_log`;
CREATE TABLE IF NOT EXISTS `{dbprefix}app_web_log` (
  `id` BIGINT(18) unsigned NOT NULL AUTO_INCREMENT,
  `time` int(10) NOT NULL,
  `domain` varchar(100) NOT NULL,
  `url` varchar(255) NOT NULL,
  `param` text NOT NULL,
  `method` varchar(20) NOT NULL,
  `ip` varchar(100) NOT NULL,
  `useragent` text NOT NULL,
  `software` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `time` (`time`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='网站访客日志';

一般用于创建表,{dbprefix}表示表的前缀


卸载时的SQL文件:Config/Uninstall.sql

于安装相反,这里写删除表的语句吧

删表SQL语法

DROP TABLE删除一个或多个表。可以使用以下语法:

DROP TABLE table1_name, table2_name, ...;

在这里,table1_nametable2_name,...是要删除的表的名称。

警告:删除数据库或表是不可逆的。

因此,在使用DROP语句时要小心,因为数据库系统通常不会显示任何警告,例如“您确定删除吗?”。它将立即删除数据库或表及其所有数据。


安装后运行的程序代码:Config/Install.php


插件的菜单配置:Config/Menu.php

 [

        'app' => [
            'left' => [
                'app-plugin' => [
                    'link' => [
                        [
                            'name' => '访客记录',
                            'icon' => 'fa fa-eye',
                            'uri' => 'weblog/home/index',
                        ],
                    ]
                ],
            ],
        ],

    ],
];

上面的代码是在后台插件菜单里面增加本插件的名字、图标、链接


插件版本控制文件:Config/Version.php

return [

    'version' => '2.0', // 插件版本号,两位版本号
    'license' => 'dev', // 开发的插件必须填写dev
    'updatetime' => '2015-3-5', // 更新时间

];

此文件是插件的版本控制文件,需要填写版本号和版本更新时间值


插件出现在在后台模块列表右侧配置文件:Config/Clink.php

 '站点权限', // 站点权限是插件的链接名称
        'icon' => 'fa fa-user', // 图标
        'color' => 'blue', // 颜色class red green blue
        'url' => SELF.'?c=bbb&m=index&mid={mid}&id={cid}', // 后台链接:对于点击的地址mid是模块目录,cid是内容id
        'murl' => SELF.'?c=bbb&m=index&mid={mid}&id={cid}', // 用户中心链接:对于点击的地址mid是模块目录,cid是内容id
        'uri' => '', // 对应的uri权限判断,后面章节会介绍权限写法
        'field' => '', // 统计数量的字段,填写模块内容的主表字段,只能填写int数字类型的字段
        //'is_verify' => 1, // 是否显示在后台审核管理里面
         'displayroder' => 10, // 排序方式,越到越靠后,v4.6.2以上支持
    ],

];

此文件配置效果如下图所示

image.png

插件出现在在后台模块列表下方的配置文件:Config/Cbottom.php

return [

    [
        'name' => '批量权限',// 批量权限是插件的链接名称
        'icon' => 'fa fa-user', // 图标
        'url' => 'javascript:;',  // 这个是单击的执行的js动作,建议使用自定义js函数
        'uri' => '', // 用于权限验证,后面章节会介绍权限写法
        'displayroder' => 10, // 排序方式,越到越靠后,v4.6.2以上支持
    ],

];

此文件配置效果如下图所示

image.png


模板的module标签或search标签循环循环条件:Config/Mwhere.php

用于在前台模板列表界面的循环显示条件,比如增加一个状态字段,只显示这个状态的列表数据。


自定义缓存Cache.php

用于后台进行“更新缓存”操作时执行配置表中的方法,跟“更新缓存”操作联动进行


自定义缓存配置文件:/dayrui/App/应用目录/Config/Cache.php

 'APP目录',

];


例如:

 'demo',

];

以上配置将会执行 App/Demo/Models/Mycache.php类的Cache函数:


自定义任务Cron.php

在应用插件目录中创建自定义任务文件

例如:Myapp插件目录,那么文件位置是:

/dayrui/App/Myapp/Config/Cron.php

用于CMS进行“任务计划”操作时执行配置表中的方法,例如定时任务,自动运行等功能


自定义任务配置文件:



菜单配置文件

dayrui/App/模块或插件/Config/Menu.php

菜单配置文件用于模块菜单和插件菜单配置,安装之后自动创建后台菜单和用户菜单


格式要求:

 [


        '顶级菜单英文字母' => [
            'name' => '顶级菜单名称',
            'icon' => 'fa fa-sitemap',
            'left' => [
                '分组菜单英文字母' => [
                    'name' => '分组菜单名称',
                    'icon' => 'fa fa-sitemap',
                    'link' => [
                        [
                            'name' => '链接菜单名称',
                            'icon' => 'fa fa-sitemap',
                            'uri' => '链接菜单uri',
                        ],
                    ]
                ],




            ],
        ],


    ],

    // 用户菜单
    'member' => [

        '顶级菜单英文字母' => [
            'name' => '顶级菜单名称',
            'icon' => 'fa fa-cog',
            'link' => [
                [
                    'name' => '链接菜单名称',
                    'icon' => 'fa fa-cog',
                    'uri' => '链接菜单uri',
                ],
            ],
        ],

    ]

];


链接菜单URI格式介绍:

插件或模块目录/控制器名称/方法名称
控制器名称/方法名称
插件或模块目录/控制器名称/方法名称:参数1=值&参数2=值


同步执行接口Sync.php

文件路径:/dayrui/App/应用目录//Config/Sync.php


用于某个动作时的联动操作,目前支持的动作有:

1、删除内容时联动

delete_content

方法定义规范:

function xxxx($id, $siteid, $dirname) {
    // 内容id, 站点id,模块目录
}

2、删除会员账号时联动

delete_member

方法定义规范:

function xxxx($id) {
    // 会员id
}



文件语法:

 [
        'content' => 'shanchuhuiyuan',
        // 模型文件 => 方法名称
    ],

    'delete_content' => [
        'content' => 'shanchuneirong',
        // 模型文件 => 方法名称
    ],
];


应用联动缓存脚本cache.php

后台执行更新缓存时的联动脚本


文件:dayrui/App/应用目录/Config/Cache.php


内容格式:

 项目目录
 *
 **/

return [

    //'http' => 'httpapi',

];

模型名称是指:dayrui/App/应用目录/Models/Test.php,那么第一个参数就填写test(不区分大小写)

项目目录是指:应用目录,可以填写其他应用目录,也可以填写本身的应用目录


所有的模型文件需要定义cache方法,dayrui/App/应用目录/Models/Test.php,格式如下:


安装前的判断Before.php

/dayrui/App/应用目录/Config/Before.php

用于插件安装之前的验证判断


后台面板组件Main.php

应用插件可以将自己的数据页面展示到网站后台首页界面

https://www.xunruicms.com/doc/718.html

配置文件:

/dayrui/App/插件目录/Config/Main.php

文件内容格式:

 '面板中文名称',
    
];

可以多个面板文件

面板文件定义:

/dayrui/App/插件目录/Views/main/自定义面板模板文件名.html

内容语法和普通模板语法一致!!例如:


    
        
            
             {dr_lang('测试标题')} 
        
    
                      测试内容             

配置定义完成后,在后台自定义面板中可以看到此插件的面板文件名称

公共文件Init.php/插件函数

/dayrui/App/应用目录/Config/Init.php

用于模块或插件的公共php代码


1、用于写自定义函数,把函数放在里面,当前模块都能调用它


2、全局变量定义


3、全局判断方法的写法


4、Init.php文件是作为控制器的引入文件,它是继承控制器的

自动加载识别文件Auto.php


用于本应用的控制器自动加载类设置,用法如同

\CodeIgniter\Config\AutoloadConfig


自动加载识别文件:dayrui/App/应用目录/Config/Auto.php


语法格式:

 [
        
  

    ],

    /**
     * 类名映射关系
     */
    'classmap' => [
        
  
        
    ],
    
    
];


实现自动化引用类文件,可以对系统类路径进行重新,非常方便的开发方式


一、命名空间映射关系示例

1、创建自动加载识别文件:dayrui/App/Myapp/Config/Auto.php

 [
        
  'MyXunrui' => APPPATH.'Xunrui/', 
  // 前面的MyXunrui是命名空间的名称
  // 后面的是储存目录,专门储存用到 的类文件

    ],


    
];

2、创建其中一个测试类文件  dayrui/App/Myapp/Xunrui/Test.php

类文件首字母大写.php,

类方法名称必须和文件名保存一致,首字母大写,

必须声明namespace和(1)中的名称保持一致


3、创建控制器,来调用这个类

 dayrui/App/Myapp/Controllers/Test.php

test();
 }

}

此方法可以创建多个类文件,只需要按(2)中的命名来建立


4、访问

/index.php?s=myapp&c=test&m=index

就能输出 MYxunrui test



二、类名映射关系示例

1、创建自动加载识别文件:dayrui/App/Myapp/Config/Auto.php

 [
        
  'MyXunruiClass' => APPPATH.'xunrui.php',
        
    ],
    
    
];

2、创建这个文件APPPATH.'xunrui.php' 表示 dayrui/App/Myapp/xunrui.php


3、创建控制器,来调用这个类

 dayrui/App/Myapp/Controllers/Test.php

test(); // 这样就执行上面定义的类,不需要手动去加载他
 }

}

多个类需要在(1)中做多次映射


4、访问

/index.php?s=myapp&c=test&m=index

就能输出 test!


应用钩子Hooks.php

应用插件允许有自己的钩子配置文件


配置文件:

/dayrui/App/应用目录//Config/Hooks.php


文件内容格式:


开发者可以将钩子执行程序直接写在这个文件之中,不必再次去修改主程序的公共钩子文件config/hooks.php

用户权限Auth.php

应用插件可以将自己的内容权限页面展示到系统框架自带的权限设置界面中,如下手册区域:

https://www.xunruicms.com/doc/801.html


配置介绍部分


配置文件:

/dayrui/App/应用目录/Config/Auth.php


文件内容格式:

 [
        '插件页面下的.html'
    ],

    'module' => [
        '模块页面下的.html'
    ],

    'member' => [
        '用户页面下的.html'
    ],
];

一个插件支持多个权限页面配置。


html文件定义:

/dayrui/App/插件目录/Views/auth/文件名.html

内容语法和普通模板语法一致!!


配置定义完成后,在后台权限面板中可以看到此插件的对应文件配置



代码调用部分

一、app参数调用:

app参数例子【自定义页面】插件

image

// 以自定义页面插件为例子
if (\Phpcmf\Service::M('member_auth')->app_auth("APP目录名称:page", '存储值名称:show', $this->member)) {
    $this->_msg(0, dr_lang('您的用户组禁止访问自定义页面'));
    return;
}

注意例子中的name数组,一定要保持这种格式,不能增加和减少维数。


二、module参数调用:

module参数例子【评论系统】插件:

image

// 以自评论系统插件为例子,其中的demo表示demo模块
if (!\Phpcmf\Service::M('member_auth')->module_auth("APP目录名称:demo", "存储值名称:comment_add", $this->member)) {
    // 判断用户评论权限
    $this->_json(0, dr_lang('您的用户组无权限提交'));
}

注意例子中的name数组,一定要保持这种格式,不能增加和减少维数。


三、member参数调用:

1、配置文件

/dayrui/App/插件目录/Config/Auth.php
 [
        'test.html',
    ],

];


2、新建上述对应的test.html文件:

/dayrui/App/插件目录/Views/auth/test.html

默认代码如下:


    测试插件选项值
    
        
    
    测试插件勾选值                   

注意上面的name数组,一定要保持这种格式,不能增加和减少维数:

image

其中,my_test_value是文本值(只能存储数字)例子,my_test_use是单选值例子,其他值不能变


3、切换到权限配置的用户配置选项

image

4、程序开发中读取上例子中的my_test_value值

\Phpcmf\Service::M('member_auth')->member_auth('my_test_value', $this->member)

这里读取的是累计值,当用户拥有多个用户组时,这里读取的值是他多个身份的累计值,例如:

用户A同时拥有 【用户组1和用户组2】,而用户组1和用户组2分别设置了:10和20,那么,

如果要读取此用户在【用户组1和用户组2】的最大值,也就是只获取值是20。




modue标签默认条件Mwhere.php

模板的module标签或search标签循环条件:

dayrui/App/应用目录/Config/Mwhere.php

用于在前台模板列表界面的循环显示条件,比如增加一个状态字段,只显示这个状态的列表数据。


本教程只能用于插件类App


插件自动加载Composer类

本教程适用于CI内核;TP内核和LA内核已经自带Composer目录,不需要使用本教程。


自动初始化插件文件

dayrui/App/插件目录/Config/Auto.php



以QueryList类为例,如何自动加载进来呢?

1、通过QueryList官网的Composer命令下载源码到任意目录

2、将下载下来的vendor目录复制到插件的目录:

dayrui/App/插件目录Test/vendor


3、打开dayrui/App/插件目录Test/Config/Auto.php,加入代码


3、新建test控制器来使用QueryList类,

dayrui/App/Test/Controllers/Test.php

控制器内容如下:

find('img')->attrs('src');
        //打印结果
        print_r($data->all());
    }


}

这个例子代码是QueryList官方示例代码


4、运行程序地址:

http://www.xxxx.com/index.php?s=test&c=test&m=index



CSRF过滤白名单Filters.php

CSRF过滤白名单配置文件路径:

dayrui/App/插件目录/Config/Filters.php

配置内容格式:

 [
        '前台控制器的URI路径,数组内支持多组URI',
    ],
    'admin' => [
        '后台控制器的URI路径,数组内支持多组URI',
    ],
    'member' => [
        '用户中心控制器的URI路径,数组内支持多组URI',
    ],

];
将指定URI地址加入到以上白名单配置后,此地址进行POST提交数据时不进行跨站验证了。

自定义后台面板Panel.php

应用插件可以自定义整个网站后台首页界面


配置文件:

/dayrui/App/插件目录/Config/Panel.php


文件内容格式:

内容语法集成于控制器方法的语法规则,例如:


        \Phpcmf\Service::V()->assign([
            's' =>'传递变量'
        ]);
        \Phpcmf\Service::V()->display('显示指定模板.html');

更新表结构Update.php

文件路径:/dayrui/App/应用目录/Config/Update.php

更新表结构Update.php

同步执行更新数据结构的动作,例如升级插件时更新数据库结构、创建新表等等。

示例语法:

prefix;
$table = $prefix.'test';
if (!\Phpcmf\Service::M()->db->tableExists($table)) {
// 当表不存在时,创建这张表
    \Phpcmf\Service::M()->query(dr_format_create_sql('CREATE TABLE IF NOT EXISTS `'.$table.'` (
   `name` varchar(50) NOT NULL,
   `value` mediumtext NOT NULL,
   PRIMARY KEY (`name`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT=\'test\';'));
}

自定义字段 Myfield.php

本教程需要4.6.0及其以上版本使用(内部教程暂不公开使用)

Myfield.php是用于插件自定义字段的配置文件,例如内容系统中自定义模块字段、自定义栏目字段等等功能。

init(['table' => '表名'])->get($relatedid);
    if (!$data) {
        return dr_return_data(0, dr_lang('相关数据不存在(%s)', $relatedid));
    }

    return dr_return_data(1, 'ok', [
        'data' => $data,
        'name' => '某某字段',
        'backurl' => '', // 返回uri地址
    ]);
}

// 获取表名称
function myfield_tablename_xxxxxxxxx($field, $siteid, $relatedname, $relatedid) {

    $data = \Phpcmf\Service::M()->table('表名')->get($relatedid);
    if (!$data) {
        return;
    }

    return $field['ismain'] ? '自定义表前缀_'.$data['table'] : '自定义表前缀_'.$data['table'].'_data_{tableid}';
}


// 执行sql
function myfield_sql_xxxxxxxxx($sql, $ismain) {
    $table = \Phpcmf\Service::M()->dbprefix('自定义表前缀_'.\Phpcmf\Service::M('field')->data['table']); // 主表名称
    if (!\Phpcmf\Service::M()->db->tableExists($table)) {
        return;
    }
    if ($ismain) {
        // 更新主表 格式: 站点id_名称
        \Phpcmf\Service::M()->db->simpleQuery(str_replace('{tablename}', $table, $sql));
        \Phpcmf\Service::M('field')->_table_field[] = $table;
    } else {
        for ($i = 0; $i < 200; $i ++) {
            if (!\Phpcmf\Service::M()->db->query("SHOW TABLES LIKE '".$table.'_data_'.$i."'")->getRowArray()) {
                break;
            }
            \Phpcmf\Service::M()->db->simpleQuery(str_replace('{tablename}', $table.'_data_'.$i, $sql)); //执行更新语句
            \Phpcmf\Service::M('field')->_table_field[] = $table.'_data_'.$i;
        }
    }
}
// 字段是否存在
function myfield_field_xxxxxxxxx($name) {
    // 主表
    $table = \Phpcmf\Service::M()->dbprefix('自定义表前缀_'.\Phpcmf\Service::M('field')->data['table']);
    $rt = \Phpcmf\Service::M('field')->_field_exitsts('id', $name, $table, SITE_ID);
    if ($rt) {
        return 1;
    }
    // 附表
    $rt = \Phpcmf\Service::M('field')->_field_exitsts('id', $name, $table.'_data_0', SITE_ID);
    if ($rt) {
        return 1;
    }
    return 0;
}
// 更新缓存
function myfield_cache_xxxxxxxxx() {
   
}



自定义字段地址字符串:

dr_url("field/index", ["relatedname" => "xxxxxxxxx", "relatedid"=>9999某表数据的id号])