top-image

OLDER ARTICLES

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

/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 bool
  if (!$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 bool
  if ($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();}

在相应内容输出前,可以使用如下语法额外对数据进行处理;

{php}
// 这里可以写原生 PHP;
$myVar = "变量值";
{/php}
<p>输出一个自定义变量:{$myVar}</p>
<p>当前 Z-BlogPHP 版本是:{$version}</p>

//还可以用<?php ?>符号在{php}{/php}里以实现代码高亮
{php}<?php

//原生php代码

?>{/php}

 

页面公共模板文件

模板文件 说明
header.php 公共头部文件
footer.php 公共尾部文件

首页与列表页相关模板

模板文件 说明
index.php 首页及列表页主模板文件
post-multi.php 摘要文章模板
post-istop.php 置顶文章模板
pagebar.php 页码模板

日志/独立页相关模板

模板文件 说明
single.php 文章页(单页)主模板文件
post-single.php 日志页文章模板
post-page.php 独立页面模板
comments.php 评论区模板
comment.php 每条评论内容显示模板
commentpost.php 评论发送表单模板
commentpost-verify.php 评论验证码模板(1.5 新增)

侧栏模块相关模板

  • 模块展现外框架模板
模板文件 说明
sidebar.php 默认侧栏模板,可自定义 sidebar2.php~`sidebar9.php` 用于后续侧栏调用
module.php 模块显示模板,可定义模块标题等格式,模块具体内容格式由下列细节模板决定
  • 模块内容细节模板(1.5 版本及以上)
模板文件 说明 备注(默认列表行数)
module-archives.php 文章归档模块 没有限制
module-authors.php 作者列表模块 没有限制
module-calendar.php 日历模块 没有限制
module-catalog.php 分类列表模块 没有限制
module-navbar.php 导航条模块 没有限制
module-statistics.php 站点信息模块 没有限制
module-comments.php 最近评论列表模块 10
module-previous.php 最近文章列表模块 10
module-tags.php 标签列表模块 25

对于 MySQL ,其utf8并非标准的UTF-8。在 5.5.3 之后新增了utf8mb4来解决这个问题;

「Z-BlogPHP 1.7.0」起将默认使用utf8mb4编码创建数据表;

对于现有数据库,可按如下操作进行修改:

  1. 进入「phpMyAdmin」或其他数据库管理工具;
  2. 选择相应数据库,(默认为「结构」视图);
  3. 点击「操作」选项卡,更改「排序规则」为utf8mb4_general_ci
  4. 点击「执行」即可应用到所有表和所有表列字段!

root 级管理员拥有系统最高权限,可以上传应用,导出应用,删除应用和更新系统

取消 root 级管理员的 root 权限后将不能安装新应用,删除应用,导出应用和更新系统

  • 启用应用中心客户端的安全模式

禁止上传安装新应用及导出应用和系统更新,这是最简单和快捷的方式

  • 取消 root 级管理员的 root 权限

在 「Z-BlogPHP 1.7.3」及更高版本,可以使用 .env 文件:

  1. 在系统目录下放置 .env 文件,在其中加入代码

ZBP_PRESET_DISABLE_ROOT=1

在 「Z-BlogPHP 1.7.2」及更高版本,可以使用以下三种方法实现:

  1. 修改 c_system_base.php,在其中加入代码

define('ZBP_PRESET_DISABLE_ROOT', 1);

  1. 修改 php-fpm 的配置文件 conf,加入代码,并重启 php-fpm

env[ZBP_PRESET_DISABLE_ROOT]=1

  1. 修改 nginx 的配置文件,在 location ~ \.php$ {} 加入代码,并重启 nginx

fastcgi_param ZBP_PRESET_DISABLE_ROOT 1;

常规开启调试模式是在后台设置中进行,在后台设置的全局设置里打开“调试模式”并保存即可。

如果网站程序出错,不能进入后台进行设置,那么在 1.7.3 及更高版本可以在这样设置:

使用空间面板的文件管理或者 FTP 修改文件:path/zb_users/c_option.php

'ZC_DEBUG_MODE' => true, //开启Debug,如果调试完毕请删除这一行

path:当前博客程序所放置的路径,比如/home/wwwroot/www.zblogcn.com

1.7.2 版本可以修改zb_system\function\c_system_base.php,取消第 22 行代码的注释状态后保存;

// defined('ZBP_DEBUGMODE') || define('ZBP_DEBUGMODE', true);
// 修改为 ↓↓
defined('ZBP_DEBUGMODE') || define('ZBP_DEBUGMODE', true);

使用空间面板的文件管理或者 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 之前的版本,请覆盖 1.6.0 及之后的程序包(zb_system)。

注 2:ZC_PERMANENT_DOMAIN_FORCED_URL 的意义为 强制开启固定域名功能并直接指定域名为固定域名

  • 使用空间面板的文件管理或者 FTP 修改文件:path/zb_users/c_option.php

  • 如果是固定域名出错,需要关闭固定域名功能,请在 c_option.php增加项目:

    'ZC_PERMANENT_DOMAIN_ENABLE' => false, //1.7.3版本及以后版本使用
    
    //或是
    'ZC_PERMANENT_DOMAIN_WHOLE_DISABLE' => true, //1.7.2及以下版本使用

    如果是设置了 ZC_PERMANENT_DOMAIN_FORCED_URL 项目强制开启固定域名功能的,请删除 ZC_PERMANENT_DOMAIN_FORCED_URL => ‘domain’, 这一行配置

    这样就会跳过固定域名功能,然后访问正确的域名进网站

  • 如果之前配置的固定域名不能访问,需要更改为正确的域名

    #
    'ZC_PERMANENT_DOMAIN_FORCED_URL' => "https://更正的域名/",
    #如果你不希望再用固定域名,那就在option.php里删除这一行

     

使用空间面板的文件管理或者 FTP 修改文件:path/zb_users/c_option.php;
配置项:
//关闭CSRF保护功能(出现非法访问请关闭)
'ZC_LOGIN_CSRFCHECK_ENABLE' => false,

使用空间面板的文件管理或者 FTP 修改文件:path/zb_users/c_option.php;配置项:

//关闭验证码功能(出现验证码出错请关闭)
'ZC_LOGIN_VERIFY_ENABLE'    => false,

Page 923 of 1049:« First« 920 921 922 923 924 925 926 »Last »
bottom-img