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

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

使用全局变量(最简单、最推荐)

这是最直接、最简单的方法,适用于列表页内容页,DedeCMS在解析页面时,已经将当前栏目的信息加载到了全局变量中。

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

在列表页 (list_*.php) 和内容页 (article_*.php) 中

DedeCMS的全局变量 $typearr 包含了当前栏目的完整层级信息。

  • 顶级栏目ID: $typearr['topid']
  • 顶级栏目名称: $typearr['topname']

示例代码:

{dede:field name='typename'/}  <!-- 这是当前栏目的名称 -->
<br>
顶级栏目名称是:{dede:field name='topname'/}

使用场景:

  • 在列表页模板 list_*.php 中,直接使用 {dede:field.name/}{dede:field.topname/}
  • 页模板 article_*.php 中,同样可以直接使用这两个标签。

优点:

dede如何调用顶级栏目名称
(图片来源网络,侵删)
  • 代码极其简单,性能最好。
  • 无需任何额外查询,直接调用已加载的变量。

使用SQL查询(最灵活、最强大)

当你需要在更复杂的环境中,比如一个自定义的PHP文件或者一个特定位置的标签中调用时,SQL查询是最灵活的方法。

基本思路

  1. 获取当前栏目的ID。
  2. 通过当前栏目ID,查询其顶级栏目的ID。
  3. 再通过顶级栏目ID,查询其名称。

在列表页或内容页中使用

我们可以通过 typeid 变量获取当前栏目ID。

示例代码 (在模板中直接写PHP):

<?php
// 1. 获取当前栏目ID
$TypeID = $typeid;
// 2. 查询顶级栏目ID
// $dsql 是DedeCMS的全局数据库连接对象
// 从 `dede_arctype` 表中查询,顶级栏目的 `topid` 字段为0
$TopIDQuery = "SELECT id FROM `dede_arctype` WHERE id IN (SELECT topid FROM dede_arctype WHERE id=$TypeID) AND topid=0";
$TopIDRow = $dsql->GetOne($TopIDQuery);
$TopID = $TopIDRow['id'];
// 3. 查询顶级栏目名称
$TopNameQuery = "SELECT typename FROM `dede_arctype` WHERE id=$TopID";
$TopNameRow = $dsql->GetOne($TopNameQuery);
$TopName = $TopNameRow['typename'];
// 4. 输出
echo $TopName;
?>

简化版的SQL查询 (一步到位):

dede如何调用顶级栏目名称
(图片来源网络,侵删)
<?php
$TypeID = $typeid;
// 使用子查询,先找到顶级ID,再根据顶级ID找到名称
$TopNameRow = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id=(SELECT topid FROM dede_arctype WHERE id=$TypeID) AND topid=0");
echo $TopNameRow['typename'];
?>

在自定义PHP文件中使用

如果你在 include/ 目录下创建了一个自定义的PHP文件,你需要先引入DedeCMS的核心文件,然后才能使用 $dsql 和其他全局变量。

示例代码 (custom_function.php):

<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
// 假设我们通过GET参数传递栏目ID
if(isset($_GET['typeid'])) {
    $TypeID = intval($_GET['typeid']);
    // 查询顶级栏目名称
    $TopNameRow = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id=(SELECT topid FROM dede_arctype WHERE id=$TypeID) AND topid=0");
    if(is_array($TopNameRow)) {
        echo "顶级栏目名称是:" . $TopNameRow['typename'];
    } else {
        echo "未找到顶级栏目";
    }
} else {
    echo "请提供栏目ID (typeid)";
}
?>

访问方式: 你的域名/dede/include/custom_function.php?typeid=5

优点:

  • 灵活性极高,不受模板标签限制。
  • 可以在任何PHP代码环境中使用。

使用自定义函数(最规范、最推荐用于复杂逻辑)

如果你需要在模板中多次使用这个功能,或者希望保持模板的整洁,最好的方式是创建一个自定义函数,然后在模板中调用。

创建自定义函数

include/common.func.php 文件的末尾添加以下PHP代码:

/**
 * 根据栏目ID获取顶级栏目名称
 * @param int $typeid 栏目ID
 * @return string 顶级栏目名称
 */
function getTopTypeName($typeid) {
    global $dsql;
    if(empty($typeid)) return '';
    // 使用更高效的JOIN查询
    $row = $dsql->GetOne("SELECT typename FROM `dede_arctype` t1
                          LEFT JOIN `dede_arctype` t2 ON t1.id = t2.topid
                          WHERE t2.id = $typeid AND t1.topid = 0");
    if(is_array($row)) {
        return $row['typename'];
    }
    return '';
}

注意: 修改 common.func.php 文件前,请务必备份!这个文件是DedeCMS的核心公共函数文件。

在模板中调用

你可以在任何模板文件(列表页、内容页、首页等)中使用这个自定义函数了。

示例代码:

当前栏目ID是:{dede:field name='typeid'/}
<br>
顶级栏目名称是:{dede:gettopname function='getTopTypeName(@me)'/}

代码解释:

  • {dede:gettopname ...} 是一个自定义的标签。
  • function='getTopTypeName(@me)' 的意思是,将 @me 替换为标签当前的内容,然后传递给 getTopTypeName 函数。
  • @me 会被 {dede:field.name/} 的值(即当前栏目ID)替换,然后调用 getTopTypeName 函数。

你也可以直接传递变量:

顶级栏目名称是:{dede:gettopname function='getTopTypeName(@me)'/}

然后在PHP代码中给这个标签赋值:

$tpl->Assign('typeid', $typeid);

优点:

  • 代码逻辑与模板分离,非常规范。
  • 可复用性强,定义一次,处处可用。
  • 模板代码非常简洁,可读性高。

总结与对比

方法 优点 缺点 适用场景
全局变量 最简单、性能最好 仅适用于列表页和内容页 绝大多数情况下的首选,尤其是在列表页和内容页中显示面包屑或标题时。
SQL查询 最灵活、功能强大 代码稍复杂,需要懂PHP和SQL 在自定义PHP文件、复杂标签或全局变量无法满足的特殊需求时使用。
自定义函数 最规范、最可复用 需要修改核心文件,对新手有一定门槛 当需要在多个地方调用,或者希望保持模板代码整洁、逻辑清晰时的最佳实践。

对于绝大多数用户和场景,强烈推荐使用方法一,如果需要更复杂的逻辑,再考虑方法三,因为它会让你的代码更易于维护。

-- 展开阅读全文 --
头像
dede列表页如何统计文章数量?
« 上一篇 前天
Linux C语言mkdir函数如何正确使用?
下一篇 » 前天
取消
微信二维码
支付宝二维码

目录[+]