帝国cms取当前一级栏目下的二级栏目

admin 102 0
在帝国CMS中,获取当前一级栏目下的二级栏目,可通过模板标签或PHP代码实现,若在一级栏目页,使用[class]标签获取当前栏目信息,结合$class_r数组中的父栏目ID(如$class_r[classid]为当前栏目ID,其父栏目ID为$class_r[bclassid]),再通过[e:loop]循环查询bclassid等于当前栏目ID的二级栏目,输出栏目名称及链接,此方法适用于导航栏、子栏目列表等场景,帮助快速构建栏目层级结构,提升网站内容组织效率。

帝国CMS高效获取当前一级栏目下所有二级栏目的方法与代码实现

在帝国CMS网站开发过程中,栏目导航是构建清晰信息架构的核心元素,一个常见且重要的需求是“动态获取当前一级栏目下的所有二级子栏目”,此功能广泛应用于面包屑导航、侧边栏分类列表、内容聚合页、相关栏目推荐等多种场景,本文将深入剖析帝国CMS的栏目数据结构,并详细阐述两种主流实现方案:利用内置函数 `GetClass()` 和直接数据库查询,提供完整、可复用的代码示例及关键注意事项。

深入理解帝国CMS的栏目层级存储机制

要高效实现子栏目获取,首先需清晰把握帝国CMS的栏目数据存储逻辑,所有栏目信息核心存储在数据库表 `phome_enewsclass` 中(表前缀 `phome_` 可根据安装配置调整),该表的关键字段及其含义如下:

  • classid:**栏目唯一标识符**,每个栏目的唯一ID。
  • bclassid:**父栏目ID**,一级栏目的此字段值为 `0`;二级栏目的此字段值为其所属一级栏目的 classid;以此类推构成层级关系。
  • classname:**栏目名称**,用于前台显示。
  • classpath:**栏目路径标识**,用于生成栏目页URL。
  • showclass:**显示状态控制**,值为 `1` 表示前台可见,`0` 表示隐藏(通常用于后台管理或特殊逻辑控制)。

基于此结构,“获取当前一级栏目下的所有二级栏目”的本质逻辑是:**以目标一级栏目的 classidbclassid 条件,查询 phome_enewsclass 表中所有满足该条件且 showclass=1 的记录。**

精准定位当前一级栏目ID的核心策略

无论调用场景是在一级栏目页本身,还是在其下的二级栏目页,首要任务是准确获取“当前一级栏目”的 classid,根据页面类型的不同,获取方法存在差异:

当前页面为一级栏目页

当用户直接访问一级栏目页面(`/news/` 对应“新闻中心”)时,帝国CMS的全局变量 $GLOBALS['navclassid'] 直接存储了该一级栏目的 classid,此为最简单直接的情况。

当前页面为二级栏目页

当用户访问二级栏目页面(`/news/tech/` 对应“科技新闻”)时,$GLOBALS['navclassid'] 存储的是该**二级栏目**自身的 classid,需通过数据库查询该二级栏目的记录,获取其 bclassid 字段值,该值即为所属一级栏目的 classid

优先推荐 - 使用帝国CMS内置函数 `GetClass()`

帝国CMS内置了强大的 `GetClass()` 函数,专门用于高效获取指定父栏目下的所有直接子栏目(即下一级栏目),其标准语法为:

GetClass($bclassid, $showclass = 1)

参数详解:

  • $bclassid (必填):**父栏目ID**,即要查询其子栏目的那个一级栏目的 classid
  • $showclass (可选,默认为 `1`):**是否仅获取前台可见栏目**,设置为 `1` 时,函数会自动过滤掉 showclass=0 的隐藏栏目;设置为 `0` 则获取所有子栏目(包括隐藏的)。

核心优势: 该函数底层已封装了高效的数据库查询逻辑和必要的过滤条件,使用简单、性能良好,且符合帝国CMS的官方推荐实践。**强烈优先使用此方法。**

实现示例 1:在一级栏目页获取其下所有二级栏目

假设当前页面是“新闻中心”(一级栏目,classid = 5),直接调用 `GetClass()` 即可:

// 获取该一级栏目下所有显示状态的二级栏目
$sonclass_r = GetClass($bclassid); // 默认 $showclass=1

// 检查是否有子栏目并遍历输出 if (is_array($sonclass_r) && !empty($sonclass_r)) { echo '

    '; foreach ($sonclass_r as $class) { // $class 包含子栏目的所有字段信息 (classid, classname, classpath 等) $sub_class_url = $class['classpath'] . '/'; // 子栏目URL路径 echo '
  • ' . $class['classname'] . '
  • '; } echo '
'; } else { echo '

该栏目暂无子栏目。

'; } ?>

实现示例 2:在二级栏目页获取其所属一级栏目下的所有二级栏目

假设当前页面是“科技新闻”(二级栏目),需先获取其所属一级栏目(“新闻中心”)的ID,再调用 `GetClass()`:

// 2. 查询该二级栏目记录,获取其父级栏目ID (即一级栏目ID)
$bclassid_sql = $empire->query("SELECT bclassid FROM {$dbtbpre}enewsclass WHERE classid = $current_classid");
$bclassid_r = $empire->fetch($bclassid_sql);
$parent_bclassid = $bclassid_r['bclassid']; // 5 (新闻中心的ID)

// 3. 使用获取到的一级栏目ID调用 GetClass() $sonclass_r = GetClass($parent_bclassid);

// 4. 输出逻辑同示例1 (省略,结构相同) if (is_array($sonclass_r) && !empty($sonclass_r)) { echo '

    '; foreach ($sonclass_r as $class) { $sub_class_url = $class['classpath'] . '/'; echo '
  • <a href="' . $sub_class

    标签: #二级栏目 #一级栏目