最近做了一个产品列表页类似于搜索列表页, 功能比较简单,比搜索页复杂的逻辑在于,生成各个查询条件的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参数的方式和方法希望对大家有所启发和帮助。