菜鸟科技网

dede如何调用顶级栏目名称?

在DedeCMS(织梦内容管理系统)中,调用顶级栏目名称是网站开发中常见的需求,尤其是在导航栏、面包屑导航或内容列表页中,本文将详细介绍多种调用顶级栏目名称的方法,包括使用系统标签、SQL查询、PHP代码等,并结合实例说明不同场景下的应用。

dede如何调用顶级栏目名称?-图1
(图片来源网络,侵删)

使用DedeCMS系统标签调用顶级栏目名称

DedeCMS提供了丰富的系统标签,其中{dede:channel}{dede:arclist}等标签可以灵活调用栏目信息,以下是具体实现方法:

通过{dede:channel}标签调用顶级栏目

{dede:channel}标签用于调用栏目列表,通过添加type='top'参数可以限制仅调用顶级栏目。

{dede:channel type='top' row='8'}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
  • type='top':表示仅调用顶级栏目。
  • row='8':限制调用数量为8个。
  • [field:typelink/]:栏目链接。
  • [field:typename/]:栏目名称。

通过{dede:arclist}标签关联调用顶级栏目名称页(如文章详情页)调用当前文章所属的顶级栏目名称,可以使用{dede:arclist}标签结合channel属性。

{dede:arclist idlist='1' channelid='1'}
    <p>顶级栏目名称:[field:typename/]</p>
{/dede:arclist}
  • idlist='1':指定文章ID(需根据实际情况调整)。
  • channelid='1':指定栏目ID(需为顶级栏目ID)。

使用{dede:field}标签调用当前栏目的顶级栏目名称

在栏目列表页或内容页,可以通过{dede:field}标签调用当前栏目的顶级栏目名称。

{dede:field name='typename' function='GetTopTypename(@me)'/}

这里需要配合自定义函数GetTopTypename,该函数需在include/helpers/extend.helper.php中定义:

dede如何调用顶级栏目名称?-图2
(图片来源网络,侵删)
if (!function_exists('GetTopTypename')) {
    function GetTopTypename($typeid) {
        global $dsql;
        $query = "SELECT typename FROM dede_arctype WHERE id='$typeid' AND reid=0";
        $row = $dsql->GetOne($query);
        return $row['typename'];
    }
}

通过SQL查询直接调用顶级栏目名称

如果系统标签无法满足需求,可以直接使用SQL查询获取顶级栏目名称,以下是两种常见方式:

在模板中使用{dede:sql}
{dede:sql sql="SELECT typename,typedir FROM dede_arctype WHERE reid=0"}
    <a href="[field:typedir/]">[field:typename/]</a>
{/dede:sql}
  • reid=0:表示顶级栏目(reid为父栏目ID,0表示无父栏目)。

在PHP文件中执行SQL查询

在自定义PHP文件中,可以通过以下代码获取顶级栏目名称:

<?php
require_once(dirname(__FILE__)."/include/common.inc.php");
$dsql->SetQuery("SELECT id,typename,typedir FROM dede_arctype WHERE reid=0");
$dsql->Execute();
while ($row = $dsql->GetArray()) {
    echo "<a href='".$row['typedir']."'>".$row['typename']."</a>";
}
?>

调用顶级栏目名称的常见场景与示例

导航栏调用

在网站导航栏中,通常需要显示所有顶级栏目,结合{dede:channel}标签和CSS样式即可实现:

<ul class="nav">
    {dede:channel type='top' row='10'}
        <li><a href="[field:typelink/]">[field:typename/]</a></li>
    {/dede:channel}
</ul>

面包屑导航

面包屑导航需要显示当前栏目的层级路径,可通过以下代码调用顶级栏目名称:

dede如何调用顶级栏目名称?-图3
(图片来源网络,侵删)
{dede:field name='position' function='str_replace(" > ", " » ", @me)'/}

如果需要单独提取顶级栏目名称,可结合GetTopTypename函数实现。

内容页调用顶级栏目名称

在文章详情页,调用当前文章所属的顶级栏目名称:

{dede:field name='typeid' function="GetTopTypename(@me)"/}

不同方法的优缺点对比

以下表格总结了三种调用顶级栏目名称方法的优缺点:

方法 优点 缺点 适用场景
系统标签(如{dede:channel} 简单易用,无需额外代码 灵活性较低,难以处理复杂逻辑 基础导航栏、栏目列表页
SQL查询({dede:sql} 灵活性高,可自定义查询条件 需要SQL基础,可能影响性能 复杂栏目筛选、自定义数据展示
PHP代码执行 功能强大,可结合PHP逻辑处理 需要修改PHP文件,维护成本较高 自定义开发页面、后台功能扩展

注意事项

  1. 栏目ID与reid的关系reid=0表示顶级栏目,子栏目的reid为父栏目的ID。
  2. 缓存问题:使用SQL查询时,建议开启DedeCMS的缓存功能以提升性能。
  3. 函数命名冲突:自定义函数时,需确保函数名不与系统函数冲突。

相关问答FAQs

问题1:如何在内容页调用当前文章的顶级栏目名称? 页模板中,使用{dede:field}标签结合自定义函数GetTopTypename实现,首先在include/helpers/extend.helper.php中定义函数:

function GetTopTypename($typeid) {
    global $dsql;
    $query = "SELECT typename FROM dede_arctype WHERE id=(SELECT reid FROM dede_arctype WHERE id='$typeid') AND reid=0";
    $row = $dsql->GetOne($query);
    return $row['typename'];
}

然后在模板中调用:

{dede:field name='typeid' function="GetTopTypename(@me)"/}

问题2:如何调用指定顶级栏目下的子栏目名称?
解答:可通过{dede:channel}标签的reid参数指定父栏目ID,调用ID为5的顶级栏目下的子栏目:

{dede:channel reid='5'}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}

若需在PHP中实现,可使用以下代码:

$dsql->SetQuery("SELECT id,typename,typedir FROM dede_arctype WHERE reid=5");
$dsql->Execute();
while ($row = $dsql->GetArray()) {
    echo "<a href='".$row['typedir']."'>".$row['typename']."</a>";
}

分享:
扫描分享到社交APP
上一篇
下一篇