帝国CMS循环子栏目及子栏目下面的数据
帝国CMS循环子栏目及子栏目数据调用方法
在使用帝国cms制作网站模板时,有时候需要一次性循环输出某个父栏目下面的所有子栏目,并且在每个子栏目下面继续调用该栏目中的最新数据。
这种需求可以通过e:loop结合帝国CMS数据库查询实现。下面通过一段实际代码,介绍如何循环父栏目ID为1的子栏目,并同时调用每个子栏目下面的最新数据。
一、帝国CMS循环子栏目代码
[e:loop={"select classid,classname,classpath from [!db.pre!]enewsclass where bclassid=1 and showclass=0 order by myorder,classid asc",0,24,0}]
<div class="links_tx">
<ul>
<h3><a class="g_fl" href="<?=$public_r[newsurl].$bqr[classpath]?>" target="_blank"><?=$bqr[classname]?></a></h3>
<?php
$newbook=$empire->query("select title,titleurl,id from www_11px_cn_ecms_weixin where classid='".$bqr[classid]."' order by newstime desc limit 8");
//取得该分类下的最新数据
while($r=$empire->fetch($newbook)) {
?>
<li><a href="<?=sys_ReturnBqTitleLink($r)?>" title="<?=$r[title]?>"><?=$r[title]?></a></li>
<?php
}
?>二、e:loop循环子栏目
这段代码首先通过e:loop查询帝国cms栏目表enewsclass,筛选父栏目ID为1的子栏目。
select classid,classname,classpath from [!db.pre!]enewsclass where bclassid=1 and showclass=0 order by myorder,classid asc
其中bclassid=1表示当前查询的是父栏目ID为1下面的子栏目。
showclass=0用于按照当前代码的条件筛选栏目,具体字段含义建议结合当前帝国CMS版本的栏目表结构进行确认。
查询结果按照myorder和classid进行排序,这样可以按照栏目的排序值依次输出。
三、调用子栏目链接
循环子栏目后,可以使用$bqr[classpath]取得当前栏目的目录路径,再与网站新闻地址组合:
<?=$public_r[newsurl].$bqr[classpath]?>
其中:
$public_r[newsurl]:帝国CMS网站新闻系统对应的基础URL。$bqr[classpath]:当前循环到的子栏目目录路径。
两者组合之后即可得到当前子栏目的访问地址。
四、调用子栏目名称
当前子栏目的名称可以通过:
<?=$bqr[classname]?>
进行调用。
这里的$bqr[classname]就是当前e:loop循环得到的栏目名称,可以直接用于输出栏目标题。
五、查询当前子栏目下面的数据
得到当前子栏目ID以后,代码又执行了一次数据库查询:
$newbook=$empire->query("select title,titleurl,id from www_11px_cn_ecms_weixin where classid='".$bqr[classid]."' order by newstime desc limit 8");这里的关键参数就是:
$bqr[classid]
它代表当前循环到的子栏目ID。程序将这个ID作为classid查询条件,就可以取得当前子栏目下面的数据。
同时通过:
order by newstime desc limit 8
按照发布时间倒序排列,并且最多取得8条数据,也就是当前子栏目下面的最新8条内容。
六、循环输出子栏目数据
查询完成后,通过帝国CMS数据库对象遍历查询结果:
while($r=$empire->fetch($newbook)) {
}每循环一次,$r就是当前查询到的一条数据。
七、调用子栏目数据链接
文章数据的URL使用帝国CMS提供的:
<?=sys_ReturnBqTitleLink($r)?>
进行调用。
该方法根据当前数据记录生成对应的信息内容链接,因此可以直接放在a标签的href属性中。
八、调用子栏目数据标题
当前数据的标题通过:
<?=$r[title]?>
进行调用。
因此下面这段代码:
<li><a href="<?=sys_ReturnBqTitleLink($r)?>" title="<?=$r[title]?>"><?=$r[title]?></a></li>
最终就是输出当前子栏目中的一条内容链接和标题。
九、整个调用过程
这段代码的执行逻辑可以简单理解为:
查询父栏目ID为1下面的子栏目。
循环输出每一个子栏目。
使用
$bqr[classid]取得当前子栏目ID。根据当前子栏目ID查询对应的数据。
按照
newstime倒序取得最新8条数据。使用
$r[title]输出数据标题。使用
sys_ReturnBqTitleLink($r)生成数据链接。
因此最终形成的页面结构就是一个父栏目下面循环多个子栏目,每个子栏目下面再显示对应的最新内容。
十、需要注意的问题
原代码中的数据表名使用的是:
www_11px_cn_ecms_weixin
这个表名明显与当前网站数据库前缀及数据表有关,并不是所有帝国CMS网站都可以直接使用。实际使用时,应根据自己网站的真实数据表名称进行修改。
另外,这种写法会在每个子栏目循环过程中再次执行一次数据库查询。如果网站子栏目数量比较多,最终可能产生较多sql查询,因此在数据量较大的网站中,建议根据实际情况进行SQL优化,避免不必要的数据库压力。
总结
帝国CMS循环子栏目及子栏目数据的核心思路,就是先通过enewsclass查询指定父栏目下面的子栏目,再利用当前循环得到的classid查询该栏目对应的数据。
其中比较重要的几个变量分别是:$bqr[classid]用于获取当前子栏目ID,$bqr[classname]用于获取子栏目名称,$bqr[classpath]用于获取栏目路径,而数据循环中的$r[title]用于获取内容标题,sys_ReturnBqTitleLink($r)用于生成内容链接。
