使用栏目导航标签 (e:loop)
这是最简单、最直接的方法,适用于在列表页、内容页等需要显示当前栏目或指定栏目信息的场景。

(图片来源网络,侵删)
核心函数
GetClassUrl($classid) - 获取栏目的链接。
classname - 栏目名称。
classid - 栏目ID。
bclassname - 父栏目名称。
intro - 栏目描述。
语法格式
[e:loop={"select * from [!db.pre!]enewsclass where classid='$GLOBALS[navclassid]' order by myorder",0,24,0}]
<h2>栏目名称:<?=$bqr[classname]?></h2>
<p>栏目描述:<?=$bqr[intro]?></p>
<p>栏目链接:<?=$bqr[classurl]?></p>
[/e:loop]
参数解释:
select * from [!db.pre!]enewsclass where classid='$GLOBALS[navclassid]':这是SQL查询语句。[!db.pre!]enewsclass:是栏目数据表,[!db.pre!]会自动替换为你的数据库表前缀。classid='$GLOBALS[navclassid]':这是关键!$GLOBALS[navclassid]是一个全局变量,自动代表当前页面的栏目ID,所以这个标签会自动获取当前栏目的信息。
0,24,0:这三个参数分别是显示条数,模板ID,只显示有标题图片,这里我们只需要获取一条当前栏目的信息,所以显示条数设为0或1都可以,设为0表示按SQL查询结果来(这里只有一条),模板ID和标题图片限制对我们获取描述信息没有影响,可以设为0。
实际应用场景示例
场景1:在列表页(如 list.php)调用当前栏目描述
这是最常见的用法,通常放在列表页的顶部,用于告诉用户这个栏目是关于什么的。
示例代码:

(图片来源网络,侵删)
<!-- 在列表页模板 list.php 中 -->
<div class="class-description">
<h1>[!--classname--]</h1> <!-- [!--classname--] 是系统内置标签,更简单,但无法获取描述 -->
<p class="intro">[!---class.intro--]</p> <!-- 这是最简洁的系统标签,推荐使用 -->
</div>
<!-- 或者使用 e:loop 标签,功能更强大 -->
[e:loop={"select intro, classname from [!db.pre!]enewsclass where classid='$GLOBALS[navclassid]' limit 1",0,24,0}]
<div class="class-description">
<h2><?=$bqr[classname]?></h2>
<p class="intro"><?=$bqr[intro]?></p>
</div>
[/e:loop]
<!-- 循环开始输出列表内容 -->
[ecmsinfo]....[/ecmsinfo]
小提示:
帝国CMS其实为当前页面提供了一些更简单的系统变量,[!---class.intro--] 就是专门用来调用当前栏目描述的,如果你的需求只是简单显示,直接用这个最方便。
场景2:在内容页(如 show.php)调用当前栏目描述
页同样可以通过 $GLOBALS[navclassid] 获取它所属栏目的描述。
示例代码:
<!-- 在内容页模板 show.php 中 -->
<div class="breadcrumb">
您的位置:<a href="/">首页</a> > <a href="[!--classurl--]">[!--classname--]</a> > [!--title--]
</div>
<!-- 调用当前栏目(即文章所属栏目)的描述 -->
[e:loop={"select intro from [!db.pre!]enewsclass where classid='$GLOBALS[navclassid]' limit 1",0,24,0}]
<div class="class-description">
<p>栏目简介:<?=$bqr[intro]?></p>
</div>
[/e:loop]
<!-- 文章标题和内容 -->
<h1>[!--title--]</h1>
[!--newstime--] [!--author--]
[!--text--]
场景3:调用指定栏目的描述
如果你想调用不是当前栏目的某个特定栏目的描述,你需要知道那个栏目的 classid,然后在SQL语句中指定它。

(图片来源网络,侵删)
示例代码:
假设我们要调用栏目ID为 5 的栏目描述,通常用于网站首页的某个板块。
<div class="about-us">
<h2>关于我们</h2>
[e:loop={"select classname, intro from [!db.pre!]enewsclass where classid='5' limit 1",0,24,0}]
<p><?=$bqr[intro]?></p>
[/e:loop]
</div>
使用灵动标签 (sql)
灵动标签 ([!db.pre!]) 功能更强大,可以执行更复杂的SQL查询,并且有更灵活的循环输出方式,调用栏目描述和 e:loop 类似,但语法略有不同。
核心语法
[!------sql查询开始------]
select 字段名 from [!db.pre!]enewsclass where 条件
[!------sql查询结束------]
场景示例:在首页调用指定栏目描述
假设我们要调用栏目ID为 10 的“公司动态”栏目的描述。
示例代码:
<div class="company-news">
<h2><a href="[!--news.url--]e/public/ClassUrl/?classid=10">公司动态</a></h2>
[!------sql查询开始------]
select intro from [!db.pre!]enewsclass where classid='10'
[!------sql查询结束------]
<div class="news-intro">
<?=$r[intro]?>
</div>
</div>
与 e:loop 的区别:
- 数据变量:
e:loop使用<?=$bqr[字段名]?>,而灵动标签使用<?=$r[字段名]?>。 - 循环:灵动标签默认只输出查询到的第一条记录,如果有多条记录(比如查询所有顶级栏目),需要用
[loop]...[/loop]来包裹。 - 灵活性:灵动标签可以轻松结合其他函数,比如用
esub截取描述字数。
进阶示例:截取描述字数 如果栏目描述很长,我们可能只想显示前100个字符。
<div class="short-intro">
[!------sql查询开始------]
select intro from [!db.pre!]enewsclass where classid='10'
[!------sql查询结束------]
<p><?=esub($r[intro], 100, '...')?></p> <!-- 截取100个字符,末尾加... -->
</div>
总结与对比
| 特性 | 栏目导航标签 (e:loop) |
灵动标签 (sql) |
|---|---|---|
| 主要用途 | 调用与当前页面相关的栏目信息 | 执行任意复杂的SQL查询,获取各种数据 |
| 调用当前栏目 | 非常方便,直接使用 $GLOBALS[navclassid] |
方便,同样使用 $GLOBALS[navclassid] |
| 调用指定栏目 | 需要写完整SQL,指定 classid |
需要写完整SQL,指定 classid |
| 数据变量 | <?=$bqr[字段名]?> |
<?=$r[字段名]?> |
| 循环输出 | 内置循环功能,适合列表 | 需要手动用 [loop]...[/loop] 实现循环 |
| 灵活性 | 较好,主要用于栏目相关 | 极高,可以结合各种PHP函数 |
| 推荐场景 | 列表页、内容页调用当前/指定栏目信息 | 首页调用多个栏目信息、复杂的数据统计、与其他表关联查询 |
给你的建议:
- 在列表页和内容页,优先使用
e:loop或者更简单的系统标签[!---class.intro--]来调用当前栏目描述,因为它最直接、不易出错。 - 在首页,如果只是调用一两个指定栏目的描述,
e:loop和sql灵动标签都可以,如果逻辑更复杂,或者需要循环输出多个栏目的信息,灵动标签会更显优势。 $GLOBALS[navclassid]这个神奇的变量,它是你在模板中获取当前栏目ID的关键。
