Home >php教程 >php手册 >PHPCMS实现多重筛选实现程序

PHPCMS实现多重筛选实现程序

WBOY
WBOYOriginal
2016-05-26 08:20:541688browse

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

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

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

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

/**
 * 通过指定keyid形式显示所有联动菜单
 * @param  $keyid 菜单主id
 * @param  $linkageid  联动菜单id,0调用顶级
 * @param  $modelid 模型id
 * @param  $fieldname  字段名称
 */
function show_linkage($keyid, $linkageid = 0, $modelid = '', $fieldname='zone') {
    $datas = $infos = $array = array();
    $keyid = intval($keyid);
    $linkageid = intval($linkageid);
    //当前菜单id
    $field_value = intval($_GET[$fieldname]);
    $urlrule = structure_filters_url($fieldname,$array,1,$modelid);
    if($keyid == 0) return false;
    $datas = getcache($keyid,'linkage');
    $infos = $datas['data'];
    foreach($infos as $k=>$v){
        if($v['parentid']==$field_value){
            $array[$k]['name'] = $v['name'];
            $array[$k]['value'] = $k;
            $array[$k]['url'] = str_replace('{$'.$fieldname.'}',$k,$urlrule);
            $array[$k][&#39;menu&#39;] = $field_value == $k ? &#39;<a class="click" style="color:#fff;">&#39;.$v[&#39;name&#39;].&#39;</a>&#39; : &#39;<a href=&#39;.$array[$k][&#39;url&#39;].&#39;>&#39;.$v[&#39;name&#39;].&#39;</a>&#39; ;
        }
    }
    return $array;
}
 function structure_filters_url($fieldname,$array=array(),$type = 1,$modelid) {
    if(empty($array)) {
        $array = $_GET;
    } else {
        $array = array_merge($_GET,$array);
    }
    //TODO
    $fields = getcache(&#39;model_field_&#39;.$modelid,&#39;model&#39;);
    if(is_array($fields) && !empty($fields)) {
        ksort($fields);
        foreach ($fields as $_v=>$_k) {
            if($_k[&#39;filtertype&#39;] || $_k[&#39;rangetype&#39;]) {
                if(strpos(URLRULE,&#39;.html&#39;) === FALSE) $urlpars .= &#39;&&#39;.$_v.&#39;={$&#39;.$_v.&#39;}&#39;;
                else $urlpars .= &#39;-{$&#39;.$_v.&#39;}&#39;;
            }
        }
    }
    //后期增加伪静态等其他url规则管理,apache伪静态支持9个参数
    if(strpos(URLRULE,&#39;.html&#39;) === FALSE) $urlrule =APP_PATH.&#39;index.php?m=content&c=index&a=lists&catid={$catid}&#39;.$urlpars.&#39;&page={$page}&#39; ;
    else $urlrule =APP_PATH.&#39;list-{$catid}&#39;.$urlpars.&#39;-{$page}.html#wrap&#39;;
    //根据get传值构造URL
    if (is_array($array)) foreach ($array as $_k=>$_v) {
        if($_k==&#39;page&#39;) $_v=1;
        if($type == 1) if($_k==$fieldname) continue;
        $_findme[] = &#39;/{\$&#39;.$_k.&#39;}/&#39;;
        $_replaceme[] = $_v;
    }
     //type 模式的时候,构造排除该字段名称的正则
    if($type==1) $filter = &#39;(?!&#39;.$fieldname.&#39;.)&#39;;
    $_findme[] = &#39;/{\$&#39;.$filter.&#39;([a-z0-9_]+)}/&#39;;
    $_replaceme[] = &#39;0&#39;;        
    $urlrule = preg_replace($_findme, $_replaceme, $urlrule);   
    return  $urlrule;
}
/**
 * 生成分类信息中的筛选菜单
 * @param $field   字段名称
 * @param $modelid  模型ID
 */
function filters($field,$modelid,$diyarr = array()) {
    $fields = getcache(&#39;model_field_&#39;.$modelid,&#39;model&#39;);
    $options = empty($diyarr) ?  explode("\n",$fields[$field][&#39;options&#39;]) : $diyarr;
    $field_value = intval($_GET[$field]);
    foreach($options as $_k) {
        $v = explode("|",$_k);
        $k = trim($v[1]);
        $option[$k][&#39;name&#39;] = $v[0];
        $option[$k][&#39;value&#39;] = $k;
        $option[$k][&#39;url&#39;] = structure_filters_url($field,array($field=>$k),2,$modelid);
        $option[$k][&#39;menu&#39;] = $field_value == $k ? &#39;<a class="click" style="color:#fff;">&#39;.$v[0].&#39;</a>&#39; : &#39;<a href=&#39;.$option[$k][&#39;url&#39;].&#39;>&#39;.$v[0].&#39;</a>&#39; ; //这个地方的a标签的class可以改成符合你自己网站的样式,
    }
    $all[&#39;name&#39;] = &#39;全部&#39;;//&#39;全部&#39;;
    $all[&#39;url&#39;] = structure_filters_url($field,array($field=>&#39;0&#39;),2,$modelid);
    $all[&#39;menu&#39;] = $field_value == &#39;&#39; ? &#39;<a class="click" style="color:#fff;">&#39;.$all[&#39;name&#39;].&#39;</a>&#39; : &#39;<a href=&#39;.$all[&#39;url&#39;].&#39;>&#39;.$all[&#39;name&#39;].&#39;</a>&#39;;
    array_push($option,$all);   
    return $option;
}

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

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

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

{loop filters(&#39;fengge&#39;,$modelid) $r} //filters(&#39;需要调用的字段&#39;,&#39;字段所在的模型ID&#39;)
<li>{$r[menu]}</li>
{/loop}

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


教程链接:

随意转载~但请保留教程地址★

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn