一种根据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参数的方式和方法希望对大家有所启发和帮助。
一种根据URL参数条件动态生成URL的方法的更多相关文章
- 使用<jsp:include>,不想写死URL,动态生成URL的解决的方法
JSP中文件包括有2种方式,静态包括和动态包括. 静态包括使用<%@ include file="" %>.动态包括使用<jsp:include page=&qu ...
- jQuery EasyUI中DataGird动态生成列的方法
EasyUI中使用DataGird显示数据列表中,有时需要根据需要显示不同的列,例如,在权限管理中,不同的用户登录后只能查看自己权限范围内的列表字段,这就需要DataGird动态组合列,下面介绍Eas ...
- 论一种基于JS技术的WEB前端动态生成框图的方法
前言 HTML是一种标记语言,由HTML的标签元素和文本编写的文档可被浏览器描述为一幅网页.通常情况下网页的实现是由HTML.CSS和Javascript三者结合完成的,HTML负责网页的结构,CSS ...
- stark组件(1):动态生成URL
项目启动时自动生成URL 效果图: 知识点: Django启动前通过apps下的ready方法执行一个可以生成URL的py文件 include函数主要返回有三个元素的一个元组.第一个是url配置(ur ...
- [转] Java运行时动态生成class的方法
[From] http://www.liaoxuefeng.com/article/0014617596492474eea2227bf04477e83e6d094683e0536000 廖雪峰 / 编 ...
- 【js操作url参数】获取指定url参数值、取指定url参数并转为json对象
获取指定url参数值 /* 获取某url中的某参数值 调用:GetUrlQueryString("[url地址]","[参数名]"); */ function ...
- js—input框中输入数字,动态生成内容的方法
项目中需要在前端实现: 用户输入数字n,动态生成n个元素,删除n,自动清空n个元素(如图一): 用户输入数字n,失焦生成n个元素,再聚焦修改n,自动清空n个元素(如图二): 图一: 图二: 需求一实现 ...
- 【MFC】picture控件 两种有细微差别的动态加载图片方法
摘自:http://www.jizhuomi.com/software/193.html VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control) 分类标签: 编程入门 ...
- js获取url参数,直接获取url中文
function GetQueryString(name)//name参数名称 { var reg = new RegExp("(^|&)"+ name +"=( ...
随机推荐
- 仿爱乐透android客户端界面实现(附工程源码)
最近研究了爱乐透android客户端的界面,感觉它的界面布局在一般开发中具有代表性.难点在于复杂的布局实现. 界面实现主要采用了以下方式: 注意:版本支持:android2.2以上,低版本要改动源码哦 ...
- 利用CentOS系统IPtables防火墙添加网站IP白名单
参考博文: 利用CentOS系统IPtables防火墙添加360网站卫士节点IP白名单 centos6.5添加白名单如下: 在防火墙 配置文件中加入白名单 ip -A INPUT -s 183.13 ...
- Javascript常用函数收集(不定期更新)
str.replace('/正则表达式/','替换内容'); //正则替换str.match('/正则表达式/','替换内容'); //正则匹配 str.indexOf('查找代码'); //查找是否 ...
- 基于visual Studio2013解决C语言竞赛题之0603打印素数
题目
- Android 实现在线程中联网
其实我们要牢记的是,对数据流的操作都是阻塞的,在一般情况下,我们是不需要考虑这个问题的,但是在Android 实现联网的时候,我们必须考虑到这个问题.比如:从网络上下载一张图片: Java代码: pu ...
- bootloader启动代码init.s解析----IRQ中断处理函数
bootloader启动代码init.s解析----IRQ中断处理函数 init.s源代码如下: ;///////////////////////////////////////////// ;opt ...
- ant-学习记录二
<?xml version="1.0"?> <project name="targetStudy" default="mkdir&q ...
- SQL Server 基础 04 函数与分组查询数据
函数与分组查询数据 系统函数分 聚合函数.数据类型转换函数.日期函数.数学函数 . . . 1. 聚合函数 主要是对一组值进行计算,然后返回一个值. 聚合函数包括 sum(求和).avg(求平均值). ...
- [转]Centos 6.5 优化 一些基础优化和安全设置
关于CentOS服务器的优化下文作为参考. 本文 centos 6.5 优化 的项有18处: 1.centos6.5最小化安装后启动网卡2.ifconfig查询IP进行SSH链接3.更新系统源并且升级 ...
- android handler looper thread
在线程中调用包含创建handler方法的时候,会报错,提示: “need call Looper.prepare()” -- 在创建之前,调用Looper.prepare()方法来创建一个looper ...