ZBlog插件开发文件结构(插件)

news/2024/11/15 12:08:45/文章来源:https://www.cnblogs.com/hwrex/p/18378864

以下基于通过「创建应用」生成的初始文件:

/path/zb_users/plugin/demoPlugin
│  logo.png       [必需]图标,128x128;
│  plugin.xml     [必需]自述文件;
│  main.php       [可选]应用内置管理页,在创建插件时填写才会生成;
│  include.php    [可选]应用嵌入页,在创建插件时填写才会生成;

自动创建的文件最多只有上边四个,可依据需要自行创建需要的文件夹及文件:

│  function.php   [可选]根目录下除了这个外不建议放置额外的「*.PHP」文件;
│                      「function.php」放不下的,可以拆分后放置到「function」文件夹;
├─class           [可选]放置 class 定义文件,;
├─css             [可选]CSS 样式文件,前后台尽量分开;
├─script          [可选]JS 脚本目录,前后台尽量分开;
└─other           [可选]其他任意自定义文件夹及内容

Hello Z-Blog

  1. 使用demoPlugin为「应用 ID」创建一个应用,
    • 「应用名称」填写「第一个插件」;
    • 其他信息保持默认;
  2. 不需要额外创建文件
  3. 使用下边代码「覆盖」「include.php」的内容;
    • 可直接点击「Copy to clipboard」按钮复制;
  4. 「启用插件」后浏览任意「前台页面」即可查看效果;
<?php
// 如果有其他 PHP 文件可以在这里引入,或者在需要的地方「按需要引入」
// require __DIR__ . "function.php";
// require __DIR__ . "class/db.php";
# 注册插件
RegisterPlugin("demoPlugin", "ActivePlugin_demoPlugin");
// 注册接口函数
function ActivePlugin_demoPlugin()
{// 向名为'Filter_Plugin_Index_Begin'的接口注册函数Add_Filter_Plugin('Filter_Plugin_Index_Begin', 'demoPlugin_HelloZBlog');
}
// 接口函数定义
function demoPlugin_HelloZBlog()
{// 注意,在函数中使用变量 $zbp 前应进行全局声明global $zbp;// 向前台页面的 <head></head> 内部插入内容$zbp->header .= "<script>alert(\"hello {$zbp->user->Name}\")</script>";// 读取插件配置项$InstallTime = $zbp->Config('demoPlugin')->InstallTime;$zbp->header .= "<script>alert(\"「demoPlugin」插件首次启用时间为 {$InstallTime}\")</script>";
}
// 插件启用时调用
function InstallPlugin_demoPlugin()
{global $zbp;$InstallTime = date('Y-m-d H:i:s');// 判断配置项是否存在// $zbp->HasConfig('插件ID'); //return boolif (!$zbp->HasConfig('demoPlugin')) {$zbp->Config('demoPlugin')->version = 1;$zbp->Config('demoPlugin')->InstallTime = $InstallTime;$zbp->SaveConfig('demoPlugin');}
}
// 插件关闭时调用
function UninstallPlugin_demoPlugin()
{global $zbp;// 存在相应开关选项并且状态为开启时,删除当前插件配置// $zbp->Config('插件ID')->HasKey('配置名'); //return boolif ($zbp->Config('demoPlugin')->HasKey('DelConfig') && $zbp->Config('demoPlugin')->DelConfig == 1) {$zbp->DelConfig('demoPlugin');}
}

注册及接口挂载

Z-BlogPHP 系统的插件是采用主动插入方式来通知系统。所以必须在「include.php」文件中调用RegisterPlugin函数才能让插件进入系统的插件体系。

// 注册插件
RegisterPlugin("插件ID","ActivePlugin_插件ID");

然后在ActivePlugin_插件ID中完成「大部分」接口的挂载;

// 具体的接口挂接
function ActivePlugin_插件ID() {Add_Filter_Plugin('API名称','执行代码(函数)');
}

注:可按需在挂载接口前进行判断;也可在接口 A 内部挂载接口 B。

「启用 / 停止 / 更新」插件时执行

可按如下示例定义函数,将在插件执行对应操作时自动调用;

function InstallPlugin_插件ID(){}
function UninstallPlugin_插件ID(){}
function UpdatePlugin_插件ID(){}
// 旧版兼容
function 插件ID_Updated(){UpdatePlugin_插件ID();}

插件状态判断

// 插件未启用直接退出本页面(一般用于配置页面)
if (!$zbp->CheckPlugin('插件ID')) {$zbp->ShowError(48);die();}

用户权限判断

在默认生成的main.php中,除了上边的$zbp->CheckPlugin()调用外,还有如下判断用户权限的指令:

// `root` 既管理员权限
$action='root';
if (!$zbp->CheckRights($action)) {$zbp->ShowError(6);die();}

$zbp->CheckRights()用于判断「当前用户」(包括游客)是否有权执行传入参数代表的某项操作,可配合「用户等级」对权限进行细化管理;

可以通过 -host-/zb_system/cmd.php?act=misc&type=vrs查看当前用户拥有的权限;

可针对用户等级灵活制定其权限;「Z-Blog 角色分配器 - Z-Blog 应用中心」

参考「用户等级划定」;

插件配置数据存取

「Hello Z-Blog」中已有相应用例,以下为逐条讲解;

「配置项」的「值」可以是数字字符串数组;对于PHP 对象,理论上需要能够被序列化,实际使用中建议转为JSON保存;

1、设置并保存配置选项

$zbp->Config('插件ID')->配置名 = 值;
$zbp->SaveConfig('插件ID');

2、读取配置选项

$s = $zbp->Config('插件ID')->配置名;
echo $s;

3、判断配置选项是否已创建

$zbp->HasConfig('插件ID'); //return bool

4、判断配置选项某一键值是否存在

$zbp->Config('插件ID')->HasKey('配置名'); //return bool

5、删除某一配置

$zbp->Config('插件ID')->DelKey('配置名');
$zbp->SaveConfig('插件ID');

6、删除配置

停用插件时可以选择删除配置项,通常我们建议保留配置以备下次重新启用,或者提供专门的开关选项由用户确认删除;

$zbp->DelConfig('插件ID');

CSRF 相关 「重要

对于需要用户点链接或提交表单触发,进而对数据或文件产生影响的,除必要的用户权限验证外,应另外加入 CSRF Token 验证;

通过 GET 方法提交,如果您的目标地址是 cmd.php,那么您可以使用以下函数:

<?php echo BuildSafeCmdURL('act=TagPst'); ?>

如果不是,那么您也可以直接:

<?php echo BuildSafeURL('main.php'); ?>

通过 POST 方法提交,您可以在 form 表单内加入

<input type="hidden" name="csrfToken" value="<?php echo $zbp->GetCSRFToken();?>">

对于应用内的,比如保存配置项,上传文件等操作中,可使用CheckIsRefererValid();进行验证;

if (count($_POST) > 0) {CheckIsRefererValid();// 你的代码,以下为示例// 配置项保存 ↓foreach ($_POST as $key => $value) {$zbp->Config("demoPlugin")->$key = $value;}$zbp->SaveConfig("demoPlugin");// 结束$zbp->SetHint('good');Redirect('./main.php');
}

注:对于旧版本 Z-Blog PHP,可能需要先判断:if (function_exists('CheckIsRefererValid')) {CheckIsRefererValid();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/787043.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZBlog模板内使用PHP

在相应内容输出前,可以使用如下语法额外对数据进行处理; {php} // 这里可以写原生 PHP; $myVar = "变量值"; {/php} <p>输出一个自定义变量:{$myVar}</p> <p>当前 Z-BlogPHP 版本是:{$version}</p>//还可以用<?php ?>符号在{ph…

ZBlog开启固定域名功能

使用空间面板的文件管理或者 FTP 修改文件:path/zb_users/c_option.php;配置项:ZC_PERMANENT_DOMAIN_FORCED_URL => "https://www.newdomin.site/",path:当前博客程序所放置的路径,比如/home/wwwroot/www.zblogcn.com; 注:如果是 1.6.0 之前的版本,请覆盖…

ZBlog强制开启 Debug 调试模式

常规开启调试模式是在后台设置中进行,在后台设置的全局设置里打开“调试模式”并保存即可。 如果网站程序出错,不能进入后台进行设置,那么在 1.7.3 及更高版本可以在这样设置: 使用空间面板的文件管理或者 FTP 修改文件:path/zb_users/c_option.php; ZC_DEBUG_MODE =>…

ZBlog固定域名出错不能登入怎么办

使用空间面板的文件管理或者 FTP 修改文件:path/zb_users/c_option.php;如果是固定域名出错,需要关闭固定域名功能,请在 c_option.php增加项目: ZC_PERMANENT_DOMAIN_ENABLE => false, //1.7.3版本及以后版本使用//或是 ZC_PERMANENT_DOMAIN_WHOLE_DISABLE => true,…

tips in windows/ 1.windows文件路径最长限制

1.windows文件路径最长限制场景:在用文件资源管理器删除名称超过255字符的文件(文件名最大字符限制就是255)时,发现删除不了,也没反应原因:windows删除调用的是explorer,对路径限制不能超过260,此时超过了,但又由于是应用层,所以不会直接给以报错。使用杀毒软件可以是…

ZBlog网站密码重置Z-BlogPHP 密码找回工具

注:nologin.php 非常的危险,使用后请立即删除。 对于有终端权限的空间,可以使用下边命令直接获取密码重置工具,改名后相对可以提升一些安全性: wget https://raw.githubusercontent.com/zblogcn/zblogphp/master/utils/nologin.php && mv nologin.php "nolog…

ZBlog从环境变量中读取数据库配置

c_option.php 配置文件中参数的值为Zbp_GetEnv(环境变量名),就会用 Zbp_GetEnv 函数读取环境变量的值 (1.7.3 开始支持) 那么 ZC_MYSQL_SERVER, ZC_MYSQL_USERNAME, ZC_MYSQL_PASSWORD, ZC_MYSQL_NAME 这 4 个参数的值就会从 Zbp_GetEnv(DB_HOST) 等中获取 // c_option.php 示…

十五张图带你快速入门 shardingsphere-proxy

Apache ShardingSphere 是一款分布式的数据库生态系统,它包含两大产品:ShardingSphere-Proxy ShardingSphere-JDBC很多同学对于 ShardingSphere-JDBC 已经能非常熟悉的使用了,但关于网上关于 ShardingSphere-Proxy 5.5 的使用教程却非常少。 所以这篇文章,笔者尝试带大家快…

ZBlog关于使用PHP7出现错误的提示

若出现以下错误: (2)E_WARNING : Leaked 1 hashtable iterators (register_shutdown_function) (150101) (Linux; nginx1.9.12; PHP 7.0.4; mysqli; curl) 最简单的解决方案:请升级到PHP 7.0.5以上版本。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各…

ZBlog禁止直接在数据库内使用rand()进行随机读取

很多开发者喜欢用类似以下的代码来取得随机文章:$array = $zbp->GetArticleList(array(*),$where,array(rand()=> ),array($numm),);这样做有以下问题:1. 不支持MySQL之外的数据库;2. 数据量上万即奇慢无比。 所以,除非特殊情况,我们今后不再允许代码含直接在数据库…