最近在给一个资讯站做二次开发时,运营那边提了一个需求:文章页的评论列表要按最新时间倒序排列,并且首页侧边栏要调用全站最新评论,听起来很简单,但我接手时发现前任开发者留下的模型和模板一团乱麻——自定义模型前台不显示、灵动标签SQL写得半死不活、列表和内容模板变量混用、万能标签和智能标签傻傻分不清,今天就把这一串问题拆开,重点围绕“评论最新排序”这个场景,把排查思路和代码示例一次性讲透。
帝国CMS评论最新排序,从调用异常到全站搜索与附表字段的深度排错指南
自定义模型创建后前台不显示,先查这五处
新建了一个“产品评测”模型,字段也加了,栏目也绑定了,前台就是空白,别急,按顺序排查:
- 模型是否启用:后台“模型管理”里看该模型是否开启。
- 栏目是否绑定模型:栏目编辑里“所属模型”必须选对。
- 模板是否绑定:栏目模板、列表模板、内容模板是否指定了对应模型的模板文件。
- 字段是否前台可写:自定义字段的“前台显示”权限没开,前台就不输出。
- 缓存是否更新:帝国CMS的数据更新中心里,刷新“自定义模型”相关缓存。
如果以上都正常,那就用灵动标签直接查该模型的主表,验证数据是否存在,比如评论最新排序,我习惯先确认评论表phome_enewspl里有没有对应id的数据。
灵动标签SQL调用:评论最新排序的标准写法
帝国CMS默认评论表是phome_enewspl,文章评论关联的是phome_ecms_news的id,要按最新时间倒序取10条,灵动标签这样写:
[e:loop={"select pl.*,n.title from phome_enewspl pl left join phome_ecms_news n on pl.id=n.id where pl.checked=1 order by pl.pltime desc limit 10",10,24,0}]
<a href="/e/pl/?classid=<?=$bqr['classid']?>&id=<?=$bqr['id']?>"><?=$bqr['title']?></a>
<span><?=$bqr['pltime']?></span>
<?=$bqr['saytext']?>
[/e:loop]
关键点:checked=1过滤审核通过的评论,order by pl.pltime desc实现最新排序,如果你用的是自定义模型,把phome_ecms_news换成对应模型主表,比如phome_ecms_product。
列表模板和内容模板变量调用方法
列表模板里用$bqr模板里用$navinfor数组,评论最新排序在内容页要调用当前文章的评论,用:
$navinfor['plnum'] // 评论数量 $navinfor['id'] // 当前文章ID
列表页调用评论数:
$bqr['plnum']
但要注意,列表模板的灵动标签里如果用了order by pltime desc,变量名要和SQL别名一致。
万能标签和智能标签的区别与使用场景
- 万能标签:
[ecmsinfo],必须指定SQL,灵活但需要手写查询,适合复杂排序,评论最新排序且只取某栏目下的”。 - 智能标签:
[ecmsloop],自动根据栏目和模型生成查询,适合标准调用,但无法直接对评论表做order by pltime。
所以评论最新排序,我推荐用万能标签或灵动标签,别用智能标签硬撑。
全站搜索配置与自定义字段索引
全站搜索默认只索引主表字段,如果你想让评论内容也能被搜到,或者自定义模型字段参与搜索,需要:
- 后台“全站搜索”配置里,勾选对应模型和字段。
- 对于评论表,帝国默认不加入全站搜索,需要二次开发:修改
/e/search/下的搜索逻辑,联合phome_enewspl表。 - 自定义字段索引:在“数据表管理”里,给该字段加索引,然后更新搜索缓存。
模板中调用附表字段的实现技巧
自定义模型的附表字段存在phome_ecms_模型名_data_附表ID模板直接写:
$navinfor['字段名']
但如果要在列表模板或灵动标签里调用附表字段,必须用left join关联附表:
[e:loop={"select n.*,d.自定义字段 from phome_ecms_news n left join phome_ecms_news_data_1 d on n.id=d.id order by n.newstime desc limit 10",10,24,0}]
<?=$bqr['自定义字段']?>
[/e:loop]
注意附表ID通常是1,但如果你建了多个附表,要去后台看具体ID。
回到评论最新排序的完整实现
最终我在文章页底部这样写:
[e:loop={"select * from phome_enewspl where id=$navinfor[id] and checked=1 order by pltime desc limit 5",5,24,0}]
<div class="pl-item">
<span><?=$bqr['username']?></span>
<span><?=date('Y-m-d H:i',$bqr['pltime'])?></span>
<p><?=$bqr['saytext']?></p>
</div>
[/e:loop]
首页侧边栏调用全站最新评论,则用上面的联合查询,评论最新排序的核心就是order by pltime desc,但前提是评论表有数据、审核通过、关联ID正确,如果你发现排序无效,先检查pltime字段是否被写入,再检查SQL是否有where条件干扰。
这一套排查下来,评论最新排序不再是个玄学问题,帝国CMS的二次开发,说到底就是表结构、模板变量和标签语法的组合拳,打准了就顺了。



发表评论