dede channel 选中如何实现?

99ANYc3cd6
预计阅读时长 16 分钟
位置: 首页 DEDE建站 正文
  1. 发布/编辑时:选择文章要归属的栏目。
  2. 前端模板调用时:高亮显示当前所在的栏目,实现导航菜单的“选中”状态。
  3. 自定义表单或程序逻辑中:需要获取或判断某个栏目是否被选中。

下面我将分这三种最常见的情况,提供详细的解决方案。

dede channel 选中
(图片来源网络,侵删)

发布/编辑时选择栏目

这是 DedeCMS 最基本的功能,当你发布一篇文章时,系统会自动提供一个栏目选择的下拉菜单。

如何操作:

  1. 登录 DedeCMS 后台。
  2. 进入「内容管理」 -> 「添加普通文章」 或 「编辑文档」。
  3. 在文章编辑页面的顶部,你会看到一个名为“选择主栏目”的下拉框。
  4. 点击下拉框,从所有你创建好的栏目中选择一个即可。

核心原理: 这个下拉框是通过表单元素 <select> 实现的,它的选项数据来自于 dede_arctype 数据表(栏目表),当你选择一个栏目并提交表单时,文章的 typeid 字段就会被设置为该栏目的 ID,从而建立了文章与栏目之间的关联。


前端模板中高亮显示“选中”的栏目(导航菜单)

这是最常见的需求,比如网站的顶部导航栏,当用户访问“产品中心”时,“产品中心”这一项需要高亮显示(比如改变颜色或背景)。

dede channel 选中
(图片来源网络,侵删)

实现方法:

DedeCMS 提供了非常方便的模板标签来实现这个功能,最常用的是 channel

使用 channel 标签(推荐)

channel 标签可以递归地获取所有栏目,并且会自动给当前所在页面对应的栏目添加一个 current 类。

示例代码(用于顶部导航):

在你的模板文件(通常是 templets/default/header.htm)中,加入以下代码:

dede channel 选中
(图片来源网络,侵删)
<div id="nav">
    <ul>
        {dede:channel type='top' currentstyle="<li class='thisclass'><a href='~typelink~'>~typename~</a></li>"}
        <li><a href='[field:typeurl/]'>[field:typename/]</a></li>
        {/dede:channel}
    </ul>
</div>

代码解析:

  • {dede:channel type='top' ...}:调用顶级栏目。
    • type='top':表示只调用顶级栏目,如果需要调用所有栏目(包括子栏目),可以去掉这个属性或设置为 。
  • currentstyle="...":这是实现“选中”效果的核心,它的作用是:当循环的栏目是当前页面所在的栏目时,就使用这里的 HTML 代码来替换默认的 <li><a>...</a></li> 结构。
  • ~typelink~:会被替换为当前栏目的链接地址。
  • ~typename~:会被替换为当前栏目的名称。
  • [field:typeurl/][field:typename/]:这是默认样式里使用的字段标签,作用和 ~typelink~~typename~ 一样。

CSS 样式:

为了让高亮效果生效,你需要在 CSS 文件(如 style.css)中定义 .thisclass 的样式:

/* 默认导航样式 */
#nav ul li {
    float: left;
    list-style: none;
    padding: 10px 15px;
}
#nav ul li a {
    color: #333;
    text-decoration: none;
}
/* 选中/当前栏目的高亮样式 */
#nav ul li.thisclass {
    background-color: #ff6600; /* 设置一个橙色背景 */
}
#nav ul li.thisclass a {
    color: #fff; /* 文字颜色变为白色 */
}

使用 typeid 变量判断

如果你想在非导航的地方判断当前栏目,比如在文章页面的侧边栏显示“相关文章”并高亮其所属栏目,可以使用 typeid 变量。

示例代码(在文章详情页 article_article.htm 中):

<div class="sidebar">
    <h3>栏目列表</h3>
    <ul>
        {dede:channel type='top'}
        <li>
            <a href="[field:typeurl/]">[field:typename/]</a>
            <!-- 判断当前循环的栏目ID是否等于文章所属的栏目ID -->
            [field:ID runphp='yes']
                if(@me == $typeid) {
                    @me = " <span class='active'>(当前)</span>";
                } else {
                    @me = "";
                }
            [/field:ID]
        </li>
        {/dede:channel}
    </ul>
</div>

代码解析:

  • $typeid:这是 DedeCMS 在文章详情页等页面中自动定义的一个全局变量,存储了当前页面内容所属的栏目 ID。
  • [field:ID runphp='yes']:获取当前循环到的栏目的 ID,并使用 PHP 进行判断。
  • if(@me == $typeid):如果当前栏目的 ID 等于文章所属的栏目 ID,就输出一个 <span> 标签表示“选中”状态。

在 PHP 代码中判断栏目是否被选中

如果你在开发自定义功能或修改核心文件时,需要在 PHP 代码中进行判断,方法也很直接。

核心原理:

DedeCMS 在加载每个页面时,都会将当前栏目的信息存入一个全局数组 $_arctype 中,同时当前栏目的 ID 也存入了全局变量 $typeid

示例代码(在 PHP 文件中):

假设你在一个自定义的 PHP 文件里,需要判断当前栏目是否为 ID 为 5 的“产品中心”。

<?php
// 引入 DedeCMS 的核心文件
// require_once(dirname(__FILE__)."/../include/common.inc.php");
// 1. 使用全局变量 $typeid (最常用)
if ($typeid == 5) {
    echo "当前页面属于【产品中心】栏目!";
    // 执行你的逻辑...
}
// 2. 使用全局数组 $_arctype (可以获取更多信息)
if (isset($_arctype) && is_array($_arctype)) {
    if ($_arctype['id'] == 5) {
        echo "当前页面属于【" . $_arctype['typename'] . "】栏目!";
        // 执行你的逻辑...
    }
}
// 3. 如果你想判断一个 *任意* 的栏目是否被选中(例如在表单中)
// 假设 $channel_id 是你想要判断的栏目ID
$channel_id = 10;
// 检查请求中是否有这个栏目的选中信息(比如来自复选框)
// 注意:这需要根据你的具体表单结构来写
if (isset($_POST['channel']) && is_array($_POST['channel']) && in_array($channel_id, $_POST['channel'])) {
    echo "ID 为 {$channel_id} 的栏目被选中了!";
}
?>

场景 实现方法 核心要点
后台选择 通过下拉表单选择 提交表单,文章的 typeid 字段被赋值。
前端高亮 channel 标签的 currentstyle 属性 自动为当前栏目添加 current 类,通过 CSS 控制样式。
PHP 判断 使用全局变量 $typeid 或数组 $_arctype 在 PHP 逻辑中获取当前页面的栏目信息并进行判断。

根据你的具体需求,选择最适合的方法即可,对于绝大多数前端模板开发的需求,使用 channel 标签的 currentstyle 是最简单、最规范的方式。

-- 展开阅读全文 --
头像
织梦CMS如何调用友情链接?
« 上一篇 01-08
dede sphinx 404
下一篇 » 01-08

相关文章

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