1
0
mirror of https://github.com/e107inc/e107.git synced 2025-08-05 22:27:34 +02:00

Merge pull request #1152 from lonalore/master

Issue #1139: Feature: e107::url() modification to support query param…
This commit is contained in:
Cameron
2015-07-22 10:58:03 -07:00

View File

@@ -2621,16 +2621,39 @@ class e107
* @param string $plugin
* @param $key
* @param array $row
* @param string $mode abs | full
* @param array $options
* (optional) An associative array of additional options, with the following elements:
* - 'mode': abs | full
* - 'query': An array of query key/value-pairs (without any URL-encoding) to append to the URL.
* - 'fragment': A fragment identifier (named anchor) to append to the URL. Do not include the leading '#' character.
* @return string
*/
public static function url($plugin='',$key, $row=array(), $mode='abs')
public static function url($plugin='',$key, $row=array(), $options = array())
{
$tmp = e107::getAddonConfig('e_url');
$tp = e107::getParser();
$pref = self::getPref('e_url_alias');
if(is_string($options)) // backwards compat.
{
$options = array(
'mode' => $options,
);
}
// Merge in defaults.
$options += array(
'mode' => 'abs',
'fragment' => '',
'query' => array(),
);
if(isset($options['fragment']) && $options['fragment'] !== '')
{
$options['fragment'] = '#' . $options['fragment'];
}
if(varset($tmp[$plugin][$key]['sef']))
{
if(!empty($tmp[$plugin][$key]['alias']))
@@ -2659,14 +2682,21 @@ class e107
{
$rawUrl = $tp->simpleParse($tmp[$plugin][$key]['sef'], $row);
if($mode == 'full')
if($options['mode'] == 'full')
{
return SITEURL.$rawUrl;
$sefUrl = SITEURL.$rawUrl;
}
else
{
return e_HTTP.$rawUrl;
$sefUrl = e_HTTP.$rawUrl;
}
// Append the query.
if (is_array($options['query']) && !empty($options['query'])) {
$sefUrl .= (strpos($sefUrl, '?') !== FALSE ? '&' : '?') . self::httpBuildQuery($options['query']);
}
return $sefUrl . $options['fragment'];
}
else // Legacy URL.
{
@@ -2683,12 +2713,17 @@ class e107
$template = isset($tmp[$plugin][$key]['legacy']) ? $tmp[$plugin][$key]['legacy'] : $tmp[$plugin][$key]['redirect'];
$urlTemplate = str_replace($srch,$repl, $template);
$urlTemplate = $tp->replaceConstants($urlTemplate, $mode);
$urlTemplate = $tp->replaceConstants($urlTemplate, $options['mode']);
$legacyUrl = $tp->simpleParse($urlTemplate, $row);
$legacyUrl = preg_replace('/&?\$[\d]/i', "", $legacyUrl); // remove any left-over $x (including prefix of '&')
return $legacyUrl;
// Append the query.
if (is_array($options['query']) && !empty($options['query'])) {
$legacyUrl .= (strpos($legacyUrl, '?') !== FALSE ? '&' : '?') . self::httpBuildQuery($options['query']);
}
return $legacyUrl . $options['fragment'];
}
@@ -2703,7 +2738,7 @@ class e107
/*
elseif(varset($tmp[$plugin][$key]['redirect']))
{
return self::getParser()->replaceConstants($tmp[$plugin][$key]['redirect'],'full');
return self::getParser()->replaceConstants($tmp[$plugin][$key]['redirect'],'full');
}
return;
@@ -2712,6 +2747,42 @@ class e107
}
/**
* Parses an array into a valid, rawurlencoded query string. This differs from http_build_query() as we need to
* rawurlencode() (instead of urlencode()) all query parameters.
* @param array $query The query parameter array to be processed, e.g. $_GET.
* @param string $parent Internal use only. Used to build the $query array key for nested items.
* @return array A rawurlencoded string which can be used as or appended to the URL query string.
*/
public static function httpBuildQuery(array $query, $parent = '')
{
$params = array();
foreach($query as $key => $value)
{
$key = ($parent ? $parent . '[' . rawurlencode($key) . ']' : rawurlencode($key));
// Recurse into children.
if(is_array($value))
{
$params [] = self::httpBuildQuery($value, $key);
}
// If a query parameter value is NULL, only append its key.
elseif(!isset($value))
{
$params [] = $key;
}
else
{
// For better readability of paths in query strings, we decode slashes.
$params [] = $key . '=' . str_replace('%2F', '/', rawurlencode($value));
}
}
return implode('&', $params);
}
public static function minify($js,$options=null)
{
if(empty($js))