|
<?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);
|
|
}
|
|
|
|
|
|
/**
|
|
* @author Michal Kliment
|
|
* Returns protocol
|
|
* @return string
|
|
*/
|
|
public static function protocol()
|
|
{
|
|
// if exists settings key, return it
|
|
if (Settings::get('protocol')!='')
|
|
return Settings::get('protocol');
|
|
else
|
|
/**
|
|
* @todo Return it from url
|
|
*/
|
|
return '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::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));
|
|
}
|
|
|
|
} // End url
|