当前位置:首页 > 教程 > cms教程 > phpcms > 正文

phpcms v9实现自定义多字段筛选功能联动菜单筛选下拉菜单筛选
栏目分类:phpcms   发布日期:2014-10-15   来源:互联网   浏览次数:

拷贝以下代码加到到 phpcms libs functions这个目录下extention func php文件中

拷贝以下代码加到到\phpcms\libs\functions这个目录下extention.func.php文件中

  1. /** 
  2.  *  extention.func.php 用户自定义函数库 
  3.  * @copyright           (C) 2005-2010 PHPCMS 
  4.  * @license             http://www.phpcms.cn/license/ 
  5.  * @lastmodify          2010-10-27 
  6.  */ 
  7.   /** 
  8.  * 通过指定keyid形式显示所有联动菜单 
  9.  * @param  $keyid 菜单主id 
  10.  * @param  $linkageid  联动菜单id,0调用顶级 
  11.  * @param  $modelid 模型id 
  12.  * @param  $fieldname  字段名称 
  13.  */ 
  14. function show_linkage($keyid$linkageid = 0, $modelid = ''$fieldname='zone') { 
  15.     $datas = $infos = $array = array(); 
  16.     $keyid = intval($keyid); 
  17.     $linkageid = intval($linkageid); 
  18.     //当前菜单id 
  19.     $field_value = intval($_GET[$fieldname]); 
  20.     $urlrule = structure_filters_url($fieldname,$array,1,$modelid); 
  21.     if($keyid == 0) return false; 
  22.     $datas = getcache($keyid,'linkage'); 
  23.     $infos = $datas['data']; 
  24.  
  25.     foreach($infos as $k=>$v){ 
  26.         if($v['parentid']==$field_value){ 
  27.             $array[$k]['name'] = $v['name']; 
  28.             $array[$k]['value'] = $k
  29.             $array[$k]['url'] = str_replace('{$'.$fieldname.'}',$k,$urlrule); 
  30.             $array[$k]['menu'] = $field_value == $k ? ''.$v['name'].'' : '.$array[$k]['url'].'>'.$v['name'].'' ; 
  31.         } 
  32.     } 
  33.     return $array
  34.  function structure_filters_url($fieldname,$array=array(),$type = 1,$modelid) { 
  35.     if(emptyempty($array)) { 
  36.         $array = $_GET
  37.     } else { 
  38.         $array = array_merge($_GET,$array); 
  39.     } 
  40.     //TODO 
  41.     $fields = getcache('model_field_'.$modelid,'model'); 
  42.     if(is_array($fields) && !emptyempty($fields)) { 
  43.         ksort($fields); 
  44.         foreach ($fields as $_v=>$_k) { 
  45.             if($_k['filtertype'] || $_k['rangetype']) { 
  46.                 if(strpos(URLRULE,'.html') === FALSE) $urlpars .= '&'.$_v.'={$'.$_v.'}'
  47.                 else $urlpars .= '-{$'.$_v.'}'
  48.             } 
  49.         } 
  50.     } 
  51.     //后期增加伪静态等其他url规则管理,apache伪静态支持9个参数 
  52.     if(strpos(URLRULE,'.html') === FALSE) $urlrule =APP_PATH.'index.php?m=content&c=index&a=lists&catid={$catid}'.$urlpars.'&page={$page}' ; 
  53.     else $urlrule =APP_PATH.'list-{$catid}'.$urlpars.'-{$page}.html'
  54.     //根据get传值构造URL 
  55.     if (is_array($array)) foreach ($array as $_k=>$_v) { 
  56.         if($_k=='page'$_v=1; 
  57.         if($type == 1) if($_k==$fieldnamecontinue
  58.         $_findme[] = '/{\$'.$_k.'}/'
  59.         $_replaceme[] = $_v
  60.     } 
  61.      //type 模式的时候,构造排除该字段名称的正则 
  62.     if($type==1) $filter = '(?!'.$fieldname.'.)'
  63.     $_findme[] = '/{\$'.$filter.'([a-z0-9_]+)}/'
  64.     $_replaceme[] = '';      
  65.     $urlrule = preg_replace($_findme$_replaceme$urlrule);    
  66.     return  $urlrule
  67. /** 
  68.  * 生成分类信息中的筛选菜单 
  69.  * @param $field   字段名称 
  70.  * @param $modelid  模型ID 
  71.  */ 
  72. function filters($field,$modelid,$diyarr = array()) { 
  73.     $fields = getcache('model_field_'.$modelid,'model'); 
  74.     $options = emptyempty($diyarr) ?  explode("\n",$fields[$field]['options']) : $diyarr
  75.     $field_value = intval($_GET[$field]); 
  76.     foreach($options as $_k) { 
  77.         $v = explode("|",$_k); 
  78.         $k = trim($v[1]); 
  79.         $option[$k]['name'] = $v[0]; 
  80.         $option[$k]['value'] = $k
  81.         $option[$k]['url'] = structure_filters_url($field,array($field=>$k),2,$modelid); 
  82.         $option[$k]['menu'] = $field_value == $k ? ''.$v[0].'' : '.$option[$k]['url'].'>'.$v[0].'' ; 
  83.     } 
  84.     $all['name'] = '全部'
  85.     $all['url'] = structure_filters_url($field,array($field=>''),2,$modelid); 
  86.     $all['menu'] = $field_value == '' ? ''.$all['name'].'' : '.$all['url'].'>'.$all['name'].''
  87.  
  88.     array_unshift($option,$all);     
  89.     return $option
  90. /** 
  91.  * 获取联动菜单层级 
  92.  * @param  $keyid     联动菜单分类id 
  93.  * @param  $linkageid 菜单id 
  94.  * @param  $leveltype 获取类型 parentid 获取父级id child 获取时候有子栏目 arrchildid 获取子栏目数组 
  95.  */ 
  96. function get_linkage_level($keyid,$linkageid,$leveltype = 'parentid') { 
  97.     $child_arr = $childs = array(); 
  98.     $leveltypes = array('parentid','child','arrchildid','arrchildinfo'); 
  99.     $datas = getcache($keyid,'linkage'); 
  100.     $infos = $datas['data']; 
  101.     if (in_array($leveltype$leveltypes)) { 
  102.         if($leveltype == 'arrchildinfo') { 
  103.             $child_arr = explode(',',$infos[$linkageid]['arrchildid']); 
  104.             foreach ($child_arr as $r) { 
  105.                 $childs[] = $infos[$r]; 
  106.             } 
  107.             return $childs
  108.         } else { 
  109.             return $infos[$linkageid][$leveltype]; 
  110.         } 
  111.     }    
  112.  
  113.     // 根据linkageid递归到父级 
  114.     function get_parent_url($modelid,$field,$linkageid=0,$array = array()){ 
  115.         $modelid = intval($modelid); 
  116.         if(!$modelid || emptyempty($field)) return false; 
  117.         $fields = getcache('model_field_'.$modelid,'model'); 
  118.         $keyid = $fields[$field]['linkageid']; 
  119.         $datas = getcache($keyid,'linkage'); 
  120.         $infos = $datas['data']; 
  121.          
  122.         if(emptyempty($linkageid)){ 
  123.             $linkageid = intval($_GET[$field]); 
  124.             if(!$linkageidreturn false; 
  125.         } 
  126.  
  127.         $urlrule = structure_filters_url($field,array(),1,$modelid); 
  128.         $urlrule = str_replace('{$'.$field.'}',$infos[$linkageid]['parentid'],$urlrule); 
  129.         array_unshift($array,array('name'=> $infos[$linkageid]['name'],'url'=>$urlrule)); 
  130.         if($infos[$linkageid]['parentid']){ 
  131.             return get_parent_url($modelid,$field,$infos[$linkageid]['parentid'],$array); 
  132.         } 
  133.         return $array
  134.     } 
  135. /** 
  136.  * 构造筛选时候的sql语句 
  137.  */ 
  138. function structure_filters_sql($modelid) { 
  139.     $sql = $fieldname = $min = $max = ''
  140.     $fieldvalue = array(); 
  141.     $modelid = intval($modelid); 
  142.     $model =  getcache('model','commons'); 
  143.     $fields = getcache('model_field_'.$modelid,'model'); 
  144.     $fields_key = array_keys($fields); 
  145.     //TODO 
  146.  
  147.     $sql = '`status` = \'99\''
  148.     foreach ($_GET as $k=>$r) { 
  149.         if(in_array($k,$fields_key) && intval($r)!=0 && ($fields[$k]['filtertype'] || $fields[$k]['rangetype'])) { 
  150.             if($fields[$k]['formtype'] == 'linkage') { 
  151.                 $datas = getcache($fields[$k]['linkageid'],'linkage'); 
  152.                 $infos = $datas['data']; 
  153.                 if($infos[$r]['arrchildid']) { 
  154.                     $sql .=  ' AND `'.$k.'` in('.$infos[$r]['arrchildid'].')';   
  155.                 }    
  156.             } elseif($fields[$k]['rangetype']) { 
  157.                 if(is_numeric($r)) { 
  158.                     $sql .=" AND `$k` = '$r'"
  159.                 } else { 
  160.                     $fieldvalue = explode('_',$r); 
  161.                     $min = intval($fieldvalue[0]); 
  162.                     $max = $fieldvalue[1] ? intval($fieldvalue[1]) : 999999;                 
  163.                     $sql .=" AND `$k` >= '$min' AND  `$k` < '$max'"
  164.                 } 
  165.             } else {     
  166.                 $sql .=" AND `$k` = '$r'"
  167.             } 
  168.         } 
  169.     }    
  170.     return $sql
  171. ?> 

使用方法如何:

后台添加字段(类型只能是联动菜单,和下拉列表)、然后选择作为筛选字段。
模板使用
=============================== 

  1. 您已选择: 
  2.   {loop get_parent_url($modelid,'diqu'$r
  3.       "{$r['url']}">{$r['name']} 
  4.   {/loop} 

==============================


联动菜单使用:

  1. {php $zones = show_linkage(1,0,$modelid,'diqu')} 
  2.  {if !emptyempty($zones)} 
  3.          {loop $zones $r
  4.            {$r['menu']} 
  5.        {/loop} 
  6.  {/if


==========================
下拉列表使用

  1. {loop filters('xz',$modelid$r
  2.       {$r[menu]} 
  3.   {/loop} 

==========================


配合列表标签使用:

  1. {php $sql = structure_filters_sql($modelid);} 
  2. {pc:content action="lists" where="$sql" catid="$catid" modelid="$modelid" num="10" page="$page"

====================================================
备注以上方法可以实现筛选功能但无法分页。您可以参考以下这篇文章来自定义分页功能。

phpcms v9自定义分页函数
http://www.juheweb.com/Tutorials/cms/phpcmsv/267.html

注意一下筛选自定义名称问题:

  1.     function wz_pages($num$curr_page$perpage = 20, $urlrule = ''$array = array(),$setpages = 10) { 
  2.             $yt=$_GET['yt'];//筛选自定义名称 
  3.             $dq=$_GET['dq'];//筛选自定义名称 
  4.             $wz_url="&yt=$yt&dq=$dq";//筛选自定义名称 
  5.             
  6.             if(defined('URLRULE') && $urlrule == '') { 
  7.                     $urlrule = URLRULE; 
  8.                     $array = $GLOBALS['URL_ARRAY']; 
  9.             } elseif($urlrule == '') { 
  10.                     $urlrule = url_par('page={$page}'); 
  11.             } 
  12. 未完整显示,未显示的代码为复制phpcms v9分页代码 
问题补充:
以上phpcms v9筛选无法实现分栏目显示列表,总是把整个模型的都列出不能区分栏目内容。以下解决办法
找到
  1. /** 
  2.  * 构造筛选时候的sql语句 
  3.  */ 
  4. function structure_filters_sql($modelid) { 
  5.     $sql = $fieldname = $min = $max = ''
  6.     $fieldvalue = array(); 
  7.     $modelid = intval($modelid); 
  8.     $model =  getcache('model','commons'); 
  9.     $fields = getcache('model_field_'.$modelid,'model'); 
  10.     $fields_key = array_keys($fields); 
  11.     //TODO 
  12.  
  13.     $sql = '`status` = \'99\''
  14.     foreach ($_GET as $k=>$r) { 
  15.         if(in_array($k,$fields_key) && $r!='' && ($fields[$k]['filtertype'] || $fields[$k]['rangetype'])) { 
  16.             if($fields[$k]['formtype'] == 'linkage') { 
  17.                 $datas = getcache($fields[$k]['linkageid'],'linkage'); 
  18.                 $infos = $datas['data']; 
  19.                 if($infos[$r]['arrchildid']) { 
  20.                     $sql .=  ' AND `'.$k.'` in('.$infos[$r]['arrchildid'].')';   
  21.                 }    
  22.             } elseif($fields[$k]['rangetype']) { 
  23.                 if(is_numeric($r)) { 
  24.                     $sql .=" AND `$k` = '$r'"
  25.                 } else { 
  26.                     $fieldvalue = explode('_',$r); 
  27.                     $min = intval($fieldvalue[0]); 
  28.                     $max = $fieldvalue[1] ? intval($fieldvalue[1]) : 999999;                 
  29.                     $sql .=" AND `$k` >= '$min' AND  `$k` < '$max'"
  30.                 } 
  31.             } else {     
  32.                 $sql .=" AND `$k` = '$r'"
  33.             } 
  34.         } 
  35.     }    
  36.     return $sql
  37.     return $k

替换成以下代码:

  1. /** 
  2.  * 构造筛选时候的sql语句 
  3.  */ 
  4. function structure_filters_sql($modelid,$cityid='',$catid) { //这里加上$catid  
  5.  $sql = $fieldname = $min = $max = '';  
  6. $fieldvalue = array();  
  7. $modelid = intval($modelid);  
  8. $model =getcache('model','commons');  
  9. $fields = getcache('model_field_'.$modelid,'model');  
  10. $fields_key = array_keys($fields); //TODO  
  11.  $sql = "`status` = 99 AND `catid`='$catid'";  //这里也加上,单引变双引你有木有看见,99的反斜杠也不见 
  12. if(intval($cityid)!=0)  
  13. $sql .= ' AND `city`=\''.$cityid.'\'';  
  14. foreach ($_GET as $k=>$r) {  
  15. if(in_array($k,$fields_key) && intval($r)!=0 && ($fields[$k]['filtertype'] || $fields[$k]['rangetype'])) {  
  16. if($fields[$k]['formtype'] == 'linkage') {  
  17. $datas = getcache($fields[$k]['linkageid'],'linkage');  
  18. $infos = $datas['data'];  
  19. if($infos[$r]['arrchildid']) {  
  20. $sql .= ' AND `'.$k.'` in('.$infos[$r]['arrchildid'].')';  
  21. }  
  22. elseif($fields[$k]['rangetype']) {  
  23. if(is_numeric($r)) {  
  24. $sql .=" AND `$k` = '$r'";  
  25. else {  
  26. $fieldvalue = explode('_',$r);  
  27. $min = intval($fieldvalue[0]);  
  28. $max = $fieldvalue[1] ? intval($fieldvalue[1]) : 999999;  
  29. $sql .=" AND `$k` >= '$min' AND`$k` < '$max'";  
  30. }  
  31. }  
  32. elseif($fields[$k]['boxtype']=='checkbox' || $fields[$k]['boxtype']=='multiple'){ //这里也改啦 
  33.  
  34. $sql .=" AND `$k` LIKE '%,$r,%'"//为的是复选或多选的筛选 
  35.  
  36. else {  
  37.  
  38. $sql .=" AND `$k` = '$r'";  
  39. }  
  40. }  
  41. }  
  42.  
  43.     return $sql
  44.     return $k

亲自试过,成功解决。

相关热词:phpcms列表筛选

Copyright © 2014 聚合分享 版权所有   京ICP备14037269号-1  关于聚合分享 | 广告合作 | 版权声明 | 意见反馈 | 联系方式 | 原创投稿 | 网站地图 | 友情链接
平面设计网页设计编程教程数据库cms教程电脑教程办公软件服务器seo优化