2021-08-09 05:15:13
在帝国CMS中调用当前栏目下所有子栏目的文章,可通过以下步骤实现,核心逻辑为先获取子栏目ID列表,再通过灵动标签循环输出文章:
一、获取当前栏目子栏目ID列表在模板中插入PHP代码,判断当前栏目是否有子栏目,并生成用于SQL查询的ID字符串:
<?php$zid = $class_r[$GLOBALS['navclassid']]['sonclass']; // 获取子栏目ID字符串(如"1|2|3|")if ($zid) { $zid = rtrim($zid, '|'); // 去除末尾竖线 $zids = explode('|', $zid); // 转为数组 $classid_in = implode(',', $zids); // 拼接为逗号分隔的字符串(如"1,2,3")} else { $classid_in = $GLOBALS['navclassid']; // 无子栏目时调用当前栏目}?>$class_r是帝国CMS的全局栏目数组,$GLOBALS['navclassid']为当前栏目ID。
若子栏目为多级结构(如三级栏目),需通过递归函数扩展获取所有子孙栏目ID。
通过[e:loop]标签循环输出子栏目文章,示例如下:
[e:loop={"select * from [!db.pre!]ecms_news where classid in ($classid_in) order by newstime desc limit 10",10,24,0}] <li><a href="<?=$bqsr['titleurl']?>"><?=$bqr['title']?></a></li>[/e:loop]select * from [!db.pre!]ecms_news:查询数据表(需替换为实际表名,如ecms_article)。
classid in ($classid_in):限定子栏目范围。
order by newstime desc:按发布时间倒序排列。
limit 10:限制输出10条文章。
$bqsr['titleurl']:文章链接。
$bqr['title']:文章标题。
将以下代码放入支持PHP的模板(如封面页、列表页):
<?php// 获取子栏目ID$zid = $class_r[$GLOBALS['navclassid']]['sonclass'];if ($zid) { $zid = rtrim($zid, '|'); $zids = explode('|', $zid); $classid_in = implode(',', $zids);} else { $classid_in = $GLOBALS['navclassid'];}?><!-- 调用子栏目文章 -->[e:loop={"select * from [!db.pre!]ecms_news where classid in ($classid_in) order by newstime desc limit 10",10,24,0}] <li><a href="<?=$bqsr['titleurl']?>"><?=$bqr['title']?></a></li>[/e:loop]确保模板已开启PHP支持(系统设置→模板管理→开启“支持PHP”)。
数据表名需与实际模型匹配(如文章模型可能为ecms_article)。
多级栏目处理:默认代码仅获取直接子栏目,若需递归获取所有子孙栏目,可自定义函数处理$class_r数组。
标题长度限制:使用<?=esub($bqr['title'],30)?>截断标题,避免排版错乱。
过滤无文章栏目:在SQL中添加条件(如and id in (已发布内容ID)),但需动态生成ID列表,复杂度较高。
性能优化:
对频繁调用的内容启用缓存(系统设置→缓存管理)。
使用静态化功能减少数据库查询。
SQL注入风险:直接拼接$classid_in到SQL语句存在隐患,建议使用帝国CMS提供的参数绑定方式(如[e:loop={...}]的占位符语法)。
通过以上方法,可高效实现帝国CMS中当前栏目下所有子栏目文章的调用,同时兼顾灵活性与性能。