欢迎访问艾立兹站 Aliz- 专注建站教程与技术分享
您当前的位置:首页 > 建站教程 > 帝国 CMS 教程

帝国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]

优点
  1. 无需修改 PHP 源码,系统升级不受影响;
  2. 无数据库写入,性能损耗小。

缺点
  1. 后台父子信息管理列表看不到绑定关系;
  2. 不能使用[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'");
}
?>

使用步骤

  1. 修改代码中 $autofzid = "100",替换成自己实际父信息 ID;多个父信息 $autofzid="100,101"
  2. 后台找到对应信息,点击转为父信息,普通文章不能直接充当父信息;
  3. 保存 userfun.php,编码必须为 UTF‑8 无 BOM,文件末尾不要多余空行;
  4. 后台新增一篇测试文章,进入父信息的【管理子信息】,即可看到自动加入的子信息。

进阶:不同栏目发布对应不同父信息 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;

常见问题排查

  1. 新增文章没有自动加入父信息
  • userfun.php 文件编码 UTF‑8 无 BOM,末尾不能多余换行空格;
  • 确认目标信息已经手动转为父信息,普通资讯无法作为父信息;
  • 代码只对新增 / 新编辑文章生效,旧文章需要执行上面 SQL 批量处理。
  1. 出现重复父子关联记录 代码自带存在性判断,正常不会重复写入;如果手动后台多次绑定,可清空表重新执行批量 SQL。
  2. 升级帝国 CMS 后功能失效 不要修改hinfofun.php核心文件,全部逻辑写在userfun.php,升级不会覆盖此文件。

两种方案对比


表格
方案 优点 缺点 适用场景
模板灵动标签读取 不改源码,升级无影响 后台看不到父子管理记录 只做前台展示,不需要后台管理子信息
userfun 钩子写入数据库 完整原生父子信息能力,后台可管理子信息 需要少量 PHP 代码修改 需要后台管理子信息,使用 indexloop 索引标签

本文配套模板、静态源码可前往艾立兹素材库alisucai.com下载

发表评论 共有0条评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
公众号二维码

扫码关注公众号
获取全套技术教程