1. 程式人生 > >(轉)織夢DedeCMS二次開發聯動篩選功能的實現(含多選功能)

(轉)織夢DedeCMS二次開發聯動篩選功能的實現(含多選功能)

原文:http://www.dedejs.com/html/article-571-1.html點選開啟連結

織夢預設的列表頁沒有篩選功能,但有時候我們做產品列表頁的時候,產品的欄位比較多,很多人都需要用到篩選功能,這樣可以讓使用者更方便的找到自己所需要的東西,實現這個聯動篩選功能需要對織夢進行二次開發,下面就告訴大家如何對織夢進行二次開發實現這個很多人都需要的篩選功能,如下圖所示:

DedeCMS二次開發聯動篩選功能的實現

首先需要說明的是這個功能需要在模板裡面用到php標籤,所以需要在後臺模板引擎禁用標籤裡面解除這個標籤的禁用,具體方法:

後臺——系統——系統基本引數——其它選項——模板引擎禁用標籤:php

將這個PHP去掉後儲存就可以了!

好了,下面開始正題了。

 一、聯動篩選單選功能

首先需要修改2個PHP檔案,都是include目錄下面的。

1、修改arc.listview.class.php檔案,這檔案改動比較大,建議大家直接下載附件壓縮包裡面的檔案替換,如果你之前對這個檔案改動過的話,請在下載下來的壓縮包裡的這個檔案裡面搜尋有“織夢技術研究中心”這些註釋的這些地方,都是修改過的,然自己手動將有註釋的程式碼插入到自己的檔案裡面!

2、修改extend.func.php檔案,在其最後面新增如下程式碼:


//dedecms聯動篩選功能 By 織夢技術研究中心 技術支援群:217479292 字元過濾函式
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;
 }

/**
  *  載入自定義表單(用於釋出)
  *
  * @access    public
  * @param     string  $fieldset  欄位列表
 * @param     string  $loadtype  載入型別
 * @return    string
  */
 
 function AddFilter($channelid, $type=1, $fieldsnamef, $defaulttid, $loadtype='autofield')
 {
  global $tid,$dsql,$id;
  $tid = $defaulttid ? $defaulttid : $tid;
  if ($id!="")
  {
   $tidsq = $dsql->GetOne(" Select typeid From `#【分隔符】@__archives` where id='$id' ");
   $tid = $tidsq["typeid"];
  }
  $nofilter = (isset($_REQUEST['TotalResult']) ? "&TotalResult=".$_REQUEST['TotalResult'] : '').(isset($_REQUEST['PageNo']) ? "&PageNo=".$_REQUEST['PageNo'] : '');
  $filterarr = wwwcms_filter(stripos($_SERVER['REQUEST_URI'], "list.php?tid=") ? str_replace($nofilter, '', $_SERVER['REQUEST_URI']) : $GLOBALS['cfg_cmsurl']."/plus/list.php?tid=".$tid);
     $cInfos = $dsql->GetOne(" Select * From  `#【分隔符】@__channeltype` where id='$channelid' ");
  $fieldset=$cInfos['fieldset'];
  $dtp = new DedeTagParse();
     $dtp->SetNameSpace('field','<','>');
     $dtp->LoadSource($fieldset);
     $dede_addonfields = '';
     if(is_array($dtp->CTags))
     {
         foreach($dtp->CTags as $tid=>$ctag)
         {
             $fieldsname = $fieldsnamef ? explode(",", $fieldsnamef) : explode(",", $ctag->GetName());
    if(($loadtype!='autofield' || ($loadtype=='autofield' && $ctag->GetAtt('autofield')==1)) && in_array($ctag->GetName(), $fieldsname) )
             {
                 $href1 = explode($ctag->GetName().'=', $filterarr);
     $href2 = explode('&', $href1[1]);
     $fields_value = $href2[0];
     $dede_addonfields .= '<div class="scv-shaixuan"><b>'.$ctag->GetAtt('itemname').':</b>';
     switch ($type) {
      case 1:
       $dede_addonfields .= (preg_match("/&".$ctag->GetName()."=/is",$filterarr,$regm) ? '<a title="全部" href="'.str_replace("&".$ctag->GetName()."=".$fields_value,"",$filterarr).'">全部</a>' : '<span>全部</span>').' ';
     
       $addonfields_items = explode(",",$ctag->GetAtt('default'));
       for ($i=0; $i<count($addonfields_items); $i++)
       {
        $href = stripos($filterarr,$ctag->GetName().'=') ? str_replace("=".$fields_value,"=".urlencode($addonfields_items[$i]),$filterarr) : $filterarr.'&'.$ctag->GetName().'='.urlencode($addonfields_items[$i]);//echo $href;
        $dede_addonfields .= ($fields_value!=urlencode($addonfields_items[$i]) ? '<a title="'.$addonfields_items[$i].'" href="'.$href.'">'.$addonfields_items[$i].'</a>' : '<span>'.$addonfields_items[$i].'</span>')." ";
       }
       $dede_addonfields .= '</div>';
      break;
     
      case 2:
       $dede_addonfields .= '<select name="filter"'.$ctag->GetName().' onchange="window.location=this.options[this.selectedIndex].value">
        '.'<option value="'.str_replace("&".$ctag->GetName()."=".$fields_value,"",$filterarr).'">全部</option>';
       $addonfields_items = explode(",",$ctag->GetAtt('default'));
       for ($i=0; $i<count($addonfields_items); $i++)
       {
        $href = stripos($filterarr,$ctag->GetName().'=') ? str_replace("=".$fields_value,"=".urlencode($addonfields_items[$i]),$filterarr) : $filterarr.'&'.$ctag->GetName().'='.urlencode($addonfields_items[$i]);
        $dede_addonfields .= '<option value="'.$href.'"'.($fields_value==urlencode($addonfields_items[$i]) ? ' selected="selected"' : '').'>'.$addonfields_items[$i].'</option>
        ';
       }
       $dede_addonfields .= '</select><br/>
       ';
      break;
     }
             }
         }
     }
  echo $dede_addonfields;
 }

特別注意:程式碼複製後需要自己手動去掉上面程式碼中的兩處【分隔符】。

下面提供前面提到過的已經修改好的檔案下載,注意這個是對預設沒有修改過的檔案進行修改的,如果你已經對這兩個檔案進行過修改,那就請看這兩個檔案的註釋部分相應的進行修改,下載地址:

好,到這裡PHP檔案修改的部分就完成了!接下來就需要給指定的模型新增欄位了,這裡需要注意的就是 欄位型別的選擇,欄位型別需要選擇單選按鈕或者使用select下拉框,如下圖所示:

DedeCMS二次開發聯動篩選功能的實現


下面就是列表頁模板篩選標籤的呼叫了,篩選標籤的呼叫很簡單,一句程式碼就可以搞定,標籤程式碼如下:

1{dede:php}AddFilter(4,1,'linestyle,linethem,youdays,jgqujian'
);{/dede:php}

標籤解釋:

AddFilter函式裡面的第一個數字4是內容模型的id號,各個內容模型的id請到後臺內容模型管理裡面檢視;

第二個數字1是表示篩選的樣式,1是使用超連結進行選擇,2是使用select下拉框選擇,具體可以自己設定了檢視效果;

第三個部分'linestyle,linethem,youdays,jgqujian'是要新增篩選功能的欄位名,這裡有4個欄位,注意需要用半形逗號隔開。

到這裡聯動篩選單選的功能就弄完了,如果只需要單選功能的朋友可以直接用了,但是如果需要多選功能的朋友請繼續往下面看。

 二、聯動篩選多選功能

搜尋情況類似下圖:每個自定義欄位值能選擇N個值(url不能超過255個字元)

織夢DedeCMS二次開發聯動篩選功能的實現(含多選功能)

然後開啟之前修改過的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" ){//你自定義欄位的欄位名(英文的那個name)
		$count=0;
		$nowsql ='';
		$var=explode(",",wwwcms_filter(iconv("UTF-8", "gb2312", $value)));//iconv是轉碼的意思,如果你url傳進來的引數是中文,就需要轉碼
 
		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))."" : '';//跟上面一樣,如果傳遞的值是中文,那麼就需要轉碼
}

然後在前臺呼叫的時候,比如引數是http://xxx.com/plus/list.php?tid=4&goodstype=型別1,型別2&goodscolor=灰色,紅色,藍色

記住,一定要以英文半形逗號隔開,如果你編碼是gbk的,傳值的時候如果url顯示的是中文,就可以直接使用上面的程式碼,否則的話在轉碼那可能要稍微修改下。

到這裡聯動篩選的多選功能的開發也就全部做完了,如果大家有什麼問題可以加dedecms_faq線上交流問答群217479292交流,群內有接近兩千名織夢站長相互交流討論。



注意,要拿程式碼覆蓋掉extend.func.php裡對應的原方法,下載的

arc.listview.class.php檔案  格式是GBK 如果你的dede是UTF-8的話 需要轉換一下格式再替換


在首頁呼叫該標籤時,需要在後面加上欄目ID