自定义模型创建后,前台列表页死活不显示内容?
你建好了“产品中心”模型,添加了十几个字段,后台也录入了几十条数据,但前台列表页却是一片空白,别急着怀疑人生,先按以下三步排查:
第一步:检查模型是否绑定了系统模型ID
帝国CMS的自定义模型需要继承“新闻系统模型”或“商城系统模型”,否则前台无法正常检索,登录后台 → 系统设置 → 数据表管理 → 找到你的模型表,确认“所属系统模型”为1(新闻)或2(商城),若为0则需手工修改。
帝国CMS二次开发实战,从索引优化到模板调用的完整排坑指南
第二步:确认列表模板是否调用了正确的频道ID
在列表模板中,如果用灵动标签调用,请检查 $GLOBALS['navclassid'] 是否传参正确。
<?php
$sql = "SELECT * FROM {$dbtbpre}ecms_product WHERE checked=1 ORDER BY newstime DESC LIMIT 10";
$result = $empire->query($sql);
while($row = $empire->fetch($result)) {
echo $row['title'].'<br>';
}
?>
若没有输出,尝试在SQL前加 echo $sql; 打印语句,看看是否漏掉了 classid 条件。
第三步:检查是否未生成“列表索引”
帝国CMS在自定义模型创建后,需要手动点击“更新信息列表索引”,尤其是当模型支持搜索时,不生成索引会导致列表无法分页,后台 → 数据更新 → 信息索引更新,勾选对应模型再执行。
灵动标签SQL调用,怎么写才不翻车?
灵动标签([!--empirenews.listtemp--])是帝国CMS最灵活的标签,但新手常因变量名混淆而报错,核心要点:
-
基本语法:
SELECT * FROM phome_ecms_news WHERE classid=5 ORDER BY id DESC LIMIT 6
但注意:
phome_是表前缀,正式环境应使用{$dbtbpre}常量。 -
调用列表字段(推荐写法):
[!--empirenews.listtemp--] <ul> <li><a href="[!--titleurl--]">[!--title--]</a> - [!--newstime--]</li> </ul> [!--empirenews.listtemp--]
此时SQL中必须包含
titleurl和newstime字段,否则会报错,建议在SQL末尾加上SELECT *避免遗漏。 -
带条件调用附表字段:
SELECT * FROM {$dbtbpre}ecms_news WHERE id IN (SELECT id FROM {$dbtbpre}ecms_news_data_自己的表 WHERE 价格>100)注意:附表表名通常为
主表名_data_通道名,如ecms_news_data_product。
列表模板和内容模板,变量调用有哪些坑?
列表模板(list.ht):只能使用 [!--字段名--] 形式调用主表字段,且必须在SQL中显式列出,比如你要调用“产品型号”,但该字段在附表,那么列表模板无法直接读取,必须通过 [!--id--] 在循环中去查询附表。
模板(show.ht)**:可以直接调用主表和附表字段,用 [!--字段名--] 或 <?=$navinfor['字段名']?>,但注意:
- 附表字段调用时,需确保在“数据表管理”中勾选了“内容页显示”属性。
- 若字段是“多值”类型(如复选组),后台存储是 分隔,需用
<?php echo explode('|',$navinfor['tag'])[0]; ?>取第一个值。 模板中调用列表字段**(如上一篇/下一篇):[!--info.pre--] 上一页:<a href="[!--info.pre.url--]">[!--info.pre.title--]</a> [!--info.next--] 下一页:<a href="[!--info.next.url--]">[!--info.next.title--]</a>
万能标签 与 智能标签——什么时候用哪个?
这两者的区别在于数据来源是否固定。
-
万能标签(
[!--empirenews.template--]):本质是自定义SQL查询,类似灵动标签,但更自由,适合读取任意表、任意条件、字段拼接,例如调用多模型混合内容:[!--empirenews.template--] SELECT id, title FROM {$dbtbpre}ecms_news WHERE classid IN (1,2,3) UNION SELECT id, title FROM {$dbtbpre}ecms_product WHERE classid=5 LIMIT 10 [!--empirenews.template--] -
智能标签(
[!--empirenews.listinfo--]):针对单模型,自动处理分页和字段显示,但必须配合系统内置的listtemp模板,适合快速实现列表页,且支持“按拼音首字母”、“按字段排序”等高级参数。
场景选择:
- 做聚合首页或专题页 → 用万能标签。
- 做标准栏目列表 → 用智能标签,减少SQL编写量。
全站搜索配置 + 自定义字段索引——如何让搜索不“失联”?
帝国CMS默认只搜索主表“标题、简介、关键词”三个字段,若你的自定义字段(如“产品编号”)也需要被搜到,必须手动加索引。
数据表管理 → 搜索字段设置
找到你的模型,点击“搜索字段”,将 产品编号 勾选为“参与搜索”。
建立唯一索引(关键)
在数据库管理(phpMyAdmin 或 帝国后台SQL执行器)执行:
ALTER TABLE phome_ecms_product ADD UNIQUE INDEX idx_code (code);
注意:code 是你自定义字段的字段名,加唯一索引不仅能加速搜索,还能防止重复数据,但若已有重复值,需先清理重复数据再建索引。
全站搜索模板调用
搜索页 search.php 中,可用如下方式输出带高亮的结果:
<?php $find = $search; $replace = "<span style='color:red'>$search</span>"; echo str_replace($find, $replace, $r['title']); ?>
模板中调用附表字段的高级技巧
自定义模型的字段常分到附表(_data_ 结尾的表),主表只存基础字段,若在列表页直接调用附表字段,会因JOIN效率问题而卡顿。
方案一(推荐):SQL查询时直接JOIN附表
SELECT n.*, d.产品价格, d.产品型号 FROM {$dbtbpre}ecms_product n LEFT JOIN {$dbtbpre}ecms_product_data_pro d ON n.id=d.id WHERE n.checked=1 LIMIT 20
然后在列表模板中直接使用 [!--产品价格--] 输出,注意:此时标签字段名必须和SQL返回的字段别名一致。
内容页使用 $navinfor 数组 页的 $navinfor 已自动合并主表和附表数据,直接 <?=$navinfor['产品价格']?> 即可,无需额外查询。
防止负载——用缓存标签
对高访问量的列表,把附表字段存成静态字段,再在主表增加一个冗余字段,比如在录入时,把 产品价格 复制到主表的一个 price_copy 字段,这样SQL只需要查主表,大幅提升性能。
别忘了索引优化
无论模型多复杂,只要涉及大量查询,唯一索引(UNIQUE)或普通索引(INDEX)是提速的根本,建议给 classid、newstime、userid 加联合索引:
ALTER TABLE phome_ecms_news ADD INDEX idx_class_time (classid, newstime);
查询时使用:
SELECT * FROM phome_ecms_news WHERE classid=5 ORDER BY newstime DESC LIMIT 10
MySQL会走索引,瞬间返回结果,若不加,全表扫描会导致0.5秒以上延迟,这在生产环境是致命的。



发表评论