dede栏目如何分别调用?

99ANYc3cd6
预计阅读时长 22 分钟
位置: 首页 DEDE建站 正文

核心基础: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':表示调用同级栏目,包括当前栏目本身。
  • 如果想排除当前栏目,可以配合 typeidreid(父级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函数,这需要修改文件,适合有一定开发能力的用户。

  1. /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;
    }
  2. 在模板中调用:

    <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中灵活地调用各种栏目!如果还有其他问题,随时可以提问。

-- 展开阅读全文 --
头像
织梦留言簿模块下载地址在哪?
« 上一篇 05-01
dede安装步骤有哪些?
下一篇 » 05-01
取消
微信二维码
支付宝二维码