1. 程式人生 > >一種根據URL引數條件動態生成URL的方法

一種根據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
一些特點如下:
alt

比如品牌部分:

1:三洋的連結中,要在ppath現有的基礎上去掉中的6560:98950

2:海爾的連結中,要在ppath現有的基礎上增加6560:105540
同理在:
alt


這部分,都有做ppath的調整。

而對價格部分

1:1300-2300的選項,點選這項是,要在現有的url中去掉start_price和end_price方法。

2: 選擇其他價格時,要把start_price和end_price調整為對應的價格。
alt
再比如這部分:

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引數的方式和方法希望對大家有所啟發和幫助。