多重篩選其實對于php程序員開發(fā)者來講是非常的簡單了,下面來介紹在PHPCMS實現(xiàn)多重篩選實現(xiàn)例子,有需要了解的朋友一起來看看吧.
在我們使用PHPCMS開發(fā)一些產(chǎn)品展示類網(wǎng)站的時候,由于分類的多樣化,我們需要客戶在簡短的時間內(nèi)尋找到自己需要的產(chǎn)品,這樣我們就會用到分類的多重篩選,也就是類似京東,淘寶等這么電商網(wǎng)站里面的產(chǎn)品篩選的功能,PHPCMS本身并沒有這樣的功能,需要我們進行二次開發(fā),當然網(wǎng)上也出現(xiàn)了很多這樣的功能,但不知道為什么,按照上面的步驟能實現(xiàn)的時候并不多,在經(jīng)過一系列的查找和自己測試之后,我自己總結(jié)了以下的方法,希望后來者看到之后可以省去很多不必要的麻煩,我會盡可能的詳細寫出是怎么實現(xiàn)的,實現(xiàn)的效果在這里就不貼圖片了,淘寶,京東上比我做的還好。
首先,要實現(xiàn)這個功能,在建立字段的時候字段的類型必須選擇box類型,在是否作為篩選字段的項目里勾選“是”,是否作為搜索條件勾選“是”。
這建立好字段之后,剩下的就是怎么實現(xiàn)這個功能了。咱們需要在PHPCMS的自定義函數(shù)庫這個文件里編寫相應的分類篩選函數(shù),代碼如下:
- /**
- * 通過指定keyid形式顯示所有聯(lián)動菜單
- * @param $keyid 菜單主id
- * @param $linkageid 聯(lián)動菜單id,0調(diào)用頂級
- * @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]['menu'] = $field_value == $k ? '<a class="click" style="color:#fff;">'.$v['name'].'</a>' : '<a href='.$array[$k]['url'].'>'.$v['name'].'</a>' ;
- }
- }
- return $array;
- }
- function structure_filters_url($fieldname,$array=array(),$type = 1,$modelid) {
- if(emptyempty($array)) {
- $array = $_GET;
- } else {
- $array = array_merge($_GET,$array);
- }
- //TODO
- $fields = getcache('model_field_'.$modelid,'model');
- if(is_array($fields) && !emptyempty($fields)) {
- ksort($fields);
- foreach ($fields as $_v=>$_k) {
- if($_k['filtertype'] || $_k['rangetype']) {
- if(strpos(URLRULE,'.html') === FALSE) $urlpars .= '&'.$_v.'={$'.$_v.'}';
- else $urlpars .= '-{$'.$_v.'}';
- }
- }
- }
- //后期增加偽靜態(tài)等其他url規(guī)則管理,apache偽靜態(tài)支持9個參數(shù)
- if(strpos(URLRULE,'.html') === FALSE) $urlrule =APP_PATH.'index.php?m=content&c=index&a=lists&catid={$catid}'.$urlpars.'&page={$page}' ;
- else $urlrule =APP_PATH.'list-{$catid}'.$urlpars.'-{$page}.html#wrap';
- //根據(jù)get傳值構(gòu)造URL
- if (is_array($array)) foreach ($array as $_k=>$_v) {
- if($_k=='page') $_v=1;
- if($type == 1) if($_k==$fieldname) continue;
- $_findme[] = '/{\$'.$_k.'}/';
- $_replaceme[] = $_v;
- }
- //type 模式的時候,構(gòu)造排除該字段名稱的正則
- if($type==1) $filter = '(?!'.$fieldname.'.)';
- $_findme[] = '/{\$'.$filter.'([a-z0-9_]+)}/';
- $_replaceme[] = '0';
- $urlrule = preg_replace($_findme, $_replaceme, $urlrule);
- return $urlrule;
- }
- /**
- * 生成分類信息中的篩選菜單
- * @param $field 字段名稱
- * @param $modelid 模型ID
- */
- function filters($field,$modelid,$diyarr = array()) {
- $fields = getcache('model_field_'.$modelid,'model');
- $options = emptyempty($diyarr) ? explode("\n",$fields[$field]['options']) : $diyarr;
- $field_value = intval($_GET[$field]);
- foreach($options as $_k) {
- $v = explode("|",$_k);
- $k = trim($v[1]);
- $option[$k]['name'] = $v[0];
- $option[$k]['value'] = $k;
- $option[$k]['url'] = structure_filters_url($field,array($field=>$k),2,$modelid);
- $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可以改成符合你自己網(wǎng)站的樣式,
- } //開源軟件:Vevb.com
- $all['name'] = '全部';//'全部';
- $all['url'] = structure_filters_url($field,array($field=>'0'),2,$modelid);
- $all['menu'] = $field_value == '' ? '<a class="click" style="color:#fff;">'.$all['name'].'</a>' : '<a href='.$all['url'].'>'.$all['name'].'</a>';
- array_push($option,$all);
- return $option;
- }
把上面的這段代碼復制到:extention.func.php這個文件里,在前臺調(diào)用的時候需要一點點的改動,調(diào)用代碼如下:
- {php $sql = structure_filters_sql($modelid);}
- {pc:content action="lists" where="$sql" catid="$catid" modelid="$modelid" num="12" page="$page"}
再調(diào)用的時候一定不要忽略了catid和modelid,二者缺其一無法調(diào)用。產(chǎn)品分類怎么調(diào)用呢?相信大家也看到了,在剛剛添加的函數(shù)里面有一個fliters函數(shù),我們使用這個函數(shù)來調(diào)用已添加的box類型的字段,讀取出我們需要進行篩選的分類。代碼如下:
- {loop filters('fengge',$modelid) $r} //filters('需要調(diào)用的字段','字段所在的模型ID')
- <li>{$r[menu]}</li>
- {/loop}
好了,在進行了如上幾個步驟之后,你就會發(fā)現(xiàn)前臺的分類篩選功能已經(jīng)可以使用了,這時你是否是發(fā)現(xiàn)URL太長太不美觀?沒關(guān)系,假如你的空間支持偽靜態(tài)的話,就可以把網(wǎng)站的URL調(diào)的簡單美觀。PHPCMS安裝包里自帶了一個.htaccess文件,直接復制到根目錄里就好了。如果是IIS服務器的話,需要httpd.ini文件,轉(zhuǎn)化一下就可以了,現(xiàn)在的IIS7有一個導入規(guī)則的功能,可以直接把.htaccess文件轉(zhuǎn)化成web.config文件,這樣就實現(xiàn)了偽靜態(tài)。
一定要注意,把你自己添加的box篩選字段也加入到偽靜態(tài)的規(guī)則里,否則是出現(xiàn)一些不必要的錯誤。
新聞熱點
疑難解答
圖片精選