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

一种根据URL参数条件动态生成URL的方法的更多相关文章

  1. 使用&lt;jsp:include&gt;,不想写死URL,动态生成URL的解决的方法

    JSP中文件包括有2种方式,静态包括和动态包括. 静态包括使用<%@ include file="" %>.动态包括使用<jsp:include page=&qu ...

  2. jQuery EasyUI中DataGird动态生成列的方法

    EasyUI中使用DataGird显示数据列表中,有时需要根据需要显示不同的列,例如,在权限管理中,不同的用户登录后只能查看自己权限范围内的列表字段,这就需要DataGird动态组合列,下面介绍Eas ...

  3. 论一种基于JS技术的WEB前端动态生成框图的方法

    前言 HTML是一种标记语言,由HTML的标签元素和文本编写的文档可被浏览器描述为一幅网页.通常情况下网页的实现是由HTML.CSS和Javascript三者结合完成的,HTML负责网页的结构,CSS ...

  4. stark组件(1):动态生成URL

    项目启动时自动生成URL 效果图: 知识点: Django启动前通过apps下的ready方法执行一个可以生成URL的py文件 include函数主要返回有三个元素的一个元组.第一个是url配置(ur ...

  5. [转] Java运行时动态生成class的方法

    [From] http://www.liaoxuefeng.com/article/0014617596492474eea2227bf04477e83e6d094683e0536000 廖雪峰 / 编 ...

  6. 【js操作url参数】获取指定url参数值、取指定url参数并转为json对象

    获取指定url参数值 /* 获取某url中的某参数值 调用:GetUrlQueryString("[url地址]","[参数名]"); */ function ...

  7. js—input框中输入数字,动态生成内容的方法

    项目中需要在前端实现: 用户输入数字n,动态生成n个元素,删除n,自动清空n个元素(如图一): 用户输入数字n,失焦生成n个元素,再聚焦修改n,自动清空n个元素(如图二): 图一: 图二: 需求一实现 ...

  8. 【MFC】picture控件 两种有细微差别的动态加载图片方法

    摘自:http://www.jizhuomi.com/software/193.html VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control) 分类标签: 编程入门 ...

  9. js获取url参数,直接获取url中文

    function GetQueryString(name)//name参数名称 { var reg = new RegExp("(^|&)"+ name +"=( ...

随机推荐

  1. BZOJ 1977: [BeiJing2010组队]次小生成树 Tree( MST + 树链剖分 + RMQ )

    做一次MST, 枚举不在最小生成树上的每一条边(u,v), 然后加上这条边, 删掉(u,v)上的最大边(或严格次大边), 更新答案. 树链剖分然后ST维护最大值和严格次大值..倍增也是可以的... - ...

  2. Python之路Day5

    一.时间复杂度 (1)时间频度: 一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费的时间就多.一个算法中的语句执行次数称为语句频度或时间频度,记为T(n). (2)时 ...

  3. Google Code Jam Round 1C 2015 Problem A. Brattleship

    Problem You're about to play a simplified "battleship" game with your little brother. The ...

  4. cmake 学习笔记(一)

    最大的Qt4程序群(KDE4)采用cmake作为构建系统 Qt4的python绑定(pyside)采用了cmake作为构建系统 开源的图像处理库 opencv 采用cmake 作为构建系统 ... 看 ...

  5. (step7.2.3)hdu 2554(N对数的排列问题——简单数论)

    题目大意:输入一个整数n,表示有n对整数.判断能否出现一种情况就是2个1之间有1个数,2个2之间有2个数..... 解题思路: 准备知识: ①n对数,共2*n个数.所以要有2*n个位置来放置这2*n个 ...

  6. Regionals 2012, Asia - Jakarta 解题报告

    啥都不会做了.. 做题慢死 A.Grandpa's Walk 签到题. 直接DFS就行. 注意先判断这个点可以作为一个路径的起点不. 然后再DFS. 否则处理起来略麻烦 #include <io ...

  7. win7下wordPress本地搭建博客详解(深度亲测整理---傻瓜式详细教程)

    搭建一个wordPress作为一个个人博客本来是特别简单的事情,但是网上的各种转载让初学者举步维艰,我就本身条件而言,会java EE,懂mysql都花费了我好长时间才搭建好本地博客. 注意:这个是本 ...

  8. 【四】注入框架RoboGuice使用:(Your First System Service Injection)

    上一篇我们简单的介绍了一下RoboGuice的使用([三]注入框架RoboGuice使用:(Your First Resource Injection)),今天我们来看下系统服务的使用注解的方法: 为 ...

  9. Android灭亡论之Firefox OS操作系统出现

    今天是2014年7月1日,过几天就要到深圳实训去了,实训核心内容是Android开发.尽管Android现在很火,但作为程序猿的我们必须时刻保持清醒的头脑.我虽不是什么预言家,但近期接触的Androi ...

  10. linux中如何修改文件夹的用户权限 chown命令

    linux中,可以使用chown命令来修改文件夹的用户权限. 1.  以普通用户 A 登录linux,利用su -切换到root用户 2. 在root用户下,可以看到文件夹内容 3. 但通过文件系统, ...