核心基础:channel
channel 标签是调用栏目的最基础、最强大的标签,它可以用于获取任意层级的栏目列表。
基本语法
{dede:channel type='typeid' row='数量' col='列数' currentstyle='当前样式'}
<a href='[field:typeurl/]'>[field:typename/]</a>
{/dede:channel}
核心参数详解
参数名
作用
可选值
说明
type
指定调用栏目类型
top (默认), son, self
最关键的参数
row
调用栏目数量
数字
row='10' 表示调用10个栏目
col
每行显示的栏目数
数字
当需要生成表格或网格布局时使用
currentstyle
当前栏目高亮样式
HTML代码
currentstyle='<strong><a href='[field:typeurl/]'>[field:typename/]</a></strong>'
typeid
指定父栏目ID
数字
通常与 type='son' 配合使用,表示调用指定栏目的子栏目
noself
是否包含当前栏目
yes (默认), no
在 type='son' 时,是否包含调用栏目本身
常见调用场景及代码示例
场景1:调用顶级栏目(主导航)
这是最常见的需求,比如网站首页的顶部导航栏。
特点: 调用所有顶级栏目(父级ID为0的栏目)。
代码:
{dede:channel type='top' row='8'}
<li><a href='[field:typeurl/]'>[field:typename/]</a></li>
{/dede:channel}
解释:
type='top':明确表示调用顶级栏目。
row='8':调用8个顶级栏目。
[field:typeurl/]:调用栏目的链接地址。
[field:typename/]:调用栏目的名称。
高亮当前栏目:
如果希望访问某个栏目时,该栏目在导航栏上高亮显示(例如加粗或改变颜色),需要使用 currentstyle。
{dede:channel type='top' row='8' currentstyle="<li class='active'><a href='[field:typeurl/]'>[field:typename/]</a></li>"}
<li><a href='[field:typeurl/]'>[field:typename/]</a></li>
{/dede:channel}
注意: currentstyle 中的内容会替换掉 {dede:channel} 和 {/dede:channel} 之间的默认内容,当当前页面属于该栏目时,就会使用高亮样式。
场景2:调用指定栏目的子栏目(产品分类)
页面(如文章详情页、产品列表页),你可能需要显示该栏目下的子栏目。
特点: 在内容页调用当前栏目的子栏目。
代码(通常放在文章内容页 article_article.htm):
<h3>相关分类</h3>
<ul>
{dede:channel type='son' noself='yes'}
<li><a href='[field:typeurl/]'>[field:typename/]</a></li>
{/dede:channel}
</ul>
解释:
type='son':表示调用子栏目。
noself='yes':表示不包含栏目本身,通常我们只需要子栏目,所以加上这个参数。
- 关键点:
{dede:channel} 在内容页模板中,会自动获取当前栏目的ID,然后根据 type='son' 来查找其子栏目,你无需手动指定 typeid。
场景3:调用当前栏目的同级栏目(侧边栏“更多分类”)
在某些场景下,你可能需要显示与当前栏目同级的所有栏目。
特点: 调用与当前栏目拥有相同父级ID的栏目。
代码:
<h3>更多分类</h3>
<ul>
{dede:channel type='self' currentstyle="<li class='current'><a href='[field:typeurl/]'>[field:typename/]</a></li>"}
<li><a href='[field:typeurl/]'>[field:typename/]</a></li>
{/dede:channel}
</ul>
解释:
type='self':表示调用同级栏目,包括当前栏目本身。
- 如果想排除当前栏目,可以配合
typeid 和 reid(父级ID)来实现,但通常 type='self' 已经能满足需求,并用 currentstyle 来高亮当前项。
场景4:调用栏目及其子栏目(递归/嵌套栏目)
这是一个比较高级的需求,比如制作一个多级下拉菜单,需要一次性获取某个栏目及其所有层级的子栏目。
DedeCMS 默认的 channel 标签不支持递归调用,但可以通过自定义函数或使用 channelartlist 标签结合 arclist 标签来实现。
使用 channelartlist(适用于固定层级)
channelartlist 主要是用于调用栏目列表页,但可以巧妙地用来获取栏目本身。
{dede:channelartlist typeid='2'} <!-- 假设我们要调用ID为2的栏目及其子栏目 -->
<!-- 1. 先输出当前一级栏目 -->
<div class="main-category">
<h2><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></h2>
<!-- 2. 再调用该栏目下的子栏目 -->
<div class="sub-category">
{dede:channel type='son' row='10'}
<a href="[field:typeurl/]">[field:typename/]</a>
{/dede:channel}
</div>
</div>
{/dede:channelartlist}
解释:
typeid='2' 指定了要操作的顶级栏目。
{dede:field name='typeurl'} 和 {dede:field name='typename'} 用于获取 channelartlist 当前循环到的栏目的链接和名称。
- 内部的
{dede:channel type='son'} 则是在这个循环内部,调用当前栏目的子栏目。
使用自定义函数(最灵活)
对于无限层级的递归调用,最好的方法是创建一个自定义PHP函数,这需要修改文件,适合有一定开发能力的用户。
-
在 /include/common.func.php 文件末尾添加以下函数:
/**
* 递归获取栏目列表
* @param int $typeid 父栏目ID
* @param string $ulclass UL的class名
* @return string
*/
function GetChannelList($typeid = 0, $ulclass = '') {
$dsql = new DedeSql(false);
$typeid = (int)$typeid;
$innertext = '';
// 获取子栏目
$dsql->SetQuery("SELECT id,typename,typedir,isdefault,defaultname,namerule2,moresite,siteurl,sitepath FROM `dede_arctype` WHERE reid='$typeid' AND ishidden<>1 order by sortrank asc");
$dsql->Execute('al');
$totalRow = $dsql->GetTotalRow();
if($totalRow > 0) {
$innertext .= "<ul class='$ulclass'>\r\n";
while($row = $dsql->GetArray('al')) {
$typeurl = GetOneTypeUrl($row);
$innertext .= "<li><a href='".$typeurl."'>".$row['typename']."</a></li>\r\n";
// 递归调用自身,获取子栏目的子栏目
$innertext .= GetChannelList($row['id'], 'sub-class');
}
$innertext .= "</ul>\r\n";
}
return $innertext;
}
-
在模板中调用:
<div class="category-tree">
{dede:GetChannelList typeid='0'/}
</div>
typeid='0' 表示从顶级栏目开始递归。
channelartlist 标签简介
channelartlist 通常用于栏目列表页模板(如 list_category.htm),它和 channel 的区别在于:
channel:调用栏目信息,可以放在任何页面(首页、列表页、内容页)。
channelartlist:专门用于栏目列表页,它会循环每一个顶级栏目,让你可以分别定制每个栏目列表页的布局。
基本用法(在 list_category.htm 中):
{dede:channelartlist}
<h2>{dede:field name='typename'/}</h2>
<p>这是栏目:{dede:field name='typename'/} 的列表页</p>
{dede:arclist titlelen='42' row='10'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
{/dede:channelartlist}
这个标签会遍历所有顶级栏目,为每一个栏目生成一个独立的区块,并显示该栏目下的文章列表。
总结与对比
主要用途
关键参数
适用页面
{dede:channel}
调用栏目信息(名称、链接)
type (top/son/self), typeid, currentstyle
任何页面(首页、列表、内容页)
{dede:channelartlist}
循环栏目列表页,为每个栏目定制布局
typeid (指定栏目)
栏目列表页 (list_category.htm)
{dede:arclist}
调用文章列表
typeid, row, titlelen
列表页、首页、内容页
希望这份详细的指南能帮助您在DedeCMS中灵活地调用各种栏目!如果还有其他问题,随时可以提问。
channel 标签是调用栏目的最基础、最强大的标签,它可以用于获取任意层级的栏目列表。
基本语法
{dede:channel type='typeid' row='数量' col='列数' currentstyle='当前样式'}
<a href='[field:typeurl/]'>[field:typename/]</a>
{/dede:channel}
核心参数详解
| 参数名 | 作用 | 可选值 | 说明 |
|---|---|---|---|
type |
指定调用栏目类型 | top (默认), son, self |
最关键的参数 |
row |
调用栏目数量 | 数字 | row='10' 表示调用10个栏目 |
col |
每行显示的栏目数 | 数字 | 当需要生成表格或网格布局时使用 |
currentstyle |
当前栏目高亮样式 | HTML代码 | currentstyle='<strong><a href='[field:typeurl/]'>[field:typename/]</a></strong>' |
typeid |
指定父栏目ID | 数字 | 通常与 type='son' 配合使用,表示调用指定栏目的子栏目 |
noself |
是否包含当前栏目 | yes (默认), no |
在 type='son' 时,是否包含调用栏目本身 |
常见调用场景及代码示例
场景1:调用顶级栏目(主导航)
这是最常见的需求,比如网站首页的顶部导航栏。
特点: 调用所有顶级栏目(父级ID为0的栏目)。
代码:
{dede:channel type='top' row='8'}
<li><a href='[field:typeurl/]'>[field:typename/]</a></li>
{/dede:channel}
解释:
type='top':明确表示调用顶级栏目。row='8':调用8个顶级栏目。[field:typeurl/]:调用栏目的链接地址。[field:typename/]:调用栏目的名称。
高亮当前栏目:
如果希望访问某个栏目时,该栏目在导航栏上高亮显示(例如加粗或改变颜色),需要使用 currentstyle。
{dede:channel type='top' row='8' currentstyle="<li class='active'><a href='[field:typeurl/]'>[field:typename/]</a></li>"}
<li><a href='[field:typeurl/]'>[field:typename/]</a></li>
{/dede:channel}
注意: currentstyle 中的内容会替换掉 {dede:channel} 和 {/dede:channel} 之间的默认内容,当当前页面属于该栏目时,就会使用高亮样式。
场景2:调用指定栏目的子栏目(产品分类)
页面(如文章详情页、产品列表页),你可能需要显示该栏目下的子栏目。
特点: 在内容页调用当前栏目的子栏目。
代码(通常放在文章内容页 article_article.htm):
<h3>相关分类</h3>
<ul>
{dede:channel type='son' noself='yes'}
<li><a href='[field:typeurl/]'>[field:typename/]</a></li>
{/dede:channel}
</ul>
解释:
type='son':表示调用子栏目。noself='yes':表示不包含栏目本身,通常我们只需要子栏目,所以加上这个参数。- 关键点:
{dede:channel}在内容页模板中,会自动获取当前栏目的ID,然后根据type='son'来查找其子栏目,你无需手动指定typeid。
场景3:调用当前栏目的同级栏目(侧边栏“更多分类”)
在某些场景下,你可能需要显示与当前栏目同级的所有栏目。
特点: 调用与当前栏目拥有相同父级ID的栏目。
代码:
<h3>更多分类</h3>
<ul>
{dede:channel type='self' currentstyle="<li class='current'><a href='[field:typeurl/]'>[field:typename/]</a></li>"}
<li><a href='[field:typeurl/]'>[field:typename/]</a></li>
{/dede:channel}
</ul>
解释:
type='self':表示调用同级栏目,包括当前栏目本身。- 如果想排除当前栏目,可以配合
typeid和reid(父级ID)来实现,但通常type='self'已经能满足需求,并用currentstyle来高亮当前项。
场景4:调用栏目及其子栏目(递归/嵌套栏目)
这是一个比较高级的需求,比如制作一个多级下拉菜单,需要一次性获取某个栏目及其所有层级的子栏目。
DedeCMS 默认的 channel 标签不支持递归调用,但可以通过自定义函数或使用 channelartlist 标签结合 arclist 标签来实现。
使用 channelartlist(适用于固定层级)
channelartlist 主要是用于调用栏目列表页,但可以巧妙地用来获取栏目本身。
{dede:channelartlist typeid='2'} <!-- 假设我们要调用ID为2的栏目及其子栏目 -->
<!-- 1. 先输出当前一级栏目 -->
<div class="main-category">
<h2><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></h2>
<!-- 2. 再调用该栏目下的子栏目 -->
<div class="sub-category">
{dede:channel type='son' row='10'}
<a href="[field:typeurl/]">[field:typename/]</a>
{/dede:channel}
</div>
</div>
{/dede:channelartlist}
解释:
typeid='2'指定了要操作的顶级栏目。{dede:field name='typeurl'}和{dede:field name='typename'}用于获取channelartlist当前循环到的栏目的链接和名称。- 内部的
{dede:channel type='son'}则是在这个循环内部,调用当前栏目的子栏目。
使用自定义函数(最灵活)
对于无限层级的递归调用,最好的方法是创建一个自定义PHP函数,这需要修改文件,适合有一定开发能力的用户。
-
在
/include/common.func.php文件末尾添加以下函数:/** * 递归获取栏目列表 * @param int $typeid 父栏目ID * @param string $ulclass UL的class名 * @return string */ function GetChannelList($typeid = 0, $ulclass = '') { $dsql = new DedeSql(false); $typeid = (int)$typeid; $innertext = ''; // 获取子栏目 $dsql->SetQuery("SELECT id,typename,typedir,isdefault,defaultname,namerule2,moresite,siteurl,sitepath FROM `dede_arctype` WHERE reid='$typeid' AND ishidden<>1 order by sortrank asc"); $dsql->Execute('al'); $totalRow = $dsql->GetTotalRow(); if($totalRow > 0) { $innertext .= "<ul class='$ulclass'>\r\n"; while($row = $dsql->GetArray('al')) { $typeurl = GetOneTypeUrl($row); $innertext .= "<li><a href='".$typeurl."'>".$row['typename']."</a></li>\r\n"; // 递归调用自身,获取子栏目的子栏目 $innertext .= GetChannelList($row['id'], 'sub-class'); } $innertext .= "</ul>\r\n"; } return $innertext; } -
在模板中调用:
<div class="category-tree"> {dede:GetChannelList typeid='0'/} </div>typeid='0'表示从顶级栏目开始递归。
channelartlist 标签简介
channelartlist 通常用于栏目列表页模板(如 list_category.htm),它和 channel 的区别在于:
channel:调用栏目信息,可以放在任何页面(首页、列表页、内容页)。channelartlist:专门用于栏目列表页,它会循环每一个顶级栏目,让你可以分别定制每个栏目列表页的布局。
基本用法(在 list_category.htm 中):
{dede:channelartlist}
<h2>{dede:field name='typename'/}</h2>
<p>这是栏目:{dede:field name='typename'/} 的列表页</p>
{dede:arclist titlelen='42' row='10'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
{/dede:channelartlist}
这个标签会遍历所有顶级栏目,为每一个栏目生成一个独立的区块,并显示该栏目下的文章列表。
总结与对比
| 主要用途 | 关键参数 | 适用页面 | |
|---|---|---|---|
{dede:channel} |
调用栏目信息(名称、链接) | type (top/son/self), typeid, currentstyle |
任何页面(首页、列表、内容页) |
{dede:channelartlist} |
循环栏目列表页,为每个栏目定制布局 | typeid (指定栏目) |
栏目列表页 (list_category.htm) |
{dede:arclist} |
调用文章列表 | typeid, row, titlelen |
列表页、首页、内容页 |
希望这份详细的指南能帮助您在DedeCMS中灵活地调用各种栏目!如果还有其他问题,随时可以提问。
