dede如何调用当前栏目的上一级栏目名称?

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

使用 {dede:field name='typeid'} 获取ID,再通过SQL查询(最通用)

这种方法的核心思路是:

dede调用上一级栏目
(图片来源网络,侵删)
  1. 先获取当前栏目的ID (typeid)。
  2. 再通过一个SQL查询语句,根据当前栏目的ID找到它的上一级栏目ID (topidreid)。
  3. 最后根据上一级栏目ID调用出上一级栏目的信息。

这种方法适用于任何模板文件,包括列表页 (list_*.htm页 (article_*.htm) 和自定义模板。

代码示例

假设你想在当前页面的某个位置显示上一级栏目的名称和链接。

{dede:sql sql="SELECT * FROM `dede_arctype` WHERE id = (SELECT reid FROM `dede_arctype` WHERE id = ~typeid~)"}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:sql}

代码解析:

  1. {dede:sql ...}: 这是 DedeCMS 的自定义SQL标签,用于执行数据库查询。
  2. sql="...": 里面是我们要执行的SQL语句。
  3. ~typeid~: 这是 DedeCMS 的一个特殊变量,会自动被替换为当前栏目的ID,如果当前栏目ID是 5,那么这里就变成了 WHERE id = (SELECT reid FROM ... WHERE id = 5)
  4. SELECT reid FROM dede_arctype WHERE id = 5: 这个子查询的作用是,在 dede_arctype (栏目表) 中找到ID为5的记录,并返回它的 reid 字段值。reid 父栏目ID”。
  5. SELECT * FROM dede_arctype WHERE id = (子查询结果): 外层查询则根据上一步得到的父栏目ID,查询出上一级栏目的所有信息。
  6. [field:typelink/]: 调用上一级栏目的链接地址。
  7. [field:typename/]: 调用上一级栏目的名称。

在列表页 (list_*.htm) 中直接调用

如果你只需要在列表页调用上一级栏目,可以利用 DedeCMS 内置的变量,方法更简单。

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

代码示例

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

代码解析:

  • {dede:type}...{/dede:type}: 这个标签在列表页中默认就是指当前栏目
  • 在列表页中,还有一个非常重要的内置变量:$typeinfos,它包含了当前栏目的所有信息,也包括了它的父级信息。
  • 我们可以直接使用 $typeinfos 的子项来调用上一级栏目。$typeinfos['reid'] 就是父级ID,$typeinfos['topid'] 是顶级ID,我们可以通过这个ID去获取父级栏目的完整信息。

更推荐写法:

{dede:geturl typeid='[field:reid/]' runphp='yes'}
    $typeid = @me;
    $row = $GLOBALS['dsql']->GetOne("SELECT * FROM `dede_arctype` WHERE id = $typeid");
    @me = "<a href='{$row['typedir']}'>{$row['typename']}</a>";
{/dede:geturl}

最简单直接的方式是结合 {dede:sql} 标签,与方法一类似,但在列表页中可以直接使用 [field:reid/] 来获取父级ID,代码更清晰。

{dede:sql sql="SELECT * FROM `dede_arctype` WHERE id = [field:reid/]"}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:sql}

页 (article_*.htm) 中调用

页,调用上一级栏目也非常方便,因为内容页也包含了当前文章所属栏目的所有信息。

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

代码示例

{dede:sql sql="SELECT * FROM `dede_arctype` WHERE id = [field:typeid function='GetTopid(@me)'/]"}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:sql}

代码解析:

  • [field:typeid function='GetTopid(@me)'/]: 这是一个非常实用的函数。
    • [field:typeid] 获取的是当前文章所属栏目的ID。
    • function='GetTopid(@me)' 会调用 DedeCMS 的 GetTopid() 函数,这个函数会根据传入的栏目ID,返回其顶级栏目的ID。
    • 这段代码调用的是顶级栏目,而不是直接的上一级栏目。

如果你想调用直接的上一级栏目,应该使用:

{dede:sql sql="SELECT * FROM `dede_arctype` WHERE id = [field:reid/]"}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:sql}

或者,直接使用内容页内置的 $typename 变量(它代表当前栏目名称)和 $typelink(代表当前栏目链接),但这只能获取到当前栏目,要获取上一级,还是需要SQL查询。


使用 channel 标签(适用于导航栏等)

如果你想在页面的某个位置(比如面包屑导航上方)显示一个固定的“返回上级栏目”的链接,并且这个上级栏目是动态的,你也可以使用 channel 标签结合PHP。

这种方法稍微复杂一点,但功能强大。

代码示例

{dede:php}
    $typeid = $GLOBALS['typeid'];
    $dsql = new DedeSql(false);
    $row = $dsql->GetOne("SELECT reid,topid FROM `dede_arctype` WHERE id = $typeid");
    $parent_id = $row['reid'];
    $top_id = $row['topid'];
    // 如果存在上级栏目
    if($parent_id > 0){
        $parent_row = $dsql->GetOne("SELECT id,typename,typedir FROM `dede_arctype` WHERE id = $parent_id");
        echo "<a href='".$parent_row['typedir']."'>".$parent_row['typename']."</a>";
    }
    // 如果没有上级栏目(即顶级栏目),则可以调用顶级栏目本身或做其他处理
    else{
        // echo "这是顶级栏目";
    }
    $dsql->Close();
{/dede:php}

代码解析:

  1. {dede:php}...{/dede:php}: 允许在模板中直接执行PHP代码。
  2. 我们首先获取当前栏目的ID ($GLOBALS['typeid'])。
  3. 然后执行一次查询,获取这个栏目的 reid (父级ID) 和 topid (顶级ID)。
  4. 判断 reid 是否大于0,如果是,说明它不是顶级栏目。
  5. 再次执行查询,根据 reid 获取上一级栏目的完整信息(名称、链接等)。
  6. 最后用 echo 输出HTML代码。

总结与推荐

场景 推荐方法 优点 缺点
通用模板 (列表/内容/自定义) 方法一 ({dede:sql}) 逻辑清晰,最通用,不依赖特定页面变量 SQL语句稍复杂
*仅列表页 (`list_.htm`)** 方法二 ({dede:sql} + [field:reid/]) 代码简洁,直接利用列表页变量 仅限列表页使用
复杂逻辑/需要PHP处理 方法四 ({dede:php}) 灵活性最高,可以做任何判断和处理 代码量大,需要PHP基础

对于绝大多数情况,方法一 ({dede:sql}) 是最推荐、最稳定、最容易理解的方案,你可以把它复制到任何需要的地方,稍作修改即可使用。

-- 展开阅读全文 --
头像
dede第一个子栏目如何设置?
« 上一篇 今天
织梦手机站为何不自动更新?
下一篇 » 今天
取消
微信二维码
支付宝二维码

目录[+]