首页 > CMS > PhpCMS > 正文

PHPCMS实现多重筛选实现程序

2024-09-10 07:16:22
字体:
来源:转载
供稿:网友

多重筛选其实对于php程序员开发者来讲是非常的简单了,下面来介绍在PHPCMS实现多重筛选实现例子,有需要了解的朋友一起来看看吧.

在我们使用PHPCMS开发一些产品展示类网站的时候,由于分类的多样化,我们需要客户在简短的时间内寻找到自己需要的产品,这样我们就会用到分类的多重筛选,也就是类似京东,淘宝等这么电商网站里面的产品筛选的功能,PHPCMS本身并没有这样的功能,需要我们进行二次开发,当然网上也出现了很多这样的功能,但不知道为什么,按照上面的步骤能实现的时候并不多,在经过一系列的查找和自己测试之后,我自己总结了以下的方法,希望后来者看到之后可以省去很多不必要的麻烦,我会尽可能的详细写出是怎么实现的,实现的效果在这里就不贴图片了,淘宝,京东上比我做的还好。

首先,要实现这个功能,在建立字段的时候字段的类型必须选择box类型,在是否作为筛选字段的项目里勾选“是”,是否作为搜索条件勾选“是”。

这建立好字段之后,剩下的就是怎么实现这个功能了。咱们需要在PHPCMS的自定义函数库这个文件里编写相应的分类筛选函数,代码如下:

  1. /** 
  2.  * 通过指定keyid形式显示所有联动菜单 
  3.  * @param  $keyid 菜单主id 
  4.  * @param  $linkageid  联动菜单id,0调用顶级 
  5.  * @param  $modelid 模型id 
  6.  * @param  $fieldname  字段名称 
  7.  */ 
  8. function show_linkage($keyid$linkageid = 0, $modelid = ''$fieldname='zone') { 
  9.     $datas = $infos = $array = array(); 
  10.     $keyid = intval($keyid); 
  11.     $linkageid = intval($linkageid); 
  12.     //当前菜单id 
  13.     $field_value = intval($_GET[$fieldname]); 
  14.     $urlrule = structure_filters_url($fieldname,$array,1,$modelid); 
  15.     if($keyid == 0) return false; 
  16.     $datas = getcache($keyid,'linkage'); 
  17.     $infos = $datas['data']; 
  18.     foreach($infos as $k=>$v){ 
  19.         if($v['parentid']==$field_value){ 
  20.             $array[$k]['name'] = $v['name']; 
  21.             $array[$k]['value'] = $k
  22.             $array[$k]['url'] = str_replace('{$'.$fieldname.'}',$k,$urlrule); 
  23.             $array[$k]['menu'] = $field_value == $k ? '<a class="click" style="color:#fff;">'.$v['name'].'</a>' : '<a href='.$array[$k]['url'].'>'.$v['name'].'</a>' ; 
  24.         } 
  25.     } 
  26.     return $array
  27.  function structure_filters_url($fieldname,$array=array(),$type = 1,$modelid) { 
  28.     if(emptyempty($array)) { 
  29.         $array = $_GET
  30.     } else { 
  31.         $array = array_merge($_GET,$array); 
  32.     } 
  33.     //TODO 
  34.     $fields = getcache('model_field_'.$modelid,'model'); 
  35.     if(is_array($fields) && !emptyempty($fields)) { 
  36.         ksort($fields); 
  37.         foreach ($fields as $_v=>$_k) { 
  38.             if($_k['filtertype'] || $_k['rangetype']) { 
  39.                 if(strpos(URLRULE,'.html') === FALSE) $urlpars .= '&'.$_v.'={$'.$_v.'}'
  40.                 else $urlpars .= '-{$'.$_v.'}'
  41.             } 
  42.         } 
  43.     } 
  44.     //后期增加伪静态等其他url规则管理,apache伪静态支持9个参数 
  45.     if(strpos(URLRULE,'.html') === FALSE) $urlrule =APP_PATH.'index.php?m=content&c=index&a=lists&catid={$catid}'.$urlpars.'&page={$page}' ; 
  46.     else $urlrule =APP_PATH.'list-{$catid}'.$urlpars.'-{$page}.html#wrap'
  47.     //根据get传值构造URL 
  48.     if (is_array($array)) foreach ($array as $_k=>$_v) { 
  49.         if($_k=='page'$_v=1; 
  50.         if($type == 1) if($_k==$fieldnamecontinue
  51.         $_findme[] = '/{\$'.$_k.'}/'
  52.         $_replaceme[] = $_v
  53.     } 
  54.      //type 模式的时候,构造排除该字段名称的正则 
  55.     if($type==1) $filter = '(?!'.$fieldname.'.)'
  56.     $_findme[] = '/{\$'.$filter.'([a-z0-9_]+)}/'
  57.     $_replaceme[] = '0';         
  58.     $urlrule = preg_replace($_findme$_replaceme$urlrule);    
  59.     return  $urlrule
  60. /** 
  61.  * 生成分类信息中的筛选菜单 
  62.  * @param $field   字段名称 
  63.  * @param $modelid  模型ID 
  64.  */ 
  65. function filters($field,$modelid,$diyarr = array()) { 
  66.     $fields = getcache('model_field_'.$modelid,'model'); 
  67.     $options = emptyempty($diyarr) ?  explode("\n",$fields[$field]['options']) : $diyarr
  68.     $field_value = intval($_GET[$field]); 
  69.     foreach($options as $_k) { 
  70.         $v = explode("|",$_k); 
  71.         $k = trim($v[1]); 
  72.         $option[$k]['name'] = $v[0]; 
  73.         $option[$k]['value'] = $k
  74.         $option[$k]['url'] = structure_filters_url($field,array($field=>$k),2,$modelid); 
  75.         $option[$k]['menu'] = $field_value == $k ? '<a class="click" style="color:#fff;">'.$v[0].'</a>' : '<a href='.$option[$k]['url'].'>'.$v[0].'</a>' ; //这个地方的a标签的class可以改成符合你自己网站的样式, 
  76.     }  //开源软件:Vevb.com 
  77.     $all['name'] = '全部';//'全部'; 
  78.     $all['url'] = structure_filters_url($field,array($field=>'0'),2,$modelid); 
  79.     $all['menu'] = $field_value == '' ? '<a class="click" style="color:#fff;">'.$all['name'].'</a>' : '<a href='.$all['url'].'>'.$all['name'].'</a>'
  80.     array_push($option,$all);    
  81.     return $option

把上面的这段代码复制到:extention.func.php这个文件里,在前台调用的时候需要一点点的改动,调用代码如下:

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

再调用的时候一定不要忽略了catid和modelid,二者缺其一无法调用。产品分类怎么调用呢?相信大家也看到了,在刚刚添加的函数里面有一个fliters函数,我们使用这个函数来调用已添加的box类型的字段,读取出我们需要进行筛选的分类。代码如下:

  1. {loop filters('fengge',$modelid$r//filters('需要调用的字段','字段所在的模型ID') 
  2. <li>{$r[menu]}</li> 
  3. {/loop} 

好了,在进行了如上几个步骤之后,你就会发现前台的分类筛选功能已经可以使用了,这时你是否是发现URL太长太不美观?没关系,假如你的空间支持伪静态的话,就可以把网站的URL调的简单美观。PHPCMS安装包里自带了一个.htaccess文件,直接复制到根目录里就好了。如果是IIS服务器的话,需要httpd.ini文件,转化一下就可以了,现在的IIS7有一个导入规则的功能,可以直接把.htaccess文件转化成web.config文件,这样就实现了伪静态。

一定要注意,把你自己添加的box筛选字段也加入到伪静态的规则里,否则是出现一些不必要的错误。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表