侧栏模块重建扩展
Filter_Plugin_Zbp_BuildModule 是 Z-BlogPHP 的生成模块内容接口,在 Zbp::BuildModule() 内、ModuleBuilder::Build() 正式重建模块之前触发。回调没有参数,典型用法是在重建开始前调用 $zbp->AddBuildModule() 把需要刷新的模块加入本轮重建队列。后台发表文章、删除评论、保存设置等操作引发模块重建时都会执行该接口。
接口信息
| 接口 | 参数 | 说明 |
|---|---|---|
Filter_Plugin_Zbp_BuildModule | 无 | Zbp 类的生成模块内容的接口 |
完整案例
下例注册一个自定义"站点公告"模块,并在每次模块重建时把它加入重建队列,使公告内容随模块重建持续刷新:
php
<?php
RegisterPlugin("demoAPP", "ActivePlugin_demoAPP");
function ActivePlugin_demoAPP()
{
Add_Filter_Plugin('Filter_Plugin_Zbp_RegBuildModules', 'demoAPP_RegBuildModules');
Add_Filter_Plugin('Filter_Plugin_Zbp_BuildModule', 'demoAPP_Zbp_BuildModule');
}
// 注册模块构建函数
function demoAPP_RegBuildModules()
{
global $zbp;
$zbp->RegBuildModule('demoAPP_notice', 'demoAPP_BuildNotice');
}
// 每次重建模块前,把自定义模块加入本轮重建队列
function demoAPP_Zbp_BuildModule()
{
global $zbp;
$zbp->AddBuildModule('demoAPP_notice');
}
// 构建函数的返回值会写入模块 Content 并保存到数据库
function demoAPP_BuildNotice()
{
global $zbp;
$count = $zbp->cache->normal_article_nums;
return '<ul><li>本站已发布文章 ' . (int) $count . ' 篇,感谢支持。</li></ul>';
}
// 启用插件时创建模块记录
function InstallPlugin_demoAPP()
{
global $zbp;
if (!isset($zbp->modulesbyfilename['demoAPP_notice'])) {
$m = new Module();
$m->Name = '站点公告';
$m->FileName = 'demoAPP_notice';
$m->Source = 'plugin_demoAPP';
$m->HtmlID = 'demoAPP_notice';
$m->Type = 'ul';
$m->Content = '';
$m->Save();
}
}启用插件后把"站点公告"模块加入侧栏,之后每次后台操作触发模块重建时,公告内容都会由构建函数重新生成。
注意事项
- 该接口属于运行期接口,无参数也无返回值语义,触发位置在
ModuleBuilder::Build()之前,适合做重建前的队列准备; - 触发时机与内容变化绑定:后台保存或删除文章、评论、分类、标签、用户、模块,保存全局设置,切换主题等操作会调用
BuildModule(),对应 API 操作同样会触发; - 模块构建函数的返回值写入模块
Content字段并保存到数据库,重建后前台展示的是保存后的内容,不在渲染时动态执行; AddBuildModule()只会把已存在模块记录的文件名加入重建队列,插件需在安装时创建模块记录并注册构建函数(见案例);- 系统默认的 9 个模块(catalog、calendar、comments 等)由
RegBuildModules()注册,如需注册自定义模块构建函数应配合Filter_Plugin_Zbp_RegBuildModules接口。