织梦如何调用上级栏目链接?

99ANYc3cd6
预计阅读时长 19 分钟
位置: 首页 织梦建站 正文

使用 {dede:field name='position'} 标签(最推荐,用于面包屑)

这是最简单、最标准的方法,专门用于生成面包屑导航(也叫“当前位置”),它会自动获取从顶级栏目到当前栏目的完整路径,并用 >> 分隔。

织梦调用上级栏目链接
(图片来源网络,侵删)

标签代码:

{dede:field name='position'/}

示例效果: 如果你的文章位于 首页 >> 新闻中心 >> 国内新闻 这个路径下,{dede:field name='position'} 输出的HTML就是:

<a href='http://你的域名/'>首页</a> >> <a href='http://你的域名/news/'>新闻中心</a> >> <a href='http://你的域名/news/gn/'>国内新闻</a>

如何只获取上级栏目的链接?

{dede:field name='position'} 会输出整个路径,如果你只想获取直接上级栏目的链接,需要一些技巧,可以通过获取完整的 position 字符串,然后用PHP代码进行截取和解析。

织梦调用上级栏目链接
(图片来源网络,侵删)

示例:只获取上级栏目链接

在文章页或列表页模板中,可以这样写:

{dede:field name='position' runphp='yes'}
    // 获取完整的position字符串,"首页 >> 新闻中心 >> 国内新闻"
    $position = @me;
    // 按 ">> " 分割成数组
    $arr = explode('>> ', $position);
    // 去掉数组的第一个元素(首页)和最后一个元素(当前栏目)
    // array_pop() 去掉最后一个,array_shift() 去掉第一个
    array_pop($arr); 
    array_shift($arr);
    // 如果上级栏目不止一层(比如新闻中心),我们需要重新拼接
    // 如果上级栏目只有一层(比如直接在首页下的栏目),这个逻辑会出问题,所以更健壮的方法是获取上一级ID
    // 更好的方法:直接获取上一级栏目ID
    $upid = $GLOBALS['envs']['arcid'] ? GetTopid($GLOBALS['envs']['arcid']) : 0; // 获取当前栏目的顶级ID,这个不适用
    // 修正:直接获取当前栏目的父级ID
    $arc = GetOneArchive($GLOBALS['envs']['arcid']); // 获取当前文档的信息
    $upid = $arc['typeid'] ? $arc['topid'] : 0; // 获取当前栏目的顶级ID,还是不对
    // 正确获取父级ID的方法:
    $sql = "SELECT reid FROM `dede_arctype` WHERE id = '{$GLOBALS['envs']['arcid']}'";
    $row = $GLOBALS['dsql']->GetOne($sql);
    $upid = $row['reid'];
    if($upid > 0){
        $typeinfo = GetOneType($upid);
        @me = "<a href='".$typeinfo['typedir']."'>".$typeinfo['typename']."</a>";
    }else{
        @me = "";
    }
    // 下面是一个更简单但可能不够严谨的字符串处理方法,适用于结构简单的网站
    /*
    $count = count($arr);
    if($count > 0){
        // 去掉最后一个元素(当前栏目)
        array_pop($arr);
        // 重新拼接
        $parent_str = implode(' >> ', $arr);
        @me = $parent_str;
    }else{
        @me = '首页';
    }
    */
{/dede:field}

对于“只获取上级链接”这个需求,直接用SQL查询数据库获取父级ID是最准确的方法,但99%的情况下,你需要的其实是面包屑,所以方法一才是最推荐的。


使用 {dede:type} 标签(用于已知上级栏目ID)

如果你在模板中已经知道上级栏目的ID(比如在列表页或内容页通过其他方式获取到了),{dede:type} 是最直接的选择。

标签代码:

{dede:type typeid='上级栏目的ID'}
    <a href='[field:typedir/]'>[field:typename/]</a>
{/dede:type}

如何获取上级栏目ID?

你可以在模板中先通过PHP获取到上级ID,然后再交给 {dede:type} 使用,这通常用在文章页或列表页。

示例(在文章页调用上级栏目链接):

假设你在文章详情页 article_article.htm,想获取当前文章所在栏目的直接上级栏目链接。

{dede:php}
    // 获取当前文章的栏目ID
    $arcid = $GLOBALS['envs']['arcid'];
    // 查询当前栏目的信息,以获取其父级ID (reid)
    $sql = "SELECT reid FROM `dede_arctype` WHERE id = '{$arcid}'";
    $row = $GLOBALS['dsql']->GetOne($sql);
    // 父级ID
    $parent_id = $row['reid'];
    // 如果存在父级栏目
    if ($parent_id > 0) {
        // 查询父级栏目的详细信息
        $parent_type = $GLOBALS['dsql']->GetOne("SELECT id, typename, typedir FROM `dede_arctype` WHERE id = '{$parent_id}'");
        // 将信息输出到模板
        echo "<a href='".$parent_type['typedir']."'>".$parent_type['typename']."</a>";
    }
{/dede:php}

通过自定义函数(最灵活、可复用)

如果你在多个模板中都需要这个功能,或者想让调用更简洁,最好的方式是创建一个自定义函数。

步骤 1:创建函数文件

include/extend.func.php 文件中(如果这个文件不存在,就新建一个)添加以下PHP函数:

/**
 * 获取指定栏目的直接上级栏目链接
 * @param int $typeid 当前栏目ID
 * @return string 返回上级栏目的HTML链接,如果没有则返回空字符串
 */
function GetParentTypeLink($typeid = 0) {
    if (empty($typeid)) {
        global $typeid; // 如果没有传入ID,尝试从全局变量获取
    }
    $dsql = new DedeSql(false);
    $row = $dsql->GetOne("SELECT reid FROM `dede_arctype` WHERE id = '{$typeid}'");
    if (empty($row['reid'])) {
        return '';
    }
    $parent_row = $dsql->GetOne("SELECT id, typename, typedir FROM `dede_arctype` WHERE id = '{$row['reid']}'");
    if (empty($parent_row)) {
        return '';
    }
    return "<a href='{$parent_row['typedir']}'>{$parent_row['typename']}</a>";
}

步骤 2:在模板中调用

你可以在任何需要的地方,像调用普通标签一样使用这个函数了。

示例:

在文章页调用上级栏目链接:
{dede:php}
    echo GetParentTypeLink($GLOBALS['envs']['arcid']);
{/dede:php}
在列表页调用上级栏目链接:
{dede:php}
    echo GetParentTypeLink($GLOBALS['typeid']);
{/dede:php}
或者直接传入ID:
{dede:php}
    echo GetParentTypeLink(5); // 假设上级栏目ID是5
{/dede:php}

总结与推荐

方法 优点 缺点 适用场景
{dede:field name='position'} 最简单、最标准,专门用于面包屑 无法直接获取单个上级链接 面包屑导航{dede:field name='position'/}
{dede:type} 语法清晰,直接明了 需要预先知道上级栏目ID 当你通过其他方式(如PHP)获取到上级ID后,快速生成链接
自定义函数 最灵活、最可复用,代码整洁 需要修改PHP文件,对新手稍复杂 在网站中多处需要调用上级链接,追求代码复用和维护性的项目

给你的最终建议:

  1. 如果你要做面包屑导航,直接使用 方法一 {dede:field name='position'/},这是它的本职工作。
  2. 如果你只需要在某个特定位置显示上级链接,并且能通过PHP获取到ID,使用 方法二{dede:type} 标签即可。
  3. 如果你的网站结构复杂,或者这个需求会在很多地方出现,强烈推荐你花几分钟时间配置 方法三,创建自定义函数,这会让你的模板文件非常干净,也更容易后期维护。
-- 展开阅读全文 --
头像
C语言程序设计题库答案哪里找?
« 上一篇 前天
100以内完数C语言如何实现?
下一篇 » 前天

相关文章

取消
微信二维码
支付宝二维码

目录[+]