dede当前栏目文章如何调用与显示?

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

使用 GetSonIds() 自定义函数 (最常用、最推荐)

这是获取当前栏目及其所有子栏目下文章 ID 的标准方法,它特别适用于当你需要一个栏目列表(产品分类”)并且希望点击这个分类时,能展示它自己以及它下面所有子分类的文章。

步骤 1: 确保函数存在

这个函数通常存在于 /include/common.func.php 文件中,请打开你的网站根目录下的这个文件,查找是否存在 GetSonIds() 函数,如果不存在,请将以下代码添加到文件末尾:

/**
 * 获取子栏目ID
 * @param int $typeid 父栏目ID
 * @param string $symbol 返回ID之间的连接符号,默认为逗号
 * @return string 返回子栏目ID字符串
 */
if (!function_exists('GetSonIds'))
{
    function GetSonIds($typeid, $symbol = ',')
    {
        global $dsql;
        $ids = '';
        $query = "SELECT id FROM `#@__arctype` WHERE reid='$typeid' OR topid='$typeid'";
        $dsql->SetQuery($query);
        $dsql->Execute();
        while ($row = $dsql->GetArray())
        {
            $ids .= $row['id'] . $symbol;
            // 递归调用,获取所有层级的子栏目
            $son_ids = GetSonIds($row['id'], $symbol);
            if ($son_ids) {
                $ids .= $son_ids;
            }
        }
        return trim($ids, $symbol);
    }
}

提示:在较新版本的 DedeCMS 中,这个函数通常是自带的,如果你的模板标签 {dede:field.typeid/} 能正常工作,那么这个函数大概率也已经存在了。

步骤 2: 在模板文件中使用

在你需要调用文章列表的模板文件中(list_article.htm),使用 {dede:arclist} 标签,并通过 typeid 属性调用这个函数。

示例代码:

{dede:arclist len='30' 
    row='10' 
    orderby='pubdate' 
    orderway='desc' 
    typeid='GetSonIds(@me)'
}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
    </li>
{/dede:arclist}

代码解释:

  • typeid='GetSonIds(@me)': 这是核心部分。
    • @me: 这是 DedeCMS 模板中的一个特殊变量,在这里它代表当前栏目的 ID,即 {dede:field.typeid/} 的值。
    • GetSonIds(): 我们刚刚添加的自定义函数。
    • 整个 typeid 属性的值会被解析为 GetSonIds(当前栏目ID),函数会返回一个由当前栏目ID和所有子栏目ID组成的、用逗号分隔的字符串,5,6,7,8
  • {dede:arclist}: 这是 DedeCMS 的文章列表调用标签,len='30'`: 标题长度,最多显示30个字符。
  • row='10': 调用10篇文章。
  • orderby='pubdate': 按发布时间排序。
  • orderway='desc': 降序排列(最新的在前)。

直接使用当前栏目 ID (仅限当前栏目)

如果你只想获取当前栏目本身下的文章,而不包含其子栏目,那么方法就非常简单了。

步骤 1: 在模板文件中使用

直接在 {dede:arclist} 标签中指定 typeid 为当前栏目。

示例代码:

{dede:arclist len='30' 
    row='10' 
    orderby='pubdate' 
    orderway='desc' 
    typeid='{dede:field.typeid/}'
}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
    </li>
{/dede:arclist}

代码解释:

  • typeid='{dede:field.typeid/}': 这里我们直接使用了 {dede:field.typeid/} 标签来获取当前栏目的ID。{dede:arclist} 会只从这个ID对应的栏目中调用文章。

使用“自由列表” (后台配置,无需修改代码)

如果你不想修改任何模板文件,或者这个需求是临时的,可以使用 DedeCMS 后台的“自由列表”功能。

步骤 1: 进入自由列表管理

  1. 登录 DedeCMS 后台。
  2. 在左侧菜单栏找到 【核心】 -> 【自由列表】
  3. 点击 “增加一个自由列表”

步骤 2: 配置自由列表

  1. 列表名称: 填写一个你容易识别的名称,公司新闻列表”。

  2. 按SQL语句查询: 选择这个选项。

  3. SQL语句: 输入以下查询语句。

    • 仅当前栏目:
      SELECT * FROM `#@__archives` WHERE typeid = '{dede:field.typeid/}' ORDER BY pubdate DESC
    • 当前栏目及所有子栏目:
      SELECT * FROM `#@__archives` WHERE typeid IN (SELECT id FROM `#@__arctype` WHERE reid = '{dede:field.typeid/}' OR id = '{dede:field.typeid/}') ORDER BY pubdate DESC

      或者,如果你已经添加了 GetSonIds 函数,也可以这样写(更简洁):

      SELECT * FROM `#@__archives` WHERE typeid IN ({dede:php}echo GetSonIds(@me);{/dede:php}) ORDER BY pubdate DESC

      注意: 在自由列表的SQL中,{dede:field.typeid/} 需要用单引号括起来,因为它在PHP中是一个字符串。

  4. 保存: 点击“保存”按钮。

步骤 3: 调用生成的列表

保存后,系统会生成一个频道,你可以在后台的“频道管理”中找到这个新创建的自由列表频道,它会生成一个固定的链接(如 /plus/list.php?tid=自定义ID),你可以在任何页面通过 <a href="/plus/list.php?tid=自定义ID">公司新闻</a> 的形式来调用这个列表。


总结与对比

方法 优点 缺点 适用场景
方法一: GetSonIds() 最灵活、最强大,支持递归获取所有子栏目,是 DedeCMS 的标准做法。 需要确保 /include/common.func.php 中有此函数。 绝大多数情况,特别是需要展示分类树及其下所有内容的场景。
方法二: 直接 typeid 最简单、最直接,无需任何额外函数。 只能获取当前栏目本身的内容,不包含子栏目。 只需要展示当前栏目、不涉及子分类的简单列表。
方法三: 自由列表 无需修改模板,后台配置即可,适合临时需求。 不够灵活,每次修改都需要进后台,且不能直接在模板中动态使用 @me 临时生成一个特殊列表,或不想触碰模板文件时。

对于绝大多数开发者来说,强烈推荐使用方法一 (GetSonIds()),因为它是最规范、最可扩展的解决方案。

-- 展开阅读全文 --
头像
dede后台为何不显示文章?
« 上一篇 04-01
模型管理系统如何高效管理内容?
下一篇 » 04-01

相关文章

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

目录[+]