freenetis-github/application/helpers/url.php @ c84c32de
8baed187 | Michal Kliment | <?php defined('SYSPATH') or die('No direct script access.');
|
|
/**
|
|||
* URL helper class.
|
|||
*
|
|||
* $Id: url.php 1970 2008-02-06 21:54:29Z Shadowhand $
|
|||
*
|
|||
* @package Core
|
|||
* @author Kohana Team
|
|||
* @copyright (c) 2007-2008 Kohana Team
|
|||
* @license http://kohanaphp.com/license.html
|
|||
*/
|
|||
class url {
|
|||
/**
|
|||
* Returns base url
|
|||
* @param <type> $index
|
|||
* @param <type> $protocol
|
|||
* @return <type>
|
|||
*/
|
|||
public static function base($index = FALSE, $protocol = FALSE)
|
|||
{
|
|||
$index_page = ($index && Settings::get('index_page')) ? 'index.php/' : '';
|
|||
$base_url = url::protocol().'://'.url::domain().url::suffix().$index_page;
|
|||
return $base_url;
|
|||
}
|
|||
/**
|
|||
* @author Michal Kliment
|
|||
* Returns domain
|
|||
* @return string
|
|||
*/
|
|||
public static function domain()
|
|||
{
|
|||
// if exists settings key, return it
|
|||
if (Settings::get('domain')!='')
|
|||
return Settings::get('domain');
|
|||
else
|
|||
// else return it from url
|
|||
return server::http_host();
|
|||
}
|
|||
/**
|
|||
* @author Michal Kliment
|
|||
* Returns url suffix
|
|||
* @return string
|
|||
*/
|
|||
public static function suffix()
|
|||
{
|
|||
// if exists settings key, return it
|
|||
if (Settings::get('suffix')!='')
|
|||
return Settings::get('suffix');
|
|||
else
|
|||
// else return it from url
|
|||
return substr(server::script_name(),0,-9);
|
|||
}
|
|||
/**
|
|||
* Returns protocol
|
|||
*
|
|||
* @author Michal Kliment, Ondřej Fibich
|
|||
* @return string
|
|||
*/
|
|||
public static function protocol()
|
|||
{
|
|||
// if exists settings key, return it
|
|||
if (Settings::get('protocol') != '')
|
|||
{
|
|||
return Settings::get('protocol');
|
|||
}
|
|||
else
|
|||
{
|
|||
return (
|
|||
!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ||
|
|||
@$_SERVER['SERVER_PORT'] == 443
|
|||
) ? 'https' : 'http';
|
|||
}
|
|||
}
|
|||
/**
|
|||
* Fetches a site URL based on a URI segment.
|
|||
*
|
|||
* @param string site URI to convert
|
|||
* @param string non-default protocol
|
|||
* @return string
|
|||
*/
|
|||
public static function site($uri = '', $protocol = FALSE)
|
|||
{
|
|||
$uri = trim($uri, '/');
|
|||
$qs = ''; // anchor?query=string
|
|||
$id = ''; // anchor#id
|
|||
if (strpos($uri, '?') !== FALSE)
|
|||
{
|
|||
list ($uri, $qs) = explode('?', $uri, 2);
|
|||
$qs = '?'.$qs;
|
|||
}
|
|||
if (strpos($uri, '#') !== FALSE)
|
|||
{
|
|||
list ($uri, $id) = explode('#', $uri, 2);
|
|||
$id = '#'.$id;
|
|||
}
|
|||
$index_page = Config::get('index_page', TRUE);
|
|||
$url_suffix = ($uri != '') ? Config::get('url_suffix') : '';
|
|||
return url::base(FALSE, $protocol).$index_page.$uri.$url_suffix.$qs.$id;
|
|||
}
|
|||
/**
|
|||
* Fetches the current URI.
|
|||
*
|
|||
* @param boolean include the query string
|
|||
* @return string
|
|||
*/
|
|||
public static function current($qs = FALSE)
|
|||
{
|
|||
return rtrim(Router::$current_uri.($qs === TRUE ? Router::$query_string : ''),'/');
|
|||
}
|
|||
/**
|
|||
* @author Michal Kliment
|
|||
* Returns previuos URI
|
|||
* @return string
|
|||
*/
|
|||
public static function previous()
|
|||
{
|
|||
return url::uri(rtrim(server::http_referer()),'/');
|
|||
}
|
|||
/**
|
|||
* @author Michal Kliment
|
|||
* Returns URI
|
|||
* @return string
|
|||
*/
|
|||
public static function uri($url)
|
|||
{
|
|||
if (substr($url, 0, strlen(url::base())) != url::base())
|
|||
return "";
|
|||
return rtrim(substr($url, strlen(url::base())),'/');
|
|||
}
|
|||
/**
|
|||
* Convert a phrase to a URL-safe title.
|
|||
*
|
|||
* @param string phrase to convert
|
|||
* @param string word separator (- or _)
|
|||
* @return string
|
|||
*/
|
|||
public static function title($title, $separator = '-')
|
|||
{
|
|||
//$separator = ($separator == '-') ? '-' : '_';
|
|||
// Replace all dashes, underscores and whitespace by the separator
|
|||
$title = preg_replace('/[-_\s]+/', $separator, $title);
|
|||
// Replace accented characters by their unaccented equivalents
|
|||
$title = utf8::transliterate_to_ascii($title);
|
|||
// Remove all characters that are not a-z, 0-9, or the separator
|
|||
$title = preg_replace('/[^a-z0-9'.$separator.']+/', '', strtolower($title));
|
|||
// Trim separators from the beginning and end
|
|||
$title = trim($title, $separator);
|
|||
return $title;
|
|||
}
|
|||
/**
|
|||
* Sends a page redirect header.
|
|||
*
|
|||
* @param string site URI or URL to redirect to
|
|||
* @param string HTTP method of redirect
|
|||
* @return A HTML anchor, but sends HTTP headers. The anchor should never be seen
|
|||
* by the user, unless their browser does not understand the headers sent.
|
|||
*/
|
|||
public static function redirect($uri = '', $method = '302')
|
|||
{
|
|||
if (Event::has_run('system.send_headers'))
|
|||
return;
|
|||
if (strpos($uri, '://') === FALSE)
|
|||
{
|
|||
$uri = url_lang::site($uri);
|
|||
}
|
|||
if ($method == 'refresh')
|
|||
{
|
|||
header('Refresh: 0; url='.$uri);
|
|||
}
|
|||
else
|
|||
{
|
|||
$codes = array
|
|||
(
|
|||
'300' => 'Multiple Choices',
|
|||
'301' => 'Moved Permanently',
|
|||
'302' => 'Found',
|
|||
'303' => 'See Other',
|
|||
'304' => 'Not Modified',
|
|||
'305' => 'Use Proxy',
|
|||
'307' => 'Temporary Redirect'
|
|||
);
|
|||
$method = isset($codes[$method]) ? $method : '302';
|
|||
header('HTTP/1.1 '.$method.' '.$codes[$method]);
|
|||
header('Location: '.$uri);
|
|||
}
|
|||
// Last resort, exit and display the URL
|
|||
exit('<a href="'.$uri.'">'.$uri.'</a>');
|
|||
}
|
|||
/**
|
|||
* Creates URL from URI
|
|||
*
|
|||
* @author Michal Kliment
|
|||
* @param string $uri
|
|||
* @return string
|
|||
*/
|
|||
public static function create ($uri)
|
|||
{
|
|||
return (
|
|||
substr(strtolower($uri),0,7) != 'http://' &&
|
|||
substr(strtolower($uri),0,8) != 'https://' &&
|
|||
substr(strtolower($uri),0,6) != 'ftp://'
|
|||
) ? 'http://'.$uri : $uri;
|
|||
}
|
|||
/**
|
|||
* Returns slice from url
|
|||
*
|
|||
* @author Michal Kliment
|
|||
* @param string $url
|
|||
* @param integer $offset
|
|||
* @param integer $length
|
|||
* @return string
|
|||
*/
|
|||
public static function slice ($url, $offset = 0, $length = NULL)
|
|||
{
|
|||
$segments = explode ('/', $url);
|
|||
return implode ('/', array_slice ($segments, $offset, $length));
|
|||
}
|
|||
/**
|
|||
* Returns query string from url in given format
|
|||
*
|
|||
* @author Michal Kliment
|
|||
* @param string $url
|
|||
* @param string $format
|
|||
* @return mixed
|
|||
*/
|
|||
public static function query_string ($url, $format = 'string')
|
|||
{
|
|||
// split url to url and query string
|
|||
$segments = explode('?', $url);
|
|||
$query_string = isset($segments[1]) ? $segments[1] : '';
|
|||
// format is string, can return result
|
|||
if ($format == 'string')
|
|||
return $query_string;
|
|||
// split query string to pieces
|
|||
$pieces = explode('&', $query_string);
|
|||
// format is pieces, can return result
|
|||
if ($format == 'pieces')
|
|||
return $pieces;
|
|||
// create associative array
|
|||
$array = array();
|
|||
foreach ($pieces as $key => $val)
|
|||
{
|
|||
if (strpos($val,'=') !== FALSE)
|
|||
list ($key, $val) = explode("=", $val);
|
|||
$array[$key] = $val;
|
|||
}
|
|||
// format is array, can return result
|
|||
if ($format = 'array')
|
|||
return $array;
|
|||
// format is unknown, return empty string
|
|||
return '';
|
|||
}
|
|||
/**
|
|||
* Builds query string from array
|
|||
*
|
|||
* @author Michal Kliment
|
|||
* @param type $array
|
|||
* @return string
|
|||
*/
|
|||
public static function build_query($array = array())
|
|||
{
|
|||
if (!count($array))
|
|||
return '';
|
|||
$pieces = array();
|
|||
foreach ($array as $key => $val)
|
|||
{
|
|||
if (!is_numeric($key))
|
|||
$pieces[] = "$key=$val";
|
|||
else
|
|||
$pieces[] = $val;
|
|||
}
|
|||
return '?'.implode('&', $pieces);
|
|||
}
|
|||
} // End url
|