Current Directory: /home/astoriaah/www/old15/administrator/components/com_sh404sef/helpers
Viewing File: /home/astoriaah/www/old15/administrator/components/com_sh404sef/helpers/url.php
<?php
/**
* sh404SEF - SEO extension for Joomla!
*
* @author Yannick Gaultier
* @copyright (c) Yannick Gaultier 2014
* @package sh404SEF
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
* @version 4.4.4.1791
* @date 2014-07-01
*/
// Security check to ensure this file is being included by a parent file.
if (!defined('_JEXEC'))
die();
class Sh404sefHelperUrl
{
static $componentsRouters = array();
public static function buildUrl($elements, $option = 'com_sh404sef')
{
$url = 'index.php?option=' . $option;
if (is_array($elements) && !empty($elements))
{
foreach ($elements as $key => $value)
{
$url .= '&' . $key . '=' . $value;
}
}
return $url;
}
public static function stripTrackingVarsFromNonSef($url)
{
$trackingVars = self::_getTrackingVars();
return self::stripVarsFromNonSef($url, $trackingVars);
}
public static function stripTrackingVarsFromSef($url)
{
// do we have query vars?
$parts = explode('?', $url);
if (empty($parts[1]))
{
// no variable parts, return identical
return $url;
}
$trackingVars = self::_getTrackingVars();
$cleaned = self::stripVarsFromNonSef('?' . $parts[1], $trackingVars);
// rebuild and return
$cleaned = JString::ltrim($cleaned, '?&');
$cleaned = $parts[0] . (empty($cleaned) ? '' : '?' . $cleaned);
return $cleaned;
}
public static function extractTrackingVarsFromNonSef($url, &$existingVars, $keepThem = false)
{
$trackingVars = self::_getTrackingVars();
foreach ($trackingVars as $var)
{
// collect existing value, if any
$value = self::getUrlVar($url, $var, null);
if (!is_null($value))
{
// store extracted value into passed array
$existingVars[$var] = $value;
}
// still remove var from url
if (!$keepThem)
{
$url = Sh404sefHelperUrl::clearUrlVar($url, $var);
}
}
return $url;
}
protected static function _getTrackingVars()
{
$trackingVars = Sh404sefFactory::getPConfig()->trackingVars;
return $trackingVars;
}
public static function stripVarsFromNonSef($url, $vars = array())
{
if (!empty($vars))
{
foreach ($vars as $var)
{
$url = Sh404sefHelperUrl::clearUrlVar($url, $var);
}
}
return $url;
}
public static function setUrlVar($string, $var, $value, $canBeEmpty = false)
{
if (empty($string) || empty($var))
return $string;
if (!$canBeEmpty && empty($value))
{
return $string;
}
$string = str_replace('&', '&', $string); // normalize
$exp = '/(&|\?)' . preg_quote($var, '/') . '=[^&]*/iu';
$result = preg_match($exp, $string);
if ($result) // var already in URL
$result = preg_replace($exp, '$1' . $var . '=' . $value, $string);
else
{ // var does not exist in URL
$result = $string . (strpos($string, '?') !== false ? '&' : '?') . $var . '=' . $value;
$result = Sh404sefHelperUrl::sortUrl($result);
}
return $result;
}
public static function getUrlVar($string, $var, $default = '')
{
if (strpos($string, 'index.php?') === 0)
{
$string = substr($string, 10);
}
$string = str_replace('&', '&', $string); // normalize
$string = str_replace('&', '&', $string); // normalize #2
$vars = array();
parse_str($string, $vars);
$value = isset($vars[$var]) ? $vars[$var] : $default;
return $value;
}
public static function clearUrlVar($string, $var)
{
return ShlSystem_Strings::pr('/(&|\?)' . preg_quote($var, '/') . '=[^&]*/iu', '', $string);
}
/**
* Get Language tag from url code found in a url
*
*/
public static function getUrlLang($string)
{
$matches = array();
$string = str_replace('&', '&', $string); // normalize
$result = preg_match('/(&|\?)lang=[^&]*/i', $string, $matches);
if (!empty($matches))
{
$result = JString::trim($matches[0], '&?');
$result = str_replace('lang=', '', $result);
return Sh404sefHelperLanguage::getLangTagFromUrlCode($result);
}
return '';
}
/**
* Sort query key/value pairs in alphabetical
* increasing order
*
* @param string $string the non-sef url, starting with index.php?
* @return string
*/
public static function sortURL($nonSef)
{
// URL must be like : index.php?param2=xxx&option=com_ccccc¶m1=zzz
if ((substr($nonSef, 0, 10) !== 'index.php?'))
{
return $nonSef;
}
// URL returned will be ! index.php?option=com_ccccc¶m1=zzz¶m2=xxx
$ret = '';
$st = str_replace('&', '&', $nonSef);
$st = str_replace('index.php', '', $st);
$st = str_replace('?', '', $st);
parse_str($st, $shTmpVars);
$shVars = self::deepEncode($shTmpVars);
if (count($shVars) > 0)
{
ksort($shVars); // sort URL array
$shNewString = '';
$ret = 'index.php?';
foreach ($shVars as $key => $value)
{
if (strtolower($key) != 'option')
{
// option is always first parameter
if (is_array($value))
{
foreach ($value as $k => $v)
{
// fix for arrays, thanks doorknob
$shNewString .= '&' . $key . '[' . $k . ']=' . $v;
}
}
else
{
$shNewString .= '&' . $key . '=' . $value;
}
}
else
{
$ret .= $key . '=' . $value;
}
}
$ret .= $ret == 'index.php?' ? JString::ltrim($shNewString, '&') : $shNewString;
}
return $ret;
}
/**
* Url encoding with 2-levels arrays
*
* @param mixed $data
* @return mixed
*/
public static function deepEncode($data)
{
if (is_array($data))
{
foreach ($data as $key => $element)
{
$data[$key] = self::deepEncode($element);
}
return $data;
}
else
{
return urlencode($data);
}
}
public static function buildUrlWithRouterphp(&$vars, $option)
{
$componentName = substr($option, 4);
// search for proxy functions first
// so as to be pre-3.3 compatible
$functionName = ucfirst($componentName) . 'BuildRoute';
$fileName = JPATH_ROOT . '/components/' . $option . '/router.php';
if (!function_exists($functionName) && file_exists($fileName))
{
include $fileName;
}
if (function_exists($functionName))
{
$segments = $functionName($vars);
return $segments;
}
// new API, J!3.3+
if (version_compare(JVERSION, '3.3', 'ge'))
{
// no function, try class
if (empty(self::$componentsRouters[$componentName]))
{
$className = $componentName . 'Router';
if (!class_exists($className))
{
// Use the custom routing handler if it exists
if (file_exists($fileName))
{
require_once $fileName;
}
}
if (class_exists($className))
{
$reflection = new ReflectionClass($className);
if (in_array('JComponentRouter', $reflection->getInterfaceNames()))
{
self::$componentsRouters[$componentName] = new $className();
}
}
}
if (!empty(self::$componentsRouters[$componentName]))
{
$segments = self::$componentsRouters[$componentName]->build($vars);
return $segments;
}
}
return array();
}
/**
* Encode route segments
*
* @param array $segments An array of route segments
*
* @return array Array of encoded route segments
*
*/
public static function encodeSegments($segments)
{
$total = count($segments);
for ($i = 0; $i < $total; $i++)
{
$segments[$i] = str_replace(':', '-', $segments[$i]);
}
return $segments;
}
/**
* Extract original url used to build a JUri object
* as it's often modified by Joomla, though needed later
*
* @param JUri $uri
* @return string original url stored in protected property
*/
public static function getOriginalUrlFromUri($uri)
{
$propertyName = version_compare(JVERSION, '3.0', 'ge') ? 'uri' : '_uri';
$originalUrl = Sh404sefHelperGeneral::getProtectedProperty('Juri', $propertyName, $uri);
return $originalUrl;
}
/**
* Extract original path used to build a JUri object
* as it's often modified by Joomla, though needed later
*
* @param JUri $uri
* @parma string $base the base url for the uri, usually JURI:: base
* @return string original path built from stored in protected property
*/
public static function getOriginalPathFromUri($uri, $base)
{
$propertyName = version_compare(JVERSION, '3.0', 'ge') ? 'uri' : '_uri';
$originalUrl = Sh404sefHelperGeneral::getProtectedProperty('Juri', $propertyName, $uri);
$originalPath = substr_replace(urldecode($originalUrl), '', 0, strlen(JUri::base()));
$pathBits = explode('?', $originalPath);
$originalPath = $pathBits[0];
return $originalPath;
}
}