一、bdinfoid(绑定信息ID)是什么
bdinfoid = Bound Info ID(绑定信息ID),是帝国CMS enewsclass 栏目表中的一个字段。
一句话概括
它让一个栏目的访问行为从"展示信息列表"变成直接展示某一条指定的信息内容。
打个比方:导航栏上有一个"公司简介"栏目,正常情况点进去是文章列表页,但如果你把某篇"公司简介"信息绑定到这个栏目上,用户点击后直接看到那篇文章的内容,不再经过列表页。
数据格式
栏目ID,信息ID
例如 bdinfoid = "5,123" 表示绑定栏目5下的第123号信息。
二、怎么用(操作步骤)
2.1 前提准备
先在"管理信息"中发布好一条要绑定的内容。
2.2 栏目设置
- 进入后台 → 栏目管理 → 修改栏目
- 找到 页面显示模式,选择 "栏目绑定信息"
- 在出现的输入框中填写
栏目ID,信息ID,例如5,123 - 提交保存
2.3 验证
访问该栏目的前端页面,应该直接看到那条信息的内容,而不是列表页。
2.4 编辑绑定信息
后台栏目编辑页提供快捷入口,点击 [修改信息] 可直接在新窗口编辑被绑定的内容。
三、应用场景
| 场景 | 示例栏目 | 说明 |
|---|---|---|
| 单页类栏目 | 关于我们、联系方式、免责声明 | 只需展示固定内容,无需列表 |
| 活动落地页 | 某营销活动 | 独立栏目入口直达活动详情 |
| 产品直达 | 某产品名称 | 栏目名称即产品名,直接展示产品信息 |
核心价值:内容维护在信息管理模块,栏目只是一个"入口指针"。修改信息内容后,栏目自动同步,无需单独维护栏目页。
四、工作机制
4.1 核心:islist 字段
islist 是 enewsclass 表中控制栏目页面显示模式的字段。一共有四种模式:
| 模式 | islist 值 | 数据来源 | 页面内容 |
|---|---|---|---|
| 封面式 | 0 | 封面模板 | 独立设计,不依赖信息 |
| 列表式 | 1 | 多条信息 | 分页列表、筛选、排序 |
| 页面内容式 | 2 | 栏目附加表 | 直接在栏目录入内容 |
| 栏目绑定信息 | 3 | 单条信息 | 复用已有信息,零维护 |
islist==3 就是栏目绑定信息模式,它是 bdinfoid 生效的前提——只有 islist 设为 3,系统才会去读 bdinfoid 的值。
4.2 工作流程简图
用户点击栏目
│
▼
islist == 3?───否──→ islist 0/1/2 走各自分支
│
是
│
▼
栏目的页面 = 绑定信息的内容
│
▼
用户直接看到那条信息
五、核心代码流程
5.1 入库:非绑定模式清空 bdinfoid
e/class/classfun.php:只有 islist==3 才保存 bdinfoid,其他模式一律清空。
if ($add['islist'] == 3) {
$add['bdinfoid'] = RepPostVar($add['bdinfoid']);
} else {
$add['bdinfoid'] = '';
}
5.2 列表页拦截:禁止访问
e/action/ListInfo/index.php:终极栏目 + islist==3 → 直接拒绝访问列表页。
if ($class_r[$classid]['islast'] && $cr['bdinfoid']) {
printerror("ErrorUrl", "history.go(-1)", 1);
}
5.3 栏目页生成:用绑定信息替代列表
e/class/functions.php:生成栏目页时检测到 bdinfoid,调用 ReClassBdInfo()。
if (!empty($cr['bdinfoid'])) {
ReClassBdInfo($classid);
return '';
}
5.4 ReClassBdInfo:核心处理函数
function ReClassBdInfo($classid) {
$cr = $empire->fetch1("select classid,bdinfoid
from enewsclass where classid='$classid'");
if (!$cr['classid'] || !$cr['bdinfoid']) return '';
// 解析 bdinfoid → [0]=栏目ID, [1]=信息ID
$infor = explode(',', $cr['bdinfoid']);
$infofile = GetInfoFilename(intval($infor[0]), intval($infor[1]));
if ($infofile && file_exists($infofile)) {
// 优先使用已生成的信息静态文件
$classtext = ReadFiletext($infofile);
} else {
// 没有静态文件 → meta refresh 跳转到动态地址
$classtext = ReClassBdInfoDtHtml($infor[0], $infor[1]);
}
// 写回栏目的静态文件
$classfile = eReturnTrueEcmsPath() . ReturnSaveClassPath($classid, 1);
WriteFiletext_n($classfile, $classtext);
}
5.5 动态回退机制
当绑定信息未生成静态文件时,用 meta refresh 跳转到动态地址:
function ReClassBdInfoDtHtml($classid, $id) {
$infourl = $public_r['newsurl'] . 'e/public/InfoUrl/?classid='
. $classid . '&id=' . $id;
return '<meta http-equiv="refresh" content="0;url=' . $infourl . '">';
}
5.6 完整数据流
用户访问栏目 URL
│
▼
栏目静态文件已存在?──是──→ 展示(内容即绑定信息的内容)
│
否
│
▼
读取 enewsclass.bdinfoid → 解析 "classid,infoid"
│
▼
信息静态文件存在?──是──→ 读取文件 → 写入栏目静态文件 → 展示
│
否
│
▼
生成 meta refresh → 跳转到 e/public/InfoUrl/?classid=X&id=Y
│
▼
动态展示信息内容
六、注意事项
- 格式必须正确:
栏目ID,信息ID(英文逗号),缺少任一部分后台会弹窗报错 - 仅终极栏目生效:
islast=1时 bdinfoid 才参与列表页拦截 - 信息不能删除:绑定的信息如果被删除,栏目页会跳转到空页面或报错
- 静态生成依赖:栏目静态页内容直接拷贝自信息静态页,需要先生成信息静态文件
- islist 不可随意切换:从"栏目绑定信息"切回其他模式,bdinfoid 会被自动清空
- 分类信息同样支持:
enewsfz_class表也包含 bdinfoid 字段,逻辑与主栏目一致


