dedecms织梦联动筛选

99ANYc3cd6
预计阅读时长 22 分钟
位置: 首页 织梦建站 正文

联动筛选是织梦一个非常强大且实用的功能,它允许你在网站前台根据分类、地区、品牌、属性等多个维度进行动态筛选和组合查询,极大地提升了用户体验和网站的交互性,一个房产网站可以按“城市 -> 区域 -> 小区”进行筛选,一个商城可以按“品牌 -> 价格区间 -> 尺寸”进行筛选。

dedecms织梦联动筛选
(图片来源网络,侵删)

这个功能的核心在于“联动类别”的管理和使用。


联动筛选的原理

联动筛选的原理主要分为三步:

  1. 创建数据结构:在后台创建“联动类别”,定义好筛选的层级和选项,创建一个“产品规格”的联动类别,第一级是“颜色”,第二级是“尺寸”。
  2. 在前台表单中调用:在前台模板文件中,使用织梦的标签 {dede:linkage} 将这些联动类别以表单(通常是下拉菜单)的形式展示出来。
  3. 接收筛选条件并查询:用户选择筛选条件并提交后,PHP 脚本接收这些值,并将其构造成 SQL 查询语句的 WHERE 条件,从而筛选出符合要求的内容。

后台设置:创建联动类别

这是整个功能的基础,我们以一个“产品筛选”为例,假设筛选条件为“品牌”和“系列”。

步骤 1:进入联动类别管理

登录织梦后台,找到菜单栏的 【核心】 -> 【联动类别】,点击进入。

dedecms织梦联动筛选
(图片来源网络,侵删)

步骤 2:添加新的联动类别

  1. 点击 【增加顶级分类】
  2. 在弹出的表单中填写信息:
    • 分类名称:填写一个易于识别的名称,产品筛选
    • 分类表名:系统会自动生成一个表名,如 dede_addonlinkage这个名称很重要,在模板调用时会用到,通常不需要修改。
    • 是否开启:选择“是”。
    • 是否显示:选择“是”。
    • 是否支持手动分类:根据需要选择,如果允许用户在前台添加新的筛选选项(如新品牌),则选“是”。
    • 其他选项:保持默认即可。
  3. 点击 【确定】,顶级分类创建成功。

步骤 3:添加子分类(筛选层级)

我们为“产品筛选”这个顶级分类添加具体的筛选项。

  1. 在左侧列表中,点击你刚刚创建的顶级分类 产品筛选
  2. 点击 【增加子分类】
  3. 添加第一级筛选:品牌
    • 分类名称品牌
    • 分类关键字brand (可选,方便识别)
    • 上级分类:自动关联为 产品筛选
    • 是否开启
    • 点击 【确定】
  4. 为“品牌”添加选项
    • 在左侧选中 品牌 这个分类。
    • 点击 【增加选项】
    • 在输入框中输入一个品牌名,苹果,点击 【增加】
    • 继续添加 三星华为小米 等其他品牌。
  5. 添加第二级筛选:系列
    • 回到左侧,选中顶级分类 产品筛选
    • 再次点击 【增加子分类】
    • 分类名称系列
    • 分类关键字series
    • 上级分类产品筛选
    • 是否开启
    • 点击 【确定】
  6. 为“系列”添加选项
    • 在左侧选中 系列 这个分类。
    • 点击 【增加选项】,添加 iPhoneGalaxyMateRedmi 等系列。

最终效果:你的联动类别结构应该像这样:

  • 产品筛选 (顶级)
    • 品牌 (子分类)
      • 苹果 (选项)
      • 三星 (选项)
    • 系列 (子分类)
      • iPhone (选项)
      • Galaxy (选项)

至此,后台的数据结构已经创建完成。


前台调用:在模板中使用

后台设置好后,我们需要在前台模板文件中调用这些联动菜单。

dedecms织梦联动筛选
(图片来源网络,侵删)

假设你的列表页模板是 list_article.htm页模板是 article_article.htm

步骤 1:在列表页添加筛选表单

list_article.htm 中,你希望显示筛选表单的位置,添加以下代码:

<form name="searchform" action="{dede:global.cfg_cmspath/}/plus/list.php" method="get">
    <!-- 调用品牌筛选 -->
    <div>
        <label>品牌:</label>
        {dede:linkage 
            type='产品筛选/brand' 
            noself='no' 
            eajax='1' 
            }
        </select>
    </div>
    <!-- 调用系列筛选 -->
    <div>
        <label>系列:</label>
        {dede:linkage 
            type='产品筛选/series' 
            noself='no' 
            eajax='1' 
            }
        </select>
    </div>
    <input type="hidden" name="tid" value="{dede:field.id/}" />
    <button type="submit">筛选</button>
</form>

代码解释

  • {dede:linkage}:这是调用联动菜单的核心标签。
  • type='产品筛选/brand'最关键的参数,格式为 顶级分类名/子分类名,告诉织梦要调用哪个联动分类。
  • noself='no':是否包含“请选择”等提示项。no 表示不包含,yes 表示包含。
  • eajax='1':开启 Ajax 动态加载,选择“品牌”后,“系列”的下拉选项可以动态变化(需要编写额外的 JS 逻辑,这里先不展开)。
  • name='brand':给下拉菜单指定的 name 属性。这个 name 值必须和后台子分类的关键字一致,这样 PHP 才能正确接收筛选值。
  • <form action=".../plus/list.php">:织梦列表页的标准提交地址。
  • <input type="hidden" name="tid" ...>:保持当前栏目的 ID,确保筛选是在当前栏目下进行。

步骤 2:修改列表页 PHP 文件以处理筛选

模板只是生成了表单,真正的数据筛选逻辑在 PHP 文件中,织梦默认的列表页处理文件是 /plus/list.php强烈建议不要直接修改它,因为升级会被覆盖,正确的做法是复制一份并重命名

  1. 复制 /plus/list.php 文件,在同一目录下重命名为 my_list.php
  2. 修改 list_article.htm 中的表单 action 地址:
    <form name="searchform" action="{dede:global.cfg_cmspath/}/plus/my_list.php" method="get">
  3. 打开 my_list.php 文件,找到 if($typeid != 0) 这段代码(通常在文件中下部),在 if 语句内部、$channelid = GetChannelid($typeid); 这行代码之后,添加以下代码:
// -----------------------------------
// 开始处理联动筛选
// -----------------------------------
$linkage_sql = "";
if (!empty($_GET['brand'])) {
    $brand = $_GET['brand'];
    $linkage_sql .= " AND ( CONCAT(a.keywords, '|', a.templet) LIKE '%{$brand}|%' OR a.keywords LIKE '%{$brand}%' )";
}
if (!empty($_GET['series'])) {
    $series = $_GET['series'];
    $linkage_sql .= " AND ( CONCAT(a.keywords, '|', a.templet) LIKE '%{$series}|%' OR a.keywords LIKE '%{$series}%' )";
}
// 将筛选条件拼接到主查询的 WHERE 子句中
// 找到类似 $ctag->GetAtt('sql'); 的地方,将其结果与 $linkage_sql 拼接
// 这是一个简化的示例,实际代码位置可能需要微调
// 更稳妥的方法是修改 $addsql 变量
if ($linkage_sql) {
    // $addsql 已经存在,用 AND 连接
    if ($addsql) {
        $addsql .= $linkage_sql;
    } else {
        $addsql = " WHERE 1=1 " . $linkage_sql;
    }
}
// -----------------------------------
// 联动筛选处理结束
// -----------------------------------

代码解释

  • 我们通过 $_GET['brand']$_GET['series'] 获取前台表单提交的值。
  • 重要:织梦默认将联动选项的值存储在文章的 keywords 字段中,多个值用 分隔,所以我们的查询逻辑是 LIKE '%品牌名|%'
  • $linkage_sql 构造了附加的 SQL WHERE 条件。
  • 我们将 $linkage_sql 拼接到织梦主查询的 $addsql 变量中,从而影响最终的查询结果。

进阶与注意事项

数据存储方式(推荐)

直接存在 keywords 里虽然简单,但不够规范,查询效率也低,更推荐的方式是使用自定义模型附加表

  1. 创建自定义模型:在后台【核心】->【内容模型管理】中创建一个“产品”模型。
  2. 添加字段:在模型中添加“品牌”和“系列”两个字段,字段类型选择“联动类型”,并关联到你之前创建的联动类别。
  3. 时,就可以直接选择品牌和系列了。
  4. 修改查询逻辑my_list.php 中的查询逻辑就要变了,不再是查 keywords,而是查附加表里的对应字段。
// 假设附加表是 dede_addonproduct,字段是 brand 和 series
if (!empty($_GET['brand'])) {
    $brand = $_GET['brand'];
    $linkage_sql .= " AND a.brand = '{$brand}'"; // 直接等于,效率更高
}
if (!empty($_GET['series'])) {
    $series = $_GET['series'];
    $linkage_sql .= " AND a.series = '{$series}'";
}

这种方式更标准、更高效,是大型站点的首选。

Ajax 联动

要实现“选择品牌后,动态加载该品牌下的系列”,你需要使用 jQuery 和织梦的 eajax 机制。

  • 修改联动标签:给品牌的下拉菜单添加一个 id,并设置 eajax
  • 编写 JS:监听品牌下拉菜单的 change 事件,获取选中的值,然后通过 Ajax 请求一个专门处理联动加载的 PHP 文件(如 /plus/linkage.php),并将返回的 HTML 填充到系列的下拉菜单中。

这部分相对复杂,需要一定的 JS 基础,但网上有很多现成的教程和代码可以参考。

URL 美化

默认的筛选 URL 可能是 .../my_list.php?tid=1&brand=苹果&series=iPhone,你可以通过织梦的 【栏目】->【栏目管理】->【修改】->【列表选项】 中的“列表命名规则”来美化 URL,例如设置为 {tid}_{brand}_{series}/,使其变为 .../1_苹果_iPhone/ 的形式。

步骤 操作 关键点
后台 创建联动类别 定义好顶级分类和子分类(筛选维度),并添加好选项(筛选值)。
模板 调用联动菜单 使用 {dede:linkage} 标签,type 参数指定分类,name 参数指定接收值的变量名。
PHP 处理筛选逻辑 复制 list.phpmy_list.php,在其中获取 $_GET 值,并构造 SQL WHERE 条件,拼接到主查询中。
进阶 优化数据存储 推荐使用自定义模型和附加表来存储筛选值,查询更高效、更规范。

联动筛选功能是织梦的精髓之一,虽然初次设置略显繁琐,但一旦配置好,就能非常灵活地实现各种复杂的筛选需求,希望这份详细的教程能帮助到你!

-- 展开阅读全文 --
头像
dede阿里云虚拟机安装403
« 上一篇 01-02
install无法安装织梦
下一篇 » 01-02

相关文章

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

目录[+]