帝国cms在列表页调用上级栏目的子目录

admin 102 0
在帝国CMS列表页调用上级栏目的子目录,可通过[e:loop]标签结合栏目ID处理实现,首先获取当前栏目的上级栏目ID,使用$bclassid=$GLOBALS['navclassid']获取当前栏目ID,再通过GetTopClassid($bclassid)获取顶级栏目ID(若需直接上级栏目,可调整函数参数),然后用[e:loop]循环调用该上级栏目的子栏目,参数为"select classid,classname,classpath from phome_enewsclass where bclassid='$上级栏目ID' order by myorder,classid desc",输出栏目名称([classname])和链接([classpath])即可实现。

帝国CMS列表页调用上级栏目子栏目的高效实现方案

在利用帝国CMS构建网站时,栏目体系的规划是内容组织与用户体验的基石,一个常见且实用的需求是:在**列表页**中动态调用当前栏目的**上级栏目(父栏目)**所包含的所有**子栏目(兄弟栏目)**,当用户浏览“时政新闻”列表页时,我们希望同时展示“国内新闻”栏目下的其他子栏目(如“社会新闻”、“财经新闻”等),作为同级内容导航,显著提升用户浏览效率和内容发现率,本文将深入探讨帝国CMS实现此功能的多种方法,提供详尽的代码示例、关键注意事项及优化技巧。

需求场景与核心概念解析

典型应用场景

假设网站栏目结构如下:

  • 一级栏目:新闻中心
  • 二级栏目:国内新闻
  • 三级栏目:时政新闻(当前所在栏目)

目标:在“时政新闻”的列表页(通常通过 `/e/public/ListInfo/index.php?classid=[!--classid--]` 访问)中,展示“国内新闻”下的所有直接子栏目(即“时政新闻”、“社会新闻”、“财经新闻”等),形成同级栏目导航块。

关键术语界定

  • 上级栏目(父栏目):指当前栏目的直接父级栏目,在示例中,“时政新闻”的上级栏目是“国内新闻”。
  • 子栏目(兄弟栏目):指上级栏目(父栏目)下的所有直接下级栏目,在示例中,“国内新闻”下的“时政新闻”、“社会新闻”、“财经新闻”等互为兄弟栏目。
  • 列表页:展示特定栏目下所有内容列表的页面,通常由帝国CMS的列表模板(List)生成。
  • 栏目ID:帝国CMS中每个栏目的唯一标识符,是进行数据库查询和模板调用的核心参数。

实现原理:定位父栏目并查询其子栏目

实现该功能的核心逻辑包含三个关键步骤:

  1. **获取当前栏目的上级栏目ID(父栏目ID)**:利用帝国CMS提供的系统变量。
  2. **基于父栏目ID查询其所有子栏目**:编写SQL语句查询数据库。
  3. **在列表页模板中循环输出子栏目信息**:使用帝国CMS的循环标签渲染结果。

帝国CMS模板中可直接使用的核心变量:

  • [!--classid--]:**当前栏目ID**。
  • [!--bclassid--]:**当前栏目的上级栏目ID(父栏目ID)**,这是实现本功能的关键变量。

具体实现方法与代码示例

灵活运用 [e:loop] 标签(推荐首选)

[e:loop] 是帝国CMS功能最强大的循环调用标签,支持自定义SQL查询,能灵活处理各种复杂场景,是实现本需求的首选方案。

核心代码实现

在列表页模板(如 `list.var.php` 或直接在列表模板中)的合适位置,插入以下代码块:

<div class="brother-class">
    <h3>同级栏目导航</h3>
    <ul>
        [e:loop={
            "SELECT classid, classname, classpath 
            FROM [!db.pre!]enewsclass 
            WHERE bclassid='$bclassid' 
            AND showclass=1 
            ORDER BY myorder ASC, classid ASC", 
            0, 24, 0
        }]
        <li>
            <a href="[!--news.url]" title="">
                <?=htmlspecialchars($bqr[classname])?> <!-- 防止XSS攻击 -->
            </a>
        </li>
        [/e:loop]
    </ul>
</div>
代码深度解析
  • SQL语句详解
    • SELECT classid, classname, classpath FROM [!db.pre!]enewsclass:查询栏目表(`enewsclass`)的ID、名称、路径,`[!db.pre!]` 是帝国CMS的表前缀占位符,会自动替换为实际前缀(如 `phome_`)。
    • WHERE bclassid='$bclassid':**核心筛选条件**,限定查询范围仅为当前栏目的父栏目(`$bclassid` 即 `[!--bclassid--]`)下的子栏目。
    • AND showclass=1:**重要过滤**,确保只查询在后台管理中设置为“显示栏目”(`showclass=1`)的项目,避免隐藏栏目被调用。
    • ORDER BY myorder ASC, classid ASC:**排序规则**,优先按后台设置的“栏目排序值”(`myorder`)升序排列,若排序值相同则按栏目ID升序排列,保证显示顺序可控。
  • [e:loop] 参数说明
    • 第一个参数(SQL):自定义查询语句。
    • 第二个参数(0):返回记录数,0表示不限制(根据实际需求调整,如设置10条)。
    • 第三个参数(24):模板ID,0表示使用循环体内部代码。
    • 第四个参数(0):是否开启缓存,0表示不缓存。
  • 循环体变量
    • $bqr[classid]:子栏目ID。
    • $bqr[classname]:子栏目名称(**强烈建议使用 htmlspecialchars() 函数进行转义**,防止XSS攻击)。
    • $bqr[classpath]:子栏目路径(通常以 `/` 开头,如 `/news/domestic/`)。
    • [!--news.url] 标签: #帝国cms 列表页 #上级栏目 子目录