性感的农民 2015-06-06 09:22:08 5443次浏览 0条评论 1 1 0

业务逻辑比较复杂的页面设计时,通常用面包屑的方式增加UX。特别是分页的gridview过滤后表格的下级页面,并且该页面又有tab等a标签的url。经分析后会发现,大多数情况实际上不需要从头构建这些href,简单地替换或者去掉原url中的&key=value或者?key=value即可。理论上可有正则替换、用array_merge等实现方法,本例用正则替换。

欢迎扔砖,欢迎改进。废话到此,直接上函数:

/**
 * url替换参数: 
 *     a) 替换原来的参数: $url_in有$key时
 *     b) 添加新参数: $url_in中没有$key时
 *     c) 丢弃指定的参数: $drop为true时
 * 需要考虑?key=value,以及&key=value两种情况。
 * @param  str  $url_in 原来的url
 * @param  str  $key    参数的key
 * @param  str  $value  参数的value
 * @param  boolean $drop   是否丢弃这个key,为true时,返回结果中不包含这个key,$value被忽略
 * @return str          新的url
 */
public static function urlReplaceParam($url_in, $key, $value, $drop=false)
{
    # $key=开始除了'&'外的任意字符,以'&结尾'。注:如果用'.'表示任意字符,则直接匹配到末尾的&
    $pattern1 = "/&$key=[^&]+&/"; 
    # ?key=开始除了'&'外的任意字符,以'&结尾'。注:如果用'.'表示任意字符,则直接匹配到末尾的&
    $pattern2 = "/\?$key=[^&]+&/";                  // '?'要转义
    $newparam1 = (!$drop)? "&$key=$value&" : "&";
    $newparam2 = (!$drop)? "?$key=$value&" : "?";

    $url_out  = preg_replace($pattern2, $newparam2, $url_in.'&');    // 替换 ?key=value为新的内容
    if ($url_out != $url_in.'&'){
        return preg_replace("/[&|\?]$/", "", $url_out);              // 有替换发生,去掉结尾的&或者?, 返回
    }
    $url_out  = preg_replace($pattern1, $newparam1, $url_in.'&');    // 替换 &key=value为新的内容 
    if ($url_out != $url_in.'&'){
        return preg_replace("/[&|\?]$/","",$url_out);                // 有替换发生,去掉结尾的&或者?,返回
    }

    # 无替换,说明是新加的参数, 或者替换后和原来的值一样
    if (strstr($url_out, $key)){
        # 替换后和替换前一样,返回
        return preg_replace("/[&|\?]$/","",$url_out);
    }

    if (!$drop){
        if (strstr($url_in, '?')) {
            $url_out = $url_in . "&$key=$value";
        }else{
            $url_out = $url_in . "?$key=$value";
        }
    }
    return preg_replace("/[&|\?]$/","",$url_out);                 // 有替换发生,去掉结尾的&或者?,返回
}

该函数设计成一个叫Misc的helper类的静态函数,调用示例:

# 取url中的过滤条件
$flt = yii::$app->request->get('flt','all');
# 生成tab过滤的href
$prevurl = Yii::$app->request->getUrl();
$flta = Misc::urlReplaceParam($prevurl,'flt','',true);
$fltu = Misc::urlReplaceParam($prevurl,'flt','unused');
$fltp = Misc::urlReplaceParam($prevurl,'flt','pic');
$fltv = Misc::urlReplaceParam($prevurl,'flt','video');
$fltt = Misc::urlReplaceParam($prevurl,'flt','text');
觉得很赞
    没有找到数据。
您需要登录后才可以评论。登录 | 立即注册