使用 channel 标签(最常用、最灵活)
channel 标签是调用栏目的核心标签,功能非常强大,可以用来调用任意层级的栏目,包括子栏目。
基础用法:调用当前栏目的所有直接子栏目
这是最直接的方式,通常用在列表页(list_article.htm页(article_article.htm)中,用于显示当前栏目下的子栏目导航。
代码示例:
{dede:channel type='son' currentstyle="<li><a href='~typelink~' class='thisclass'>~typename~</a></li>"}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
代码解析:
{dede:channel type='son' ...}:这是标签的开始。type='son':这是关键参数,表示调用当前栏目的“子栏目”(son channel)。currentstyle="...":这是一个可选但非常有用的参数,用于为当前所在的栏目添加一个特殊的样式。~typename~和~typelink~是当前栏目的占位符,会被替换成实际的名称和链接。
<li><a href="[field:typelink/]">[field:typename/]</a></li>:这是子栏目的默认模板。[field:typelink/]:输出子栏目的链接地址。[field:typename/]:输出子栏目的名称。
{/dede:channel}:标签的结束。
使用场景: 网站主导航下的二级导航、文章列表页左侧或顶部的分类导航。
调用指定ID的栏目的子栏目
如果你想调用某个特定栏目的子栏目,而不是当前栏目,可以使用 typeid 参数。
代码示例:
假设你想调用ID为 5 的栏目的所有子栏目。
{dede:channel typeid='5' type='son'}
<a href="[field:typelink/]">[field:typename/]</a> |
{/dede:channel}
代码解析:
typeid='5':指定了要查询的父栏目的ID。type='son'则表示查询这个ID栏目的子栏目。
使用场景: 在首页调用某个特定栏目(如“产品中心”)的子栏目列表。
调用指定顶级栏目下的所有子栏目(包括孙栏目)
如果你想调用一个顶级栏目下的所有层级的子栏目(即所有后代栏目),可以使用 reid 参数。
代码示例:
假设你想调用顶级栏目ID为 5 的所有后代栏目。
{dede:channel reid='5' type='sun'}
<a href="[field:typelink/]">[field:typename/]</a> |
{/dede:channel}
代码解析:
reid='5':指定了顶级栏目的ID。type='sun':表示查询这个顶级栏目下的所有“孙栏目”(即所有后代栏目)。
注意: 在较新版本的织梦中,type='son' 和 type='sun' 的区别可能不那么明显,直接使用 typeid 和 type='son' 通常也能达到调用所有子栏目的效果,但 reid 和 sun 的组合是专门为调用多级子栏目设计的。
使用 arclist 标签调用子栏目的文章
我们的需求不是显示子栏目的列表,而是要显示子栏目下的文章列表,这时,arclist 标签是最佳选择。
arclist 标签有一个强大的 typeid 属性,它可以接受一个包含所有目标栏目ID的字符串。
获取当前栏目所有子栏目的ID
我们需要一个方法来动态获取当前栏目所有子栏目的ID,织梦提供了一个全局变量 $_GET['typeid'] 来获取当前栏目的ID,但没有直接获取所有子ID的函数,我们可以通过SQL查询或使用织梦的自定义函数来实现。
这里介绍一个简单直接的方法:在模板中通过PHP代码获取。
代码示例:
{dede:php}
// 获取当前栏目ID
$typeid = $typeid;
// 调用DedeCMS的GetSonIds函数获取所有子栏目ID
$sonids = GetSonIds($typeid);
// 将ID数组用逗号连接成字符串,供arclist使用
$typeidstr = empty($sonids) ? $typeid : $sonids;
{/dede:php}
{dede:arclist typeid='$typeidstr' titlelen='30' row='8'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
</li>
{/dede:arclist}
代码解析:
{dede:php}...{/dede:php}:允许在模板中直接执行PHP代码。$typeid = $typeid;:获取当前页面的栏目ID。$sonids = GetSonIds($typeid);:调用织梦内置的GetSonIds函数,它会返回当前ID下所有子栏目的ID,格式为'5,6,7,8'这样的字符串。$typeidstr = ...:处理一下,以防没有子栏目时出错。{dede:arclist typeid='$typeidstr' ...}:将获取到的子栏目ID字符串传递给arclist的typeid属性,这样,arclist就只会查询这些子栏目下的文章。
使用场景: 在“公司新闻”栏目页,不仅显示“公司新闻”本身的文章,还想同时显示其子栏目“行业动态”和“公司公告”的最新文章。
使用SQL查询标签(高级用法)
当以上标签无法满足复杂需求时,可以直接使用 dede:sql 标签执行自定义的SQL语句。
示例:调用指定栏目及其所有子栏目的文章
这个例子和方法二的效果类似,但使用原生SQL实现。
{dede:sql sql='SELECT id, title, arcurl FROM dede_archives WHERE typeid IN (SELECT id FROM dede_arctype WHERE reid=~typeid~ OR id=~typeid~) ORDER BY id DESC LIMIT 10'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:sql}
代码解析:
sql='...':编写SQL查询语句。~typeid~:这是织梦SQL标签中的一个特殊变量,会自动被替换为当前栏目的ID。WHERE typeid IN (SELECT id FROM dede_arctype WHERE reid=~typeid~ OR id=~typeid~):reid=~typeid~:查找所有父栏目ID为当前栏目ID的栏目(即子栏目)。OR id=~typeid~:同时包含当前栏目本身。- 这样,
IN子句就包含了当前栏目和它所有子栏目的ID。
ORDER BY id DESC LIMIT 10:按ID倒序排列,并只取前10条结果。
总结与最佳实践
| 需求场景 | 推荐标签 | 关键参数 |
|---|---|---|
| 调用当前栏目的直接子栏目列表 | dede:channel |
type='son' |
| 调用指定ID栏目的子栏目列表 | dede:channel |
typeid='指定ID', type='son' |
| 调用顶级栏目下的所有后代栏目 | dede:channel |
reid='顶级ID', type='sun' |
| 调用当前栏目及其子栏目的文章列表 | dede:arclist + GetSonIds 函数 |
在PHP代码中获取 $sonids,typeid='$sonids' |
| 执行复杂的、自定义的子栏目查询 | dede:sql |
编写包含 ~typeid~ 变量的SQL语句 |
重要提示:
- 栏目ID:在使用
typeid或reid时,你必须知道目标栏目的准确ID,你可以在织梦后台的“栏目管理”中查看每个栏目的ID。 - 缓存问题:织梦模板有缓存机制,如果你修改了模板代码但看不到效果,请到后台点击“生成” -> “更新HTML” -> “更新主页HTML”或“更新栏目HTML”,或者清除浏览器缓存。
- 模板路径:确保这些代码被放在正确的模板文件中。
channel标签放在list_article.htm(列表页)或article_article.htm页)中才有效。
希望这份详细的指南能帮助你熟练掌握在织梦中调用子栏目的各种方法!
