dede如何获取指定栏目的子栏目名?

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

使用 {dede:channel} 标签 (最常用,推荐)

这是最标准、最灵活的方法,适用于列表页、首页等几乎所有需要循环子栏目的地方。

dede 指定栏目的子栏目名
(图片来源网络,侵删)

基本语法:

{dede:channel type='son' typeid='父栏目ID'}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}

参数详解:

  • typeid='父栏目ID'这是最关键的参数,你需要在这里填写你想要获取其子栏目的那个父栏目的ID,如果你想获取 ID 为 5 的栏目的子栏目,就写成 typeid='5'
  • type='son':指定获取类型为“子栏目”,这个参数非常重要,可以确保只获取直接下级栏目,而不是所有层级的栏目。
  • [field:typelink/]:子栏目的链接地址。
  • [field:typename/]:子栏目的名称。

实际应用场景

场景1:在父栏目的列表页(list_article.htm)中显示子栏目

假设你有一个栏目“新闻中心”,ID 为 3,你希望在“新闻中心”的列表页上方,自动显示它的所有子栏目(国内新闻”、“国际新闻”)。

操作步骤:

dede 指定栏目的子栏目名
(图片来源网络,侵删)
  1. 进入 DedeCMS 后台,找到“栏目管理”。
  2. 点击“新闻中心”栏目,进入“栏目管理” -> “更改”页面。
  3. 在“列表模板”选项中,选择或修改为你自定义的列表模板,list_news.htm
  4. 编辑 list_news.htm 文件,在合适的位置(<h1> 标签下方)添加以下代码:
<h1>[field:typename/]</h1>
<!-- 这是获取子栏目的代码 -->
<div class="sub-channel">
    <h3>子栏目:</h3>
    {dede:channel type='son' typeid='3'}
        <a href="[field:typelink/]">[field:typename/]</a> |
    {/dede:channel}
</div>
<!-- 原有的列表内容 -->
{dede:list pagesize='20'}
    ...
{/dede:list}

注意: 这里的 typeid='3' 是硬编码的,为了更灵活,织梦提供了一个全局变量 typeid,它自动代表当前栏目的 ID,所以你可以这样写,这样就不用关心具体 ID 是多少了:

<!-- 更灵活的写法,自动获取当前栏目ID -->
{dede:channel type='son' typeid='~typeid~'}
    <a href="[field:typelink/]">[field:typename/]</a> |
{/dede:channel}

注意:{dede:channel} 标签内部,typeid 的值通常直接使用数字,而 ~typeid~ 这种写法在某些模板引擎中有效,但在标准的 DedeCMS 标签中,直接使用 typeid 会自动继承外层的 typeid 值,所以最保险和推荐的方式是直接使用 {dede:channel type='son'},当它位于一个列表页或内容页时,它会自动获取当前栏目的子栏目。

修正后的最佳实践写法(在列表页):

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

因为 list_article.htm 模板本身就已经被指定给某个栏目,{dede:channel} 在此上下文中默认就会获取当前栏目的子栏目。

dede 指定栏目的子栏目名
(图片来源网络,侵删)

场景2:在首页(index.htm)中显示指定栏目的子栏目

假设你想在首页的某个侧边栏,显示 ID 为 10 的“产品展示”栏目的所有子栏目。

操作步骤:

  1. 编辑你的首页模板文件 index.htm
  2. 在你想要显示子栏目的位置,添加以下代码:
<div class="product-categories">
    <h3>产品分类</h3>
    {dede:channel type='son' typeid='10'}
        <a href="[field:typelink/]">[field:typename/]</a>
    {/dede:channel}
</div>

这里的 typeid='10' 是必须的,因为首页没有当前栏目概念,必须明确指定你要查询哪个栏目的子栏目。


使用 SQL 查询 (高级用法,适用于复杂逻辑)

当你需要在 PHP 代码中(比如自定义函数或插件)获取子栏目名,或者需要对结果进行更复杂的处理时,可以直接查询数据库。

SQL 语句:

SELECT id, typename, typedir FROM `dede_arctype` WHERE reid = '父栏目ID' AND ishidden = 0 ORDER BY sortrank ASC;

参数解释:

  • dede_arctype:DedeCMS 中存储栏目的表名,如果你的表前缀不是 dede_,请相应修改。
  • reid = '父栏目ID'reid 字段代表“父栏目ID”,通过这个条件可以筛选出所有直接子栏目。
  • ishidden = 0:排除被隐藏的栏目。
  • ORDER BY sortrank ASC:按照后台设置的“排序”值进行升序排列。

PHP 代码示例:

如果你想在自定义的 PHP 函数里获取子栏目名,可以这样写:

function getSubChannelNames($parent_id) {
    global $dsql;
    $sub_channels = array();
    // 执行SQL查询
    $query = "SELECT id, typename FROM `dede_arctype` WHERE reid = '{$parent_id}' AND ishidden = 0 ORDER BY sortrank ASC";
    $dsql->Execute('me', $query);
    // 循环处理结果
    while ($row = $dsql->GetArray('me')) {
        $sub_channels[] = $row['typename']; // 将子栏目名存入数组
    }
    return $sub_channels;
}
// 使用示例:获取ID为5的子栏目名
$parent_channel_id = 5;
$names = getSubChannelNames($parent_channel_id);
// 输出结果
echo "ID为 {$parent_channel_id} 的子栏目有:";
echo implode(', ', $names); // 国内新闻, 国际新闻, 科技新闻

使用 {dede:sql} 标签 (在模板中直接执行SQL)

这种方法不常用,因为 {dede:channel} 更简单,但如果某些特殊需求无法用 {dede:channel} 实现,也可以在模板中直接执行 SQL。

示例:在首页显示ID为10的子栏目名

{dede:sql sql='SELECT id, typename FROM dede_arctype WHERE reid = 10 AND ishidden = 0 ORDER BY sortrank ASC'}
    <a href="[field:typelink function='GetTypeUrl(@me)'/]">[field:typename/]</a>
{/dede:sql}

注意:

  • 这里需要手动构造 typelink(栏目链接),因为 SQL 查询没有直接提供这个字段。GetTypeUrl() 是一个 DedeCMS 的内置函数,可以根据栏目ID获取链接。
  • 这种方法可读性差,且性能不如 {dede:channel},除非有特殊需求,否则不推荐。

总结与对比

方法 优点 缺点 适用场景
{dede:channel} 简单、高效、标准,与织梦模板系统完美集成。 功能相对固定,无法进行复杂的数据筛选。 绝大多数情况,尤其是在列表页、首页等模板中循环显示子栏目。
SQL 查询 功能强大、灵活,可以获取任意字段并进行复杂逻辑处理。 需要编写代码,对新手不友好,有SQL注入风险(需注意变量过滤)。 在自定义PHP函数、插件,或者需要非常复杂的数据处理时。
{dede:sql} 可以在模板中执行任意SQL,非常灵活。 代码可读性差,性能较低,需要手动处理字段(如链接)。 极少数在模板中无法用 {dede:channel} 实现的特殊需求。

对于 99% 的需求,你都应该使用 {dede:channel type='son' typeid='父栏目ID'},它是最简洁、最安全、最高效的解决方案。

-- 展开阅读全文 --
头像
织梦网站如何适配手机显示?
« 上一篇 01-22
织梦m站为何无法调用CSS?
下一篇 » 01-22

相关文章

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

目录[+]