最近在给一个资讯站做二次开发时,产品经理提了个需求:文章页评论区默认只展示三条,其余折叠,点击“展开全部评论”再显示,听起来简单,但帝国CMS的评论系统默认是平铺的,要实现折叠得自己改模板、写SQL、配标签,过程中踩了不少坑,索性把排查思路和代码整理出来,给有基础的同行参考。
帝国CMS评论折叠功能二次开发,从模型不显示到附表字段调用的实战排错手记
自定义模型创建后前台不显示,怎么排查?
我先建了个“产品评测”自定义模型,字段加好了,栏目也绑定了,前台死活不出内容,排查顺序如下:
- 检查模型是否启用:后台“模型管理”里看模型状态是否为“启用”。
- 检查栏目绑定:栏目必须绑定该模型,否则前台用默认模型解析。
- 检查模板是否选对:列表模板和内容模板要选自定义模型对应的模板,不能复用新闻模板。
- 检查数据表:自定义模型会生成独立表,如
phome_ecms_pingce,确认数据已写入。 - 检查缓存:后台“更新缓存”->“更新所有缓存”。
- 检查标签调用:列表页要用
[ecmsinfo]或灵动标签指定模型ID。
// 灵动标签调用自定义模型列表,模型ID为6
[e:loop={"select * from phome_ecms_pingce where checked=1 order by newstime desc limit 10",10,24,0}]
<a href="<?=$bqsr['titleurl']?>"><?=$bqr['title']?></a>
[/e:loop]
如果还不显示,打开/e/data/tmp/下的缓存文件,看SQL是否报错。
灵动标签SQL调用怎么写?
灵动标签是帝国CMS最灵活的调用方式,格式:
[e:loop={"SQL语句",显示条数,操作类型,栏目ID}]
// 循环体
[/e:loop]
操作类型:0为不操作,1为加栏目,2为加专题,3为加专题栏目,常用示例:
// 调用评论数最多的10篇文章
[e:loop={"select * from phome_ecms_news where checked=1 order by plnum desc limit 10",10,24,0}]
<li><a href="<?=$bqsr['titleurl']?>"><?=$bqr['title']?></a> (<?=$bqr['plnum']?>条评论)</li>
[/e:loop]
注意:$bqsr是系统变量,$bqr是当前记录变量,SQL里字段名要与表一致。
列表模板和内容模板变量调用方法
列表模板常用变量:[!--title--]、[!--titleurl--]、[!--newstime--]、[!--smalltext--]。
模板常用变量:[!--title--]、[!--newstext--]、[!--writer--]、[!--befrom--]。
自定义字段在内容模板中调用:[!--字段名--],但需在“字段管理”中设置“前台可调用”。
<div class="price">价格:<?=$navinfor['price']?></div>
万能标签和智能标签区别与使用场景
- 万能标签
[ecmsinfo]:需指定栏目ID、模型ID,适合固定栏目调用。 - 智能标签
[ecmspl]:自动根据当前栏目调用,适合多栏目复用模板。
// 万能标签 [ecmsinfo]1,10,0,0,0,0,0[/ecmsinfo] // 智能标签 [ecmspl]10,0,0,0,0,0[/ecmspl]
场景:首页用万能标签,栏目页用智能标签。
全站搜索配置和自定义字段索引
后台“系统”->“全站搜索”->“搜索设置”,勾选模型和字段,自定义字段需在“字段管理”中开启“搜索”选项,并重建索引。
// 手动添加索引 ALTER TABLE phome_ecms_news ADD FULLTEXT INDEX ft_title (title);
模板中调用附表字段的实现技巧
主表和附表分离时,附表字段需用$navinfor调用:
<?php
$fr = $empire->fetch1("select * from phome_ecms_news_data_1 where id='$navinfor[id]'");
echo $fr['customfield'];
?>
或用灵动标签联表查询:
[e:loop={"select a.title,b.customfield from phome_ecms_news a left join phome_ecms_news_data_1 b on a.id=b.id where a.id=$navinfor[id]",1,24,0}]
<?=$bqr['customfield']?>
[/e:loop]
评论折叠功能实现
最后回到评论折叠,系统评论模板在/e/template/pl/下,修改listpl.php:
<div id="pllist">
<?php
$i=0;
while($r=$empire->fetch($sql)){
$i++;
$hide = $i>3 ? 'style="display:none" class="plhide"' : '';
?>
<div class="plitem" <?=$hide?>>
<span><?=$r['username']?></span>:<?=$r['saytext']?>
</div>
<?php } ?>
</div>
<a href="javascript:;" onclick="document.querySelectorAll('.plhide').forEach(e=>e.style.display='block');this.style.display='none';">展开全部评论</a>
再配合CSS和JS,即可实现折叠,注意评论分页与折叠逻辑要兼容,否则第二页也会被折叠。
是本次二次开发中踩过的坑和解决方案,代码均经过实测,帝国CMS的灵活性很高,但文档分散,很多细节需要自己啃源码,希望这篇手记能帮到同样在折腾评论折叠的你。



发表评论