使用系统自带的 {dede:sonchannel} 标签(最推荐、最简单)
这是 DedeCMS 提供的专门用于获取子栏目的标签,使用起来最方便,性能也最好。
适用场景:
在栏目列表页(list_article.htm)中,通常用于判断并显示子栏目导航。
代码示例:
{dede:field name='typeid' function='isHasSon(@me)'/}
{dede:sonchannel}
<ul>
{dede:datalist}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:datalist}
</ul>
{else /}
<p>该栏目暂无子栏目。</p>
{/dede:sonchannel}
代码解释:
{dede:sonchannel}: 这个标签会循环输出当前栏目的所有直接子栏目。{else /}:{dede:sonchannel}标签没有查询到任何子栏目(即循环体为空),则会执行{else /}和{/dede:sonchannel}之间的代码。[field:typelink/]: 子栏目的链接地址。[field:typename/]: 子栏目的名称。
优点:
- 代码简洁:无需复杂的PHP判断。
- 性能优越:底层直接调用数据库查询,效率高。
- 官方支持:最标准、最推荐的使用方式。
使用PHP函数 GetSonIds()(灵活,适用于任意模板)
如果您需要在更复杂的地方进行判断,或者想获取子栏目的ID列表(而不仅仅是判断是否存在),可以使用PHP函数。
适用场景:
- 在自定义的PHP页面中。
- 在需要获取子栏目ID进行其他操作时。
- 在列表页模板中通过PHP代码块进行判断。
代码示例:
{dede:php}
// 1. 获取当前栏目的ID
$typeid = $typeid; // 在列表页模板中,$typeid 变量是全局可用的
// 2. 调用系统函数获取所有子栏目的ID(包括所有层级的子栏目)
// 参数说明:$typeid是父栏目ID,$channel是频道ID,0表示所有频道
$sonids = GetSonIds($typeid, 0);
// 3. 判断子ID列表是否为空
if (!empty($sonids)) {
echo "本栏目有子栏目,它们的ID是:" . $sonids;
// 在这里可以输出子栏目列表,或者进行其他逻辑处理
} else {
echo "本栏目没有子栏目。";
}
{/dede:php}
代码解释:
{dede:php}...{/dede:php}: 在模板中执行PHP代码的标签。$typeid: 在list_article.htm模板中,这个变量会自动被赋值为当前栏目的ID。GetSonIds($typeid, 0): 这是DedeCMS的核心函数。$typeid: 父栏目ID。0: 频道ID,填0表示获取所有频道下的子栏目。- 返回值: 如果有子栏目,返回一个用逗号分隔的子栏目ID字符串(如
12,13,14);如果没有,则返回一个空字符串 。
if (!empty($sonids)): 通过判断返回的字符串是否为空来判断是否存在子栏目。
优点:
- 灵活性高:可以获取子栏目ID,进行更复杂的逻辑判断和处理。
- 适用性广:不局限于列表页,在任何可以执行PHP代码的地方都能用。
使用 dede_arctype 表查询(底层,最灵活)
这是最底层的实现方式,如果您对PHP和SQL非常熟悉,可以直接操作数据库,这种方法不常用,但能帮助您理解原理。
适用场景:
当您想完全绕开DedeCMS的函数封装,自己编写查询逻辑时。
代码示例:
{dede:php}
$typeid = $typeid;
$dsql = new DedeSql(false);
// 查询 dede_arctype 表中,父栏目ID等于当前栏目ID的记录数量
$dsql->SetQuery("SELECT COUNT(*) as num FROM `dede_arctype` WHERE reid = '$typeid'");
$dsql->Execute();
$row = $dsql->GetArray();
$son_count = $row['num'];
if ($son_count > 0) {
echo "本栏目有 " . $son_count . " 个子栏目。";
} else {
echo "本栏目没有子栏目。";
}
{/dede:php}
代码解释:
new DedeSql(false): 创建一个数据库连接对象。SetQuery(): 设置SQL查询语句。dede_arctype: DedeCMS存放所有栏目的表。reid: 这个字段存储的是栏目的父栏目ID,一个栏目的reid如果为0,说明它是一级栏目;如果大于0,说明它是某个ID栏目的子栏目。
Execute(): 执行查询。GetArray(): 获取查询结果(一行数据)。COUNT(*) as num: 统计满足条件的记录数量,并将其命名为num。
优点:
- 控制力最强:可以编写任意复杂的SQL查询。
- 学习价值:有助于理解DedeCMS的数据结构。
缺点:
- 代码冗长:比前两种方法麻烦。
- 容易出错:需要自己处理SQL注入等问题(虽然示例中简单,但生产环境需注意)。
总结与推荐
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
{dede:sonchannel} |
代码最简单、性能最好、官方推荐 | 灵活性相对较低,主要用于循环输出子栏目 | 列表页判断并显示子栏目导航(首选) |
GetSonIds() |
灵活,可获取ID,适用性广 | 需要写一点PHP代码 | 需要获取子栏目ID进行其他操作时 |
| 直接查询数据库 | 控制力最强,学习价值高 | 代码冗长,不够优雅 | 深度定制或学习DedeCMS底层逻辑时 |
对于绝大多数需求,强烈推荐使用方法一 {dede:sonchannel},因为它最符合DedeCMS的设计理念,也最简单易用,如果需要更复杂的逻辑,再考虑使用方法二 GetSonIds()。
