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

PHPCMS实现多重筛选实现程序

WBOY
WBOYoriginal
2016-05-26 08:20:541688parcourir

多重筛选其实对于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筛选字段也加入到伪静态的规则里,否则是出现一些不必要的错误。


教程链接:

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

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn