如今,DedecmsCMS作为一款强大的内容管理系统,其功能的扩展性和灵活性备受开发者青睐。今天我们将深入探讨如何在DedecmsCMS中实现联动筛选功能(支持单选和多选),并修复手机端无法加载_m.htm列表模板的问题。


首先需要明确的是,这个功能需要在模板中使用PHP标签,因此需要解除后台模板引擎对PHP标签的禁用。具体操作步骤如下:


登录后台 >> 系统 >> 系统基本参数 >> 其它选项 >> 模板引擎禁用标签:php


将“php”从禁用标签中删除后保存即可。如下图所示:


dedecmsCMS全网最新联动筛选功能的实现(单选和多选)可显示分类的文章数量

接下来,我们分为两个部分来实现联动筛选功能:单选和多选。


一、联动功能 单选


要实现单选功能,首先需要修改两个PHP文件:include目录下的arc.listview.class.phpextend.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("&lt;","&gt;","","","","","","",""),
       $str);
  }
  return $str;
 }

// 载入自定义表单(用于发布)
function AddFilter($channelid, $type=1, $fieldsnamef, $defaulttid, $loadtype='autofield')
{
 // ... (完整代码见上文)
}

完成PHP文件的修改后,需要给指定模型添加字段。操作步骤如下:登录后台 >> 核心 >> 内容模型管理 >> (选择频道名称) >> 字段管理 >> 添加新字段。


注意:字段类型应选择“使用option下拉框”或“使用radio选项卡”,如下图所示:


dedecmsCMS全网最新联动筛选功能的实现(单选和多选)可显示分类的文章数量

最后,在列表页模板中调用筛选标签。代码如下:


{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的联动筛选功能(单选和多选)已全部实现。