一種根據URL參數條件動態生成URL的方法
最近做了一個產品列表頁類似於搜索列表頁, 功能比較簡單,比搜索頁複雜的邏輯在於,生成各個查詢條件的URL。
我們的鏈接如下:
https://xxx.xxx.xxx/product/list.html?spm=0.0.0.0.fCULEV&noHistoryApi=1&q=洗衣機&start_price=1300&end_price=2300&ppath=6560:98950,2814486;570:24403,2085950&sort=sort-fid&fid=3486
一些特點如下:
比如品牌部分:
1:三洋的鏈接中,要在ppath現有的基礎上去掉中的6560:98950
2:海爾的鏈接中,要在ppath現有的基礎上增加6560:105540
同理在:
這部分,都有做ppath的調整。
而對價格部分
1:1300-2300的選項,點擊這項是,要在現有的url中去掉start_price和end_price方法。
2: 選擇其他價格時,要把start_price和end_price調整為對應的價格。
再比如這部分:
1:分類篩選部分,去過去掉三洋,迷你部分的篩選,都要去掉相關的篩選項,構建url。
2:比如點擊 能耗低,需要把url中的去掉sort=sort-fid&fid=3486,而點擊省水時,需要把fid調整為3386,如選擇人氣和銷量時,需要把sort修改為static-score,並把fid去掉。
以上這些組合鏈接,還要加上分頁的s參數變化,當修改為查詢條件時,分頁頁碼s,也要刪除。
總結下:生成鏈接中,主要工作是從現有的URL邏輯中刪除掉一些參數,或加上一些參數,或者修改某些參數中的一些參數。其中最複雜的是ppath,ppath要支持5670:1234,123;5690:xxx,xxx,需要支持:和,兩種形式的組合,而這些組合要支持加減操作。
根據這些規則,我們封裝了一個方法build_url_param,需要修改url部分,調用這個方法即可。
<li > <a href="<?php echo THING_COMMENT_LIST.'&'.build_url_param(array('ppath'=>$inValue['pid'].':'.$inValue['vid']),'+');?>"> <?php }else{?> <li > <a href="<?php echo THING_COMMENT_LIST.'&'.build_url_param(array('ppath'=>$inValue['pid'].':'.$inValue['vid']),'+');?>"> <?php }}else{ ?> <li > <a href="<?php echo THING_COMMENT_LIST.'&'.build_url_param(array('ppath'=>$inValue['pid'].':'.$inValue['vid'],'s'=>''),'-');?>"> <?php } // end if?>
代碼如上,build_url_param 構建查詢url的參數部分,build_url_param第一個參數,傳遞一個數組,數組中傳遞相關參數,第二個參數"+"或者"-",“+”表示在現有URL中,加上第一個參數array中的key和對應的value;“-”表示從現有的URL中,減去第一個參數array中對應的key和value,使用以上方法後,所有生成url的部分,就變得非常簡單了,隻有知道當前連接,需要調整那些參數,是新增參數還是去掉參數即可。
build_url_param函數的實現如下:
/** * 根據QUERY構建url * $array: 傳遞參數, */ function build_url_param($array,$type){ global $QUERY; $paramArray = array('q','start_price','end_price','cat','vid','ppath','sort','s','n','fid'); $myArray = array(); // 去掉不必要的參數 foreach($paramArray as $key=>$value){ // 放到myArray數組 if(isset($QUERY[$value]) && !empty($QUERY[$value])){ // n 不能小於10 if($value == 'n'){ if($QUERY[$value] < 10){ $myArray[$value] = '10'; } }else{ $myArray[$value] = $QUERY[$value]; } } } // 構造最基本的 if($type == '+'){ // 加參數 foreach($array as $key=>$value){ $temp = array(); // ppath特殊處理 // pid相同時,pid:vid,vid; vid之間用,分割 // pid不同時,pid:vid;分割 // $value參數: pid:vid的形式 if($key == 'ppath' && !empty($myArray[$key])){ // 查找是否已經有此pid $temp = $myArray[$key]; // 數組中的ppath $tempArray = explode(";",$temp); $tempPids = array(); foreach($tempArray as $k=>$v){ list($tempPid,$tempVid) = explode(":",$v); $tempPids[] = $tempPid; } $valueArray = explode(":",$value); // 找到 if(isset($valueArray[0]) && stristr($temp,$valueArray[0]) != false && in_array($valueArray[0],$tempPids)){ $myArray[$key] = str_replace($valueArray[0].":",$value.",",$myArray[$key]); }else{ // 沒有找到直接增加 $myArray[$key] = $myArray[$key].";".$value; } /*}elseif($key == 'fid'){ if(!empty($myArray['fid'])){ $myArray['sort'] = "sort-fid"; } $myArray[$key] = $value; */ }elseif($key == 'sort'){ unset($myArray['s']); $myArray[$key] = $value; }else{ unset($myArray['s']); $myArray[$key] = $value; } } }else{ // 減少參數 foreach($array as $key=>$value){ // 為空,去掉整個產生 if(empty($value)){ unset($myArray[$key]); }else{ // 獲取value $temp = $myArray[$key]; // 單獨處理ppath if($key == 'ppath'){ // 先找對應的pid,根據pid查找vid if($value == $myArray[$key]){ unset($myArray[$key]); }else{ // 數組,如果vid=0,刪除所有的pid $valueArray = explode(":",$value); $ppathArray = explode(";",$myArray[$key]); $t = array(); // ppath判斷 if(isset($ppathArray[0])){ foreach($ppathArray as $inKey=>$inValue){ // 直接去掉 if($inValue != $value){ //單條記錄path $inValueArray = explode(":",$inValue); // pid相同 if($inValueArray[0] == $valueArray[0]){ // 刪除vid $temp = str_replace(','.$valueArray[1],'',$inValueArray[1]); // 末尾 $temp = str_replace(':'.$valueArray[1],'',$temp); // 開頭 $temp = str_replace($valueArray[1].',','',$temp); // 中間 // 第二條件,用於刪除所有pid下的所有數據 if(!empty($temp) && $temp != $inValueArray[1]){ // 刪除後的數據進入t數組 $t[] = implode(":",array($inValueArray[0],$temp)); } }else{ $t[] = $inValue; } } } } // 處理後的數組,賦值給ppath if(count($t)){ $myArray[$key] = implode(";",$t); } } }else{ // 刪除裏麵信息 $myArray[$key] = str_replace($value,'',$temp); } } } } // 構造一段param return http_build_query($myArray); }
代碼寫的比較糙,有時間再細化下,關鍵是build參數的方式和方法希望對大家有所啟發和幫助。
最後更新:2017-04-03 12:53:43