dede如何调用一二级栏目名称?

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

最常用 - 调用当前栏目的顶级栏目(一级栏目)和当前栏目本身(二级栏目)

这是最常见的需求,比如在面包屑导航或者页面标题中显示“首页 > 产品中心 > 手机”这样的路径。

dede 调用一二级栏目名称
(图片来源网络,侵删)

场景:在文章内容页(article_article.htm)或栏目列表页(category_*.htm)中。

代码示例:

{dede:field name='typename'/}

代码解释:

  • 这个标签非常神奇,它会根据你所在的页面自动判断:
    • 如果你在(比如一篇新闻的详情页),它会显示 “二级栏目 > 一级栏目” 的格式,手机 > 产品中心
    • 如果你在栏目列表页(产品中心”的列表页),它会直接显示 当前栏目的名称产品中心

如何只获取一级栏目名称?

有时候你可能只需要一级栏目的名称,比如只想在文章页显示“产品中心”,而不显示“手机”,这时就需要用到更强大的 channel


灵活控制 - 使用 channel 标签调用指定层级的栏目

channel 标签是调用栏目的核心标签,功能非常强大,我们可以用它来指定调用哪个栏目以及它的层级。

dede 调用一二级栏目名称
(图片来源网络,侵删)

场景1:在文章内容页,调用当前文章的一级栏目名称。

假设你的栏目结构是:产品中心 (一级) -> 手机 (二级) -> iPhone 15 (文章)。

代码示例:

{dede:channel type='top' typeid=''}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}

代码解释:

  • type='top': 这个参数是关键,它表示只调用顶级栏目(一级栏目)
  • typeid='': 这个参数留空,表示调用当前栏目所属的顶级栏目,因为我们在文章页,DedeCMS 会自动识别当前文章属于哪个二级栏目,然后找到它的一级父栏目。

输出结果: <a href="/plus/list.php?tid=5">产品中心</a> (假设 产品中心 的 ID 是 5)。


场景2:在文章内容页,调用当前文章的一级栏目和二级栏目名称(并链接)。

如果你想同时显示一级和二级栏目,并且都加上链接。

代码示例:

{dede:field name='position' runphp='yes'}
    $tcids = array();
    $tags = explode(',', @me);
    foreach($tags as $tag){
        $tag = trim($tag);
        if($tag == '') continue;
        $tcids[] = $tag;
    }
    $tids = join(',', $tcids);
    @me = '';
    $dsql = new DedeSql(false);
    $dsql->SetQuery("SELECT id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath FROM dede_arctype WHERE id IN ($tids) ORDER BY id ASC");
    $dsql->Execute('al');
    while($row = $dsql->GetArray('al')){
        $link = GetTypeUrl($row['typeid'], $row['typedir'], $row['isdefault'], $row['defaultname'], $row['ispart'], $row['namerule2'], $row['moresite'], $row['siteurl'], $row['sitepath']);
        @me .= "<a href='{$link}'>{$row['typename']}</a> > ";
    }
    $last_pos = strrpos(@me, ' > ');
    if($last_pos !== false) @me = substr(@me, 0, $last_pos);
{/dede:field}

代码解释:

  • dede:field name='position': position 字段本身就存储了面包屑的 ID,如 5,12
  • runphp='yes': 允许在标签内执行 PHP 代码。
  • 这段 PHP 代码的作用是:
    1. 获取 position 中的栏目 ID。
    2. 根据 ID 查询出所有相关的栏目信息(名称、链接等)。
    3. 循环输出每个栏目的链接和名称,并用 > 分隔。
    4. 最后去掉末尾多余的 >

输出结果: <a href="/plus/list.php?tid=5">产品中心</a> > <a href="/plus/list.php?tid=12">手机</a>


场景3:在首页或任意页面,调用指定的一级栏目及其下的所有二级栏目。

这是一个非常实用的场景,比如做一个主导航,鼠标悬停显示其子栏目。

代码示例:

{dede:channel type='son' typeid='5'}
    {dede:type}
        <li class="main-level">
            <a href="[field:typelink/]]" class="main-level-link">[field:typename/]</a>
            <ul class="sub-level">
                {dede:channel type='son' noself='yes'}
                    <li><a href="[field:typelink/]">[field:typename/]</a></li>
                {dede:channel}
            </ul>
        </li>
    {/dede:type}
{/dede:channel}

代码解释:

  • 外层 {dede:channel type='son' typeid='5'}:
    • typeid='5': 指定要调用哪个一级栏目,5 是该一级栏目在数据库中的 ID,你需要替换成你自己的 ID。
    • type='son': 表示调用指定栏目(ID=5)下的所有子栏目(二级栏目)
  • 内层 {dede:type}{dede:channel type='son' noself='yes'}:
    • 这部分是嵌套标签,用于构建二级导航的 HTML 结构。
    • {dede:type} 用于获取外层循环到的那个二级栏目的信息。
    • noself='yes': 在内层循环时,不显示当前栏目本身,只显示其下的子栏目(三级栏目),如果二级栏目下没有三级栏目,这个内层循环就不会输出任何东西。

假设:

  • 一级栏目“产品中心”的 ID 是 5。
  • 它下面有“手机”(ID=12) 和 “电脑”(ID=13) 两个二级栏目。

输出结果:

<li class="main-level">
    <a href="/plus/list.php?tid=12" class="main-level-link">手机</a>
    <ul class="sub-level">
        <!-- 假设手机下还有子栏目,这里会列出 -->
    </ul>
</li>
<li class="main-level">
    <a href="/plus/list.php?tid=13" class="main-level-link">电脑</a>
    <ul class="sub-level">
        <!-- 假设电脑下还有子栏目,这里会列出 -->
    </ul>
</li>

总结与快速参考

需求场景 推荐标签 关键参数 说明
获取当前栏目名(一或二级) {dede:field name='typename'/} 最简单,自动判断,在文章页显示“二级>一级”,在栏目页显示“一级”。
获取当前文章的一级栏目名 {dede:channel type='top' typeid=''} type='top' 在文章页使用,获取该文章所属的顶级父栏目名称。
获取当前栏目的面包屑导航 {dede:field name='position' runphp='yes'}... runphp='yes' 需要写一段 PHP 代码来解析和格式化,功能最强大。
调用指定一级栏目及其所有子栏目 {dede:channel type='son' typeid='X'} typeid='X'
type='son'
X 是你要调用的一级栏目 ID,常用于制作多级导航菜单。

重要提示: 在使用 typeid 参数时,你需要登录 DedeCMS 后台,在【栏目管理】中找到对应的栏目,查看其“栏目ID”,然后替换代码中的数字。

希望这些方法能帮助你解决在 DedeCMS 中调用一二级栏目名称的问题!

-- 展开阅读全文 --
头像
dede分页检索不到,原因是什么?
« 上一篇 01-22
Windows下C语言如何用MPI并行编程?
下一篇 » 01-22
取消
微信二维码
支付宝二维码