1. <thead id="8qdxw"></thead>

      返回舊版| 微信建站| 我要建站 | 建站學習 | 加入收藏
      PHPCMS當前位置:首頁 > cms教程 > 綜合cms > PHPCMS > 正文

      phpcms篩選功能(經典無錯)---匯總網上各種版本!

      發布時間:2016-07-03 22:00:36   來源:   點擊:
      phpcms的篩選功能,網上有各種版本,但是多多少少都會有點問題,不是很完美,下面我總結網上各種版本,加上自己的研究,得出一個算是比較全的一個資料,既可以分頁,也可以分欄目!

      第一步:后臺添加字段

      添加字段:
      后臺-->內容-->內容相關設置-->模型管理-->文章模型-->字段管理-->添加字段-->如下圖示例:



      第二步:增加擴展函數:

      將以下代碼添加到 phpcms/libs/functions/extention.func.php 文件
      為了防止錯誤,也可以點此下載
      http://www.qwllz.com/uploadfile/2016/0703/20160703094036307.rar

      1. /** 
      2.  *  extention.func.php 用戶自定義函數庫 
      3.  * 
      4.  * @copyright                        (C) 2005-2010 PHPCMS 
      5.  * @license                           http://www.phpcms.cn/license/ 
      6.  * @lastmodify                        2010-10-27 
      7.  */ 
      8.  
      9. /********************實現篩選功能************************/ 
      10.  /** 
      11.  * 通過指定keyid形式顯示所有聯動菜單 
      12.  * @param  $keyid 菜單主id 
      13.  * @param  $linkageid  聯動菜單id,0調用頂級 
      14.  * @param  $modelid 模型id 
      15.  * @param  $fieldname  字段名稱 
      16.  */ 
      17. function show_linkage($keyid, $linkageid = 0, $modelid = '', $fieldname='zone') { 
      18.     $datas = $infos = $array = array(); 
      19.     $keyid = intval($keyid); 
      20.     $linkageid = intval($linkageid); 
      21.     //當前菜單id 
      22.     $field_value = intval($_GET[$fieldname]); 
      23.     $urlrule = structure_filters_url($fieldname,$array,1,$modelid); 
      24.     if($keyid == 0) return false
      25.     $datas = getcache($keyid,'linkage'); 
      26.     $infos = $datas['data']; 
      27.  
      28.     foreach($infos as $k=>$v){ 
      29.         if($v['parentid']==$field_value){ 
      30.             $array[$k]['name'] = $v['name']; 
      31.             $array[$k]['value'] = $k; 
      32.             $array[$k]['url'] = str_replace('{$'.$fieldname.'}',$k,$urlrule); 
      33.             $array[$k]['menu'] = $field_value == $k ? ''.$v['name'].'' : '.$array[$k]['url'].'>'.$v['name'].'' ; 
      34.             } 
      35.             } 
      36.             return $array; 
      37.             } 
      38. function structure_filters_url($fieldname,$array=array(),$type = 1,$modelid) { 
      39.     if(empty($array)) { 
      40.         $array = $_GET; 
      41.         } else { 
      42.             $array = array_merge($_GET,$array); 
      43.             } 
      44.         //TODO 
      45.         $fields = getcache('model_field_'.$modelid,'model'); 
      46.         if(is_array($fields) && !empty($fields)) { 
      47.             ksort($fields); 
      48.             foreach ($fields as $_v=>$_k) { 
      49.                 if($_k['filtertype'] || $_k['rangetype']) { 
      50.                     if(strpos(URLRULE,'.html') === FALSE) $urlpars .= '&'.$_v.'={$'.$_v.'}'
      51.                     else $urlpars .= '-{$'.$_v.'}'
      52.                     } 
      53.                     } 
      54.                     } 
      55.         //后期增加偽靜態等其他url規則管理,apache偽靜態支持9個參數 
      56.         if(strpos(URLRULE,'.html') === FALSE) $urlrule =APP_PATH.'index.php?m=content&c=index&a=lists&catid={$catid}'.$urlpars.'&page={$page}' ; 
      57.         else $urlrule =APP_PATH.'list-{$catid}'.$urlpars.'-{$page}.html'
      58.         //根據get傳值構造URL 
      59.         if (is_array($array)) foreach ($array as $_k=>$_v) { 
      60.             if($_k=='page') $_v=1; 
      61.             if($type == 1) if($_k==$fieldname) continue
      62.             $_findme[] = '/{\$'.$_k.'}/'
      63.             $_replaceme[] = $_v; 
      64.             } 
      65.      //type 模式的時候,構造排除該字段名稱的正則 
      66.         if($type==1) $filter = '(?!'.$fieldname.'.)'
      67.         $_findme[] = '/{\$'.$filter.'([a-z0-9_]+)}/'
      68.         $_replaceme[] = ''
      69.         $urlrule = preg_replace($_findme, $_replaceme, $urlrule); 
      70.         return         $urlrule; 
      71.         } 
      72. /** 
      73.  * 生成分類信息中的篩選菜單 
      74.  * @param $field   字段名稱 
      75.  * @param $modelid  模型ID 
      76.  */ 
      77. function filters($field,$modelid,$diyarr = array()) { 
      78.     $fields = getcache('model_field_'.$modelid,'model'); 
      79.     $options = empty($diyarr) ?  explode("\n",$fields[$field]['options']) : $diyarr; 
      80.     $field_value = intval($_GET[$field]); 
      81.     foreach($options as $_k) { 
      82.         $v = explode("|",$_k); 
      83.         $k = trim($v[1]); 
      84.         $option[$k]['name'] = $v[0]; 
      85.         $option[$k]['value'] = $k; 
      86.         $option[$k]['url'] = structure_filters_url($field,array($field=>$k),2,$modelid); 
      87.         $option[$k]['menu'] = $field_value == $k ? ''.$v[0].'' : '.$option[$k]['url'].'>'.$v[0].'' ; 
      88.     } 
      89.     $all['name'] = '全部'
      90.     $all['url'] = structure_filters_url($field,array($field=>''),2,$modelid); 
      91.     $all['menu'] = $field_value == '' ? ''.$all['name'].'' : '.$all['url'].'>'.$all['name'].''
      92.  
      93.     array_unshift($option,$all); 
      94.     return $option; 
      95.  
      96. /** 
      97.  * 獲取聯動菜單層級 
      98.  * @param  $keyid     聯動菜單分類id 
      99.  * @param  $linkageid 菜單id 
      100.  * @param  $leveltype 獲取類型 parentid 獲取父級id child 獲取時候有子欄目 arrchildid 獲取子欄目數組 
      101.  */ 
      102. function get_linkage_level($keyid,$linkageid,$leveltype = 'parentid') { 
      103.     $child_arr = $childs = array(); 
      104.     $leveltypes = array('parentid','child','arrchildid','arrchildinfo'); 
      105.     $datas = getcache($keyid,'linkage'); 
      106.     $infos = $datas['data']; 
      107.     if (in_array($leveltype, $leveltypes)) { 
      108.         if($leveltype == 'arrchildinfo') { 
      109.             $child_arr = explode(',',$infos[$linkageid]['arrchildid']); 
      110.             foreach ($child_arr as $r) { 
      111.                 $childs[] = $infos[$r]; 
      112.             } 
      113.             return $childs; 
      114.         } else { 
      115.             return $infos[$linkageid][$leveltype]; 
      116.         } 
      117.     }     
      118.  
      119. // 根據linkageid遞歸到父級 
      120. function get_parent_url($modelid,$field,$linkageid=0,$array = array()){ 
      121.     $modelid = intval($modelid); 
      122.     if(!$modelid || empty($field)) return false
      123.     $fields = getcache('model_field_'.$modelid,'model'); 
      124.     $keyid = $fields[$field]['linkageid']; 
      125.     $datas = getcache($keyid,'linkage'); 
      126.     $infos = $datas['data']; 
      127.                  
      128.     if(empty($linkageid)){ 
      129.         $linkageid = intval($_GET[$field]); 
      130.         if(!$linkageid) return false
      131.         } 
      132.          
      133.         $urlrule = structure_filters_url($field,array(),1,$modelid); 
      134.         $urlrule = str_replace('{$'.$field.'}',$infos[$linkageid]['parentid'],$urlrule); 
      135.         array_unshift($array,array('name'=> $infos[$linkageid]['name'],'url'=>$urlrule)); 
      136.         if($infos[$linkageid]['parentid']){ 
      137.             return get_parent_url($modelid,$field,$infos[$linkageid]['parentid'],$array); 
      138.             } 
      139.             return $array; 
      140.             } 
      141. /** 
      142.  * 構造篩選時候的sql語句 
      143.  */ 
      144. function structure_filters_sql($modelid) { 
      145.     $sql = $fieldname = $min = $max = ''
      146.     $fieldvalue = array(); 
      147.     $modelid = intval($modelid); 
      148.     $model =  getcache('model','commons'); 
      149.     $fields = getcache('model_field_'.$modelid,'model'); 
      150.     $fields_key = array_keys($fields); 
      151.     //TODO 
      152.     $sql = '`status` = \'99\''
      153.  
      154.          
      155.     foreach ($_GET as $k=>$r) { 
      156.         if(in_array($k,$fields_key) && intval($r)!=0 && ($fields[$k]['filtertype'] || $fields[$k]['rangetype']|| $fields[$k]['boxtype'])) { 
      157.             if($fields[$k]['formtype'] == 'linkage') { 
      158.                 $datas = getcache($fields[$k]['linkageid'],'linkage'); 
      159.                 $infos = $datas['data']; 
      160.                 if($infos[$r]['arrchildid']) { 
      161.                     $sql .=  ' AND `'.$k.'` in('.$infos[$r]['arrchildid'].')'
      162.                 } 
      163.             } elseif($fields[$k]['rangetype']) { 
      164.                         if(is_numeric($r)) { 
      165.                             $sql .=" AND `$k` = '$r'"
      166.                         } else { 
      167.                                 $fieldvalue = explode('_',$r); 
      168.                                 $min = intval($fieldvalue[0]); 
      169.                                 $max = $fieldvalue[1] ? intval($fieldvalue[1]) : 999999; 
      170.                                 $sql .=" AND `$k` >= '$min' AND  `$k` < '$max'"
      171.                         } 
      172.             }elseif($fields[$k]['boxtype']=='checkbox') { 
      173.                    $sql .=" AND `$k` like '%,$r,%'"
      174.  
      175.             } else { 
      176.                    $sql .=" AND `$k` = '$r'"
      177.             } 
      178.         } 
      179.     } 
      180.    // echo $sql; 
      181.    return $sql; 
      182.  
      183. /** 
      184.  * 分頁,如去掉則分頁會有問題 
      185.  */ 
      186. function makeurlrule() { 
      187.     if(strpos(URLRULE,'.html') === FALSE) { 
      188.         return url_par('page={$'.'page}'); 
      189.     } 
      190.     else { 
      191.         $url = preg_replace('/-[0-9]+.html$/','-{$page}.html',get_url()); 
      192.         return $url; 
      193.     } 
      194.  
      195.  
      196. /********************實現前臺輸出“選項名稱”功能************************/ 
      197. /** 
      198. * 根據box類型字段獲取顯示名稱 
      199. * @param $field 字段名稱 
      200. * @param $value 字段值 
      201. * @param $modelid 字段所在模型id 
      202. */ 
      203. function box($field, $value, $modelid='') { 
      204.         $fields = getcache('model_field_'.$modelid,'model'); 
      205.         extract(string2array($fields[$field]['setting'])); 
      206.         $options = explode("\n",$fields[$field]['options']); 
      207.         foreach($options as $_k) { 
      208.                 $v = explode("|",$_k); 
      209.                 $k = trim($v[1]); 
      210.                 $option[$k] = $v[0]; 
      211.         } 
      212.         $string = ''
      213.         switch($fields[$field]['boxtype']) { 
      214.                         case 'radio'
      215.                                 $string = $option[$value]; 
      216.                         break
      217.                         case 'checkbox'
      218.                                 $value_arr = explode(',',$value); 
      219.                                 foreach($value_arr as $_v) { 
      220.                                         if($_v) $string .= $option[$_v].' 、'
      221.                                 } 
      222.                         break
      223.  
      224.                         case 'select'
      225.                                 $string = $option[$value]; 
      226.                         break
      227.  
      228.                         case 'multiple'
      229.                                 $value_arr = explode(',',$value); 
      230.                                 foreach($value_arr as $_v) { 
      231.                                         if($_v) $string .= $option[$_v].' 、'
      232.                                 } 
      233.                         break
      234.                 } 
      235.                         return $string; 
      236. ?> 
      (注:makeurlrule函數對分頁是否能傳遞相關參數很重要!

      第三步:前臺模板調用

      1. {php $sql = structure_filters_sql($modelid);}  
      2. {php $urlrule = makeurlrule()} 
      3. {pc:content action="lists" catid="$catid" where="$sql"  modelid="$modelid" num="10" page="$page" moreinfo="1"  urlrule="$urlrule" return="data" } 
      4. {loop $data $r} 
      5. ........
      6. {/loop} 
      7. {/pc} 


      一般網上都是到這一步就沒有了,沒有了......
      但是你會發現,還有很多問題,下面就來解決


      第一個問題:list條件下加入where后其他條件失效的問題


      之前的一篇文章:解決lists標簽中,加上where后其他條件失效的問題,其他條件失效了,如catid,thumb等等,也就是無法獲取當前欄目的信息,而是把整個欄目下的所有文章都調用出來了!
      打開/phpcms/modules/content/classes/目錄下的content_tag.class.php這個文件,把下面的代碼(大概第63行)
      1. if(isset($data['where'])) {   
      2. $sql = $data['where'];   
      3. else {   
      4. $thumb = intval($data['thumb']) ? " AND thumb != ''" : '';   
      5. if($this->category[$catid]['child']) {   
      6. $catids_str = $this->category[$catid]['arrchildid'];   
      7. $pos = strpos($catids_str,',')+1;   
      8. $catids_str = substr($catids_str, $pos);   
      9. $sql = "status=99 AND catid IN ($catids_str)".$thumb;   
      10. else {   
      11. $sql = "status=99 AND catid='$catid'".$thumb;   
      12. }   
      13. }   
      替換為下面的代碼即可。
      1. if(isset($data['where'])) {   
      2. $where = (isset($data['where'])&&(!empty($data['where'])))?' AND '.$data['where']:'';   
      3. $thumb = intval($data['thumb']) ? " AND thumb != ''" : '';   
      4. if($this->category[$catid]['child']) {   
      5. $catids_str = $this->category[$catid]['arrchildid'];   
      6. $pos = strpos($catids_str,',')+1;   
      7. $catids_str = substr($catids_str, $pos);   
      8. $sql = "status=99".$where." AND catid IN ($catids_str)".$thumb;   
      9. else {   
      10. $sql = "status=99".$where." AND catid='$catid'".$thumb;   
      11. }   
      12. else {   
      13. $thumb = intval($data['thumb']) ? " AND thumb != ''" : '';   
      14. if($this->category[$catid]['child']) {   
      15. $catids_str = $this->category[$catid]['arrchildid'];   
      16. $pos = strpos($catids_str,',')+1;   
      17. $catids_str = substr($catids_str, $pos);   
      18. $sql = "status=99 AND catid IN ($catids_str)".$thumb;   
      19. else {   
      20. $sql = "status=99 AND catid='$catid'".$thumb;   
      21. }   
      22. }   

      其實主要的修改思路是$where參數中并不包含當前欄目的id值,所以在$sql增加獲取相關id的參數


      第二個問題:分頁數量不對

      通過研究緩存得知,調用分頁總數的函數是:
      1. $content_total = $content_tag->count(array('catid'=>$catid,'where'=>$sql,'modelid'=>$modelid,'moreinfo'=>'1','limit'=>$offset.",".$pagesize,'action'=>'lists',)); 
      通過這個,找到phpcms\modules\content\classes\content_tag.class.php大致36-56行,count函數如下:

      1. public function count($data) { 
      2.         if($data['action'] == 'lists') { 
      3.             $catid = intval($data['catid']); 
      4.             if(!$this->set_modelid($catid)) return false
      5.             if(isset($data['where'])) { 
      6.                 $sql = $data['where']; 
      7.             } else { 
      8.                 if($this->category[$catid]['child']) { 
      9.                     $catids_str = $this->category[$catid]['arrchildid']; 
      10.                     $pos = strpos($catids_str,',')+1; 
      11.                     $catids_str = substr($catids_str, $pos); 
      12.                     $sql = "status=99 AND catid IN ($catids_str)"
      13.                 } else { 
      14.                     $sql = "status=99 AND catid='$catid'"
      15.                 } 
      16.             } 
      17.             return $this->db->count($sql); 
      18.         } 
      19.     } 

      改為:
      1. public function count($data) { 
      2.         if($data['action'] == 'lists') { 
      3.             $catid = intval($data['catid']); 
      4.             $catids_str = $this->category[$catid]['arrchildid']; 
      5.             if(!$this->set_modelid($catid)) return false
      6.             if(isset($data['where'])) { 
      7.                  $sql = $data['where']; 
      8.                 if($this->category[$catid]['child']) {   
      9.                 $catids_str = $this->category[$catid]['arrchildid'];   
      10.                 $pos = strpos($catids_str,',')+1;   
      11.                 $catids_str = substr($catids_str, $pos);   
      12.                 $sql = $sql." AND catid IN ($catids_str)"
      13.                 } else {   
      14.                 $sql = $sql." AND catid='$catid'"
      15.                 }   
      16.             } else { 
      17.                 if($this->category[$catid]['child']) { 
      18.                     $catids_str = $this->category[$catid]['arrchildid']; 
      19.                     $pos = strpos($catids_str,',')+1; 
      20.                     $catids_str = substr($catids_str, $pos); 
      21.                     $sql = "status=99 AND catid IN ($catids_str)"
      22.                 } else { 
      23.                     $sql = "status=99 AND catid='$catid'"
      24.                 } 
      25.             } 
      26.             return $this->db->count($sql); 
      27.         } 
      28.     } 

       


      你會發現,分頁統計的修改原理仍然是$where條件下,沒有傳入當前欄目id這個參數!


      大功告成,這樣既然正常分頁傳參,也能正常獲取當前欄目信息,獲取的信息總數也正確了

      但是,我并沒有測試在get方式下,是不是有影響,歡迎大家測試!!!










      相關欄目
      熱門文章
      最新圖文
      評論排行
      版權所有:鄭州騰石網絡科技有限公司 備案信息:豫ICP備18019117號
      站長QQ:2863868475 業務合作咨詢:15137100750(同微信)
      本站所有投放的廣告是有其他網站提供,不代表本站立場,同時網站首頁廣告位對外出租詳情咨詢本站站長!同時歡迎廣大站長加入個人建站團隊
      • 建站客服
      • CMS仿站
      • CMS學習
      • 技術交流群:336572814
      福彩开奖