如今,DedecmsCMS作为一款强大的内容管理系统,其功能的扩展性和灵活性备受开发者青睐。今天我们将深入探讨如何在DedecmsCMS中实现联动筛选功能(支持单选和多选),并修复手机端无法加载_m.htm列表模板的问题。
首先需要明确的是,这个功能需要在模板中使用PHP标签,因此需要解除后台模板引擎对PHP标签的禁用。具体操作步骤如下:
登录后台 >> 系统 >> 系统基本参数 >> 其它选项 >> 模板引擎禁用标签:php
将“php”从禁用标签中删除后保存即可。如下图所示:

接下来,我们分为两个部分来实现联动筛选功能:单选和多选。
一、联动功能 单选
要实现单选功能,首先需要修改两个PHP文件:include目录下的arc.listview.class.php和extend.func.php。
1. 修改arc.listview.class.php文件。由于该文件改动较多,建议直接下载附件压缩包中的文件进行替换。如果之前对该文件有过修改,请先备份原文件,并根据“参照表”逐一手动替换。
2. 修改extend.func.php文件。在文件末尾添加以下代码:
// 字符过滤函数
function wwwcms_filter($str,$stype="inject") {
if ($stype=="inject") {
$str = str_replace(
array( "select", "insert", "update", "delete", "alter", "cas", "union", "into", "load_file", "outfile", "create", "join", "where", "like", "drop", "modify", "rename", "'", "/*", "*", "../", "./"),
array("","","","","","","","","","","","","","","","","","","","","",""),
$str);
} else if ($stype=="xss") {
$farr = array("/\\\\s+/" ,
"/<(\\\\/?)(script|META|STYLE|HTML|HEAD|BODY|STYLE |i?frame|b|strong|style|html|img|P|o:p|iframe|u |em|strike|BR|div|a|TABLE|TBODY|object|tr|td |st1:chsdate|FONT|span|MARQUEE|body|title |\\\\r\\\\n|link |meta|\\\\?|\\\\%)([^>]*?)>/isU",
"/(<[^>]*)on[a-zA-Z]+\\\\s*=([^>]*>)/isU",
);
$tarr = array(" ",
"",
"\\\\\\\\1\\\\\\\\2",
);
$str = preg_replace($farr, $tarr, $str);
$str = str_replace(
array( "<", ">", "'", "\\\\"", ";", "/*", "*", "../", "./"),
array("<",">","","","","","","",""),
$str);
}
return $str;
}
// 载入自定义表单(用于发布)
function AddFilter($channelid, $type=1, $fieldsnamef, $defaulttid, $loadtype='autofield')
{
// ... (完整代码见上文)
}
完成PHP文件的修改后,需要给指定模型添加字段。操作步骤如下:登录后台 >> 核心 >> 内容模型管理 >> (选择频道名称) >> 字段管理 >> 添加新字段。
注意:字段类型应选择“使用option下拉框”或“使用radio选项卡”,如下图所示:

最后,在列表页模板中调用筛选标签。代码如下:
{dede:php}AddFilter(1,1,'color,left,top');{/dede:php}
解释:第一个数字1表示内容模型的ID号;第二个数字1表示筛选样式(1为超链接选择,2为下拉框选择);第三个部分“color,left,top”为字段名,需用英文逗号隔开。
二、联动功能 多选
多选功能允许每个自定义字段值选择多个值(但网址长度不能超过255个字符)。打开arc.listview.class.php文件,在第117行和第809行找到以下代码:
$filtersql .= ($key!="tid" && $key!="TotalResult" && $key!="PageNo") ? " AND $addtable.".wwwcms_filter($key)." = ".wwwcms_filter(iconv("UTF-8", "gb2312", $value))."" : ";
将其修改为:
if($key=="goodstype" || $key=="goodscolor" ){
$count=0;
$nowsql ='';
$var=explode(",",wwwcms_filter(iconv("UTF-8", "gb2312", $value)));
if(!empty($var)){
foreach($var as $value){
if($count==0){
$filtersql.="and ($addtable.".wwwcms_filter($key)." like '%".$value."%'";
$count++;
}else{
$filtersql.="or $addtable.".wwwcms_filter($key)." like '%".$value."%'";
}
}
$filtersql.=")";
}
}else{
$filtersql .= ($key!="tid" && $key!="TotalResult" && $key!="PageNo") ? " AND $addtable.".wwwcms_filter($key)." = ".wwwcms_filter(iconv("UTF-8", "gb2312", $value))."" : '';
}
至此,DedecmsCMS的联动筛选功能(单选和多选)已全部实现。