自定义模型创建后前台不显示的五大排查步骤
上周接手一个企业站重构项目,客户在后台创建了“产品中心”自定义模型,添加了13个字段并录入127条数据,前台死活不显示,不要慌,按这个顺序排查:
第一步:检查模型绑定
-- 查看模型所属系统表 SELECT * FROM `phome_enewsmod` WHERE mid=10;
确认tbname指向正确的数据表,show字段值为1(前台显示)。
帝国CMS数据表同步最佳实践,从模型字段到模板调用的全链路排查指南
第二步:确认栏目绑定 检查栏目设置中“模型ID”是否指向正确模型,常见问题是:新增模型后创建栏目时,默认绑定了系统模型而非自定义模型。
第三步:模板文件存在性
模型默认使用list_模型ID.html和show_模型ID.html,确保这两个文件在/e/template/目录下。
第四步:缓存刷新 执行后台“数据更新”中的“更新栏目缓存”和“更新首页缓存”。
第五步:最终排查
在/e/class/connect.php中查看GetClass()和GetInfo()函数内的数据表逻辑,重点检查NEWS表关联逻辑——很多二次开发问题出在这里。
灵动标签SQL调用精解
灵动标签(ecms标签)的SQL调用很容易踩坑,来看一个多表联动的实际案例:
[e:loop={"select a.id,a.title,b.price,b.stock
from phome_ecms_news a
left join phome_ecms_news_data_1 b on a.id=b.id
where a.classid in (1,2,3) and a.firsttitle=1
order by a.newstime desc limit 10",10,24,0}]
<li><a href="<?=$bqsr[titleurl]?>"><?=$bqr[title]?></a>
- 价格:<?=$bqr[price]?> 库存:<?=$bqr[stock]?></li>
[/e:loop]
这里有两个关键点:
$bqr对应主查询字段,$bqsr对应do参数返回的结果集- SQL中必须包含
id字段,否则标签循环会失效
如果查询自定义模型的数据,表名要从phome_ecms_news改为对应的模型表,我习惯写一个工具函数来判断表名:
function getModelTable($modelid){
global $dbtbpre;
$model = $dbtbpre."ecms_mod_".$modelid;
$rs = $empire->fetch1("select tbname from {$dbtbpre}enewsmod where mid='$modelid'");
return $dbtbpre."ecms_".$rs['tbname'];
}
列表模板与内容模板变量调用方法
页的变量体系完全不同,这点很多开发者会混淆。
列表模板可用变量:
$class_r[$GLOBALS[navclassid]][classname]栏目名称$bqr[title]文章标题$bqr[titleurl]文章链接$bqr[ftitle]副标题(注意不是$bqr[smalltitle])$listtemp列表样式变量 模板可用变量:**$r[title]标题(区别于列表页的$bqr)$r[newstime]时间戳,需用date('Y-m-d', $r[newstime])格式化$navinfor[title]上一篇/下一篇标题$rr[title]相关文章标题
实际项目中遇到最坑的报错:在内容模板中直接写$bqr[title]导致页面空白。内容页用$r,列表页用$bqr。
对于自定义字段,内容页直接$r[字段名]即可,列表页需在SQL中先select该字段。
万能标签与智能标签的终极抉择
这两个标签常让人混淆,我的判断标准很简单:
万能标签(autolink)适用场景:
- 需要精确控制SQL查询逻辑
- 涉及多表关联或复杂条件过滤
- 需要自定义分页逻辑
智能标签(phomenews)适用场景:
- 快速调用最新文章、推荐、头条等
- 不需要修改查询结构
- 适合编辑人员使用
实际案例对比:
// 万能标签:查询最近7天有评论的文章
[e:auto={select a.*,count(b.id) as cc from phome_ecms_news a
left join phome_enewspl b on a.id=b.id
where a.newstime>unix_timestamp()-604800
group by a.id having cc>5 order by cc desc,10,24,0}]
// 智能标签:调用热门文章
[phomenews]num=10,line=2,showtype=0,classid=1,orderby=onclick[/phomenews]
性能对比: 智能标签缓存在e/data/cache/下,万能标签每次执行SQL,高并发场景下,能使用智能标签就不要用万能标签。
全站搜索配置与自定义字段索引
全站搜索不包含自定义字段是常见问题,配置分三步:
后台开启字段索引 进入“系统设置” → “全站搜索配置” → 在“搜索字段”中添加你的自定义字段名,用逗号分隔:
重建搜索索引 在“数据更新”中点击“更新全站搜索索引”。
模型表里创建索引
ALTER TABLE `phome_ecms_news_data_1` ADD FULLTEXT INDEX `idx_myfields` (`product_model`, `product_spec`);
注意: 如果自定义字段存储在phome_ecms_news_data_1附表)中,搜索时需要在search.php中添加联合查询:
// 在$query语句中添加LEFT JOIN $query = "select a.*,b.product_model from phome_ecms_news a left join phome_ecms_news_data_1 b on a.id=b.id where ";
模板中调用附表字段的实现技巧
帝国CMS将大数据量字段(如内容、自定义多值字段)存储在附表_data_1中,在模板中调用需注意:
列表页调用附表字段:
[e:loop={select a.id,a.title,b.product_spec from phome_ecms_news a
left join phome_ecms_news_data_1 b on a.id=b.id
where a.classid=1 order by a.id desc,10,24,0}]
<?=$bqr[product_spec]?> // 这里直接取b表字段
[/e:loop]
页调用附表字段:**
// 方法1:在内容模板中直接用$r[字段名]
<?=$r[product_spec]?>
// 方法2:通过系统函数
<?php
$adddata = $empire->fetch1("select product_spec from {$dbtbpre}ecms_news_data_1 where id='$r[id]'");
echo $adddata[product_spec];
?>
高效技巧: 在/e/class/userfun.php中封装一个函数,减少重复查询:
function getAddField($id, $field, $mid=1){
global $dbtbpre,$empire;
$addtable = $dbtbpre."ecms_".getModelTable($mid)."_data_1";
$r = $empire->fetch1("select $field from $addtable where id='$id'");
return $r[$field];
}
这样在模板中只需要写:
<?=getAddField($r[id],'product_spec',$r[mid])?>



发表评论