dede如何查询栏目的子类?

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

使用DedeCMS系统标签(推荐)

这是最简单、最常用的方法,适用于在模板文件(.htm)中直接调用。

dede查询栏目的子类
(图片来源网络,侵删)

核心标签:{dede:channel}

{dede:channel}标签不仅可以用于主导航,也可以通过指定顶级栏目ID来查询其下的所有子栏目(包括多级子栏目)。

基本语法:

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

参数说明:

  • typeid='顶级栏目ID': 这是关键参数,你需要将其设置为你想查询子栏目的那个顶级栏目的ID,如果你不写这个参数,默认会获取当前栏目的子栏目。
  • type='son': 指定获取类型为“子栏目”,这个参数非常重要,它告诉DedeCMS要获取的是指定栏目下的所有层级的子栏目。
  • row='数字': 可选参数,用于限制显示的子栏目数量。row='10' 只显示前10个子栏目。

完整示例

假设你的网站首页(index.htm)上,想在ID为 1 的“产品中心”栏目下显示所有子栏目。

dede查询栏目的子类
(图片来源网络,侵删)

步骤:

  1. 登录DedeCMS后台,找到“栏目管理”。
  2. 找到“产品中心”这个栏目,查看其“栏目ID”,假设ID是 1
  3. 打开你的首页模板文件 index.htm
  4. 在你想要显示子栏目的位置,插入以下代码:
<h3>产品中心</h3>
<ul>
    {dede:channel type='son' typeid='1'}
    <li>
        <a href="[field:typelink/]">[field:typename/]</a>
    </li>
    {/dede:channel}
</ul>

代码解释:

  • {dede:channel type='son' typeid='1'}: 开始循环,获取ID为 1 的栏目的所有子栏目。
  • [field:typelink/]: 输出子栏目的链接地址。
  • [field:typename/]: 输出子栏目的名称。
  • </li></ul>: 循环结束后,闭合HTML标签。

进阶用法:只获取直接子栏目(不包含孙栏目)

如果你只想获取“产品中心”下的第一级子栏目,而不想包含更深层的栏目(产品分类”下的“具体产品”),你需要使用 reid 参数。

语法:

dede查询栏目的子类
(图片来源网络,侵删)
{dede:channel type='self' reid='顶级栏目ID'}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}

参数说明:

  • type='self': 指定获取类型为“同级栏目”。
  • reid='顶级栏目ID': 指定父栏目的ID,这个组合的含义是“查找所有父栏目ID为 reid 值的栏目”,也就是直接子栏目。

示例:

<h3>产品分类</h3>
<ul>
    {dede:channel type='self' reid='1'}
    <li>
        <a href="[field:typelink/]">[field:typename/]</a>
    </li>
    {/dede:channel}
</ul>

使用PHP代码(更灵活)

如果你需要在PHP文件(如 .php 文件)中进行查询,或者需要更复杂的逻辑处理,那么直接使用PHP代码会更灵活。

核心函数:GetSonIds()

这个函数是DedeCMS内置的,非常强大,它可以递归地获取一个栏目ID及其所有子栏目的ID,并以逗号分隔的字符串形式返回。

函数原型:

function GetSonIds($typeid, $channelid = 0)
  • $typeid: 父级栏目的ID。
  • $channelid: 可选,模型ID,默认为0。

返回值:

返回一个包含所有子栏目ID的字符串,"2,3,4,5,6",如果该栏目没有子栏目,则返回其自身的ID,"1"

完整示例

假设你在一个自定义的PHP页面(custom_page.php)中,想获取ID为 1 的“产品中心”下的所有子栏目,并循环显示它们。

步骤:

  1. 确保你的PHP文件已经包含了DedeCMS的核心文件,通常在模板的PHP文件开头会引入 include/common.inc.php
  2. 编写PHP代码。

示例代码:

<?php
require_once(dirname(__FILE__)."/include/common.inc.php"); // 引入DedeCMS核心文件
// 1. 定义要查询的顶级栏目ID
$top_typeid = 1;
// 2. 获取该栏目及其所有子栏目的ID
$son_ids = GetSonIds($top_typeid);
// GetSonIds返回的是字符串,我们需要将其转换为数组,以便SQL查询
$son_id_array = explode(',', $son_ids);
// 3. 使用这些ID去查询栏目表 `dede_arctype`
$sql = "SELECT id, typename, typelink FROM `#@__arctype` WHERE id IN (".implode(',', $son_id_array).") ORDER BY sortrank ASC";
$dsql->SetQuery($sql);
$dsql->Execute();
// 4. 循环输出结果
echo "<h3>产品中心</h3>";
echo "<ul>";
while($row = $dsql->GetArray())
{
    echo "<li>";
    echo "<a href='".$row['typelink']."'>".$row['typename']."</a>";
    echo "</li>";
}
echo "</ul>";
?>

代码解释:

  1. require_once(...): 引入DedeCMS,这样我们才能使用它的函数和变量。
  2. $top_typeid = 1;: 设置顶级栏目的ID。
  3. $son_ids = GetSonIds($top_typeid);: 调用函数,得到所有子栏目的ID字符串。
  4. $son_id_array = explode(',', $son_ids);: 将ID字符串(如 "2,3,4")转换为数组(如 ['2', '3', '4'])。
  5. $sql = ...: 构建SQL查询语句,从 dede_arctype 表中获取这些ID对应的栏目信息。
  6. $dsql->Execute();: 执行查询。
  7. while($row = $dsql->GetArray()): 循环获取查询结果,并使用 echo 输出HTML。

方法 适用场景 优点 缺点
系统标签 {dede:channel} 在模板文件(.htm)中直接调用 简单、快捷、无需PHP知识 灵活性相对较低,功能受限
PHP代码 GetSonIds() 在PHP文件(.php)中调用,或需要复杂逻辑时 功能强大、极其灵活、可进行二次处理 需要一定的PHP编程基础

对于绝大多数网站模板制作需求,方法一(系统标签) 是首选,只有在特殊情况下,才需要使用方法二(PHP代码),希望这个详细的解释能帮助你解决问题!

-- 展开阅读全文 --
头像
C语言中long与char类型有何区别?
« 上一篇 今天
织梦批量加内链插件,如何自动添加且不重复?
下一篇 » 今天

相关文章

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

目录[+]