一種根據URL引數條件動態生成URL的方法
最近做了一個產品列表頁類似於搜尋列表頁, 功能比較簡單,比搜尋頁複雜的邏輯在於,生成各個查詢條件的URL。
我們的連結如下:
http://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 class="item"> <a href="<?php echo THING_COMMENT_LIST.'&'.build_url_param(array('ppath'=>$inValue['pid'].':'.$inValue['vid']),'+');?>"> <?php }else{?> <li class="item-hidden"> <a href="<?php echo THING_COMMENT_LIST.'&'.build_url_param(array('ppath'=>$inValue['pid'].':'.$inValue['vid']),'+');?>"> <?php }}else{ ?> <li class="item-checked"> <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引數的方式和方法希望對大家有所啟發和幫助。