帝国CMS8.0新增信息自动加入父信息功能实现教程
时间:2026-08-13 22:21:55 来源:aliz.cn 作者:SKY 阅读:
原创实测|适用于帝国 CMS 8.0 版本。帝国 CMS 原生父子信息功能,发布内容时需要人工手动勾选父信息,效率很低。很多项目需求:发布资讯自动绑定父信息,无需后台手动操作,支持新增、编辑、删除联动,存量历史文章批量导入父子关联。
一、什么是帝国 CMS 父子信息
父子信息是帝国 CMS 内置的聚合功能,可以把多条子信息归属到一条父信息下面。
- 父信息:作为聚合容器,需要先将普通信息转为父信息;
- 子信息:普通资讯,绑定之后,父信息页面可以调用全部子内容;
- 默认行为:发布文章必须后台手动选择父信息,没有自动绑定机制。
实际开发经常遇到需求:发布某栏目文章,自动归入指定父信息,减少人工操作。本文提供两套方案:零代码模板方案、PHP 钩子写入数据库方案。
方案一:零代码模板调用(不改程序,优先推荐)
适用场景:只需要前台页面展示子信息,不需要后台「管理子信息」面板看到关联记录。 不操作数据库,直接灵动标签读取栏目下全部内容充当子信息,升级帝国 CMS 不会丢失功能。
html
预览
[e:loop={"select * from [!db.pre!]ecms_news where classid in (select classid from [!db.pre!]enewsclass where bclassid=$navclassid) order by newstime desc",20,0,0}]
<li>
<a href="<?=$bqr[titleurl]?>"><?=$bqr[title]?></a>
<span><?=date('Y‑m‑d',$bqr[newstime])?></span>
</li>
[/e:loop]
优点
- 无需修改 PHP 源码,系统升级不受影响;
- 无数据库写入,性能损耗小。
缺点
- 后台父子信息管理列表看不到绑定关系;
- 不能使用
[e:indexloop]索引灵动标签调用。
方案二:userfun.php 钩子实现自动写入父子信息(完整原生父子功能)
适用场景:需要后台管理子信息,使用官方索引灵动标签调用子信息。 /e/class/userfun.php是帝国 CMS 官方预留二次开发钩子文件,升级 CMS 不会覆盖此文件。打开
e/class/userfun.php,在文件末尾 ?> 之前粘贴完整代码。php
运行
<?php
/**
* aliz.cn 帝国CMS8.0 新增信息自动加入父信息
* user_AddNews 新增信息完成后触发
* user_EditNews 修改信息完成后触发
* user_DelNews 删除信息触发
*/
function user_AddNews($add){
global $empire,$dbtbpre;
// 配置自动绑定父信息ID,多个ID逗号分隔
$autofzid = "100";
$infoid = $add['id'];
$fzids = explode(',',$autofzid);
foreach($fzids as $fzid){
$fzid = (int)$fzid;
if(!$fzid || !$infoid){
continue;
}
// 判断是否已存在关联,避免重复插入
$rs = $empire->fetch1("select fid from {$dbtbpre}enewsfzinfo where fid='$fzid' and infoid='$infoid' limit 1");
if(empty($rs['fid'])){
$empire->query("insert into {$dbtbpre}enewsfzinfo(fid,infoid,fzclassid) values('$fzid','$infoid','0')");
}
}
}
// 修改信息同步更新绑定关系
function user_EditNews($add){
user_AddNews($add);
}
// 删除信息清除父子关联记录
function user_DelNews($add){
global $empire,$dbtbpre;
$infoid = $add['id'];
$empire->query("delete from {$dbtbpre}enewsfzinfo where infoid='$infoid'");
}
?>
使用步骤
- 修改代码中
$autofzid = "100",替换成自己实际父信息 ID;多个父信息$autofzid="100,101"; - 后台找到对应信息,点击转为父信息,普通文章不能直接充当父信息;
- 保存
userfun.php,编码必须为 UTF‑8 无 BOM,文件末尾不要多余空行; - 后台新增一篇测试文章,进入父信息的【管理子信息】,即可看到自动加入的子信息。
进阶:不同栏目发布对应不同父信息 ID
不同栏目发布内容绑定不一样父信息,使用栏目 ID 映射配置:
php
运行
function user_AddNews($add){
global $empire,$dbtbpre;
$classid = (int)$add['classid'];
//栏目ID => 父信息ID
$map = [
5 => 100,
6 => 101
];
if(!isset($map[$classid])){
return;
}
$autofzid = $map[$classid];
$infoid = $add['id'];
$fzids = explode(',',$autofzid);
foreach($fzids as $fzid){
$fzid=(int)$fzid;
if(!$fzid||!$infoid) continue;
$rs = $empire->fetch1("select fid from {$dbtbpre}enewsfzinfo where fid='$fzid' and infoid='$infoid' limit 1");
if(empty($rs['fid'])){
$empire->query("insert into {$dbtbpre}enewsfzinfo(fid,infoid,fzclassid) values('$fzid','$infoid','0')");
}
}
}
父信息页面前台调用子信息示例
使用官方索引灵动标签读取父信息下面全部子内容:
html
预览
[e:indexloop={100,15,0}]
<div class="list‑item">
<a href="[!--titleurl--]">[!--title--]</a>
<div class="time">[!--newstime--]</div>
</div>
[/e:indexloop]
存量历史文章批量绑定父信息 SQL
⚠️操作前务必备份数据库,替换100父 ID,classid=5指定栏目。
sql
INSERT INTO [!db.pre!]enewsfzinfo(fid,infoid,fzclassid)
SELECT 100,id,0 FROM [!db.pre!]ecms_news WHERE classid=5
ON DUPLICATE KEY UPDATE fid=fid;
常见问题排查
- 新增文章没有自动加入父信息
userfun.php文件编码 UTF‑8 无 BOM,末尾不能多余换行空格;- 确认目标信息已经手动转为父信息,普通资讯无法作为父信息;
- 代码只对新增 / 新编辑文章生效,旧文章需要执行上面 SQL 批量处理。
- 出现重复父子关联记录 代码自带存在性判断,正常不会重复写入;如果手动后台多次绑定,可清空表重新执行批量 SQL。
- 升级帝国 CMS 后功能失效 不要修改
hinfofun.php核心文件,全部逻辑写在userfun.php,升级不会覆盖此文件。
两种方案对比
表格
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 模板灵动标签读取 | 不改源码,升级无影响 | 后台看不到父子管理记录 | 只做前台展示,不需要后台管理子信息 |
| userfun 钩子写入数据库 | 完整原生父子信息能力,后台可管理子信息 | 需要少量 PHP 代码修改 | 需要后台管理子信息,使用 indexloop 索引标签 |
本文配套模板、静态源码可前往艾立兹素材库alisucai.com下载
发表评论
共有0条评论