bludit/bl-kernel/url.class.php

223 lines
4.5 KiB
PHP
Raw Normal View History

2015-03-08 18:02:59 +01:00
<?php defined('BLUDIT') or die('Bludit CMS.');
class Url
{
private $uri;
2015-03-27 02:00:01 +01:00
private $uriStrlen;
2015-03-08 18:02:59 +01:00
private $whereAmI;
private $slug;
private $filters; // Filters for the URI
private $notFound;
2015-05-15 00:07:45 +02:00
private $parameters;
2016-01-21 03:16:32 +01:00
private $activeFilter;
private $httpCode;
private $httpMessage;
2015-03-08 18:02:59 +01:00
2015-03-14 15:45:30 +01:00
function __construct()
2015-03-08 18:02:59 +01:00
{
// Decodes any %## encoding in the given string. Plus symbols ('+') are decoded to a space character.
2015-05-15 00:07:45 +02:00
$decode = urldecode($_SERVER['REQUEST_URI']);
2015-03-08 18:02:59 +01:00
2017-05-09 00:24:15 +02:00
// Remove parameters GET, I don't use parse_url because has problem with utf-8
2015-07-26 02:25:13 +02:00
$explode = explode('?', $decode);
$this->uri = $explode[0];
2015-05-15 00:07:45 +02:00
$this->parameters = $_GET;
2015-05-31 03:06:55 +02:00
$this->uriStrlen = Text::length($this->uri);
2015-03-08 18:02:59 +01:00
$this->whereAmI = 'home';
$this->notFound = false;
2015-06-23 06:20:19 +02:00
$this->slug = '';
2015-03-27 02:00:01 +01:00
$this->filters = array();
2016-01-21 03:16:32 +01:00
$this->activeFilter = '';
$this->httpCode = 200;
$this->httpMessage = 'OK';
2015-03-14 15:45:30 +01:00
}
2015-03-08 18:02:59 +01:00
2015-11-30 01:45:30 +01:00
// Filters change for different languages
2015-03-14 15:45:30 +01:00
// Ex (Spanish): Array('post'=>'/publicacion/', 'tag'=>'/etiqueta/', ....)
// Ex (English): Array('post'=>'/post/', 'tag'=>'/tag/', ....)
public function checkFilters($filters)
{
2017-05-09 00:24:15 +02:00
// Store the admin filter and remove
2015-03-27 02:00:01 +01:00
$adminFilter['admin'] = $filters['admin'];
unset($filters['admin']);
2015-05-05 03:00:01 +02:00
2015-11-30 01:45:30 +01:00
// Sort filters by length
2015-03-27 02:00:01 +01:00
uasort($filters, array($this, 'sortByLength'));
2015-03-08 18:02:59 +01:00
2015-03-27 02:00:01 +01:00
// Push the admin filter first
$filters = $adminFilter + $filters;
$this->filters = $filters;
2015-03-08 18:02:59 +01:00
2017-05-09 00:24:15 +02:00
foreach($filters as $filterName=>$filterURI) {
// $slug will be FALSE if the filter is not included in the URI
2015-11-30 01:45:30 +01:00
$slug = $this->getSlugAfterFilter($filterURI);
2015-06-23 06:20:19 +02:00
2017-05-09 00:24:15 +02:00
if($slug!==false) {
2015-11-30 01:45:30 +01:00
$this->slug = $slug;
$this->whereAmI = $filterName;
2016-01-21 03:16:32 +01:00
$this->activeFilter = $filterURI;
2015-06-23 06:20:19 +02:00
2015-11-30 01:45:30 +01:00
// If the slug is empty
2017-05-09 00:24:15 +02:00
if( Text::isEmpty($slug) ) {
2015-03-27 02:00:01 +01:00
2017-05-09 00:24:15 +02:00
if($filterURI==='/') {
$this->whereAmI = 'home';
2016-01-08 21:12:17 +01:00
break;
}
2017-05-09 00:24:15 +02:00
if($filterURI===$adminFilter['admin']) {
2015-06-23 06:20:19 +02:00
$this->whereAmI = 'admin';
2015-06-27 06:28:13 +02:00
$this->slug = 'dashboard';
2015-06-23 06:20:19 +02:00
break;
}
$this->setNotFound();
2015-03-27 02:00:01 +01:00
}
break;
}
}
2015-03-08 18:02:59 +01:00
}
public function slug()
{
return $this->slug;
}
2017-07-11 23:53:53 +02:00
public function setSlug($slug)
{
$this->slug = $slug;
}
2016-01-21 03:16:32 +01:00
public function activeFilter()
{
return $this->activeFilter;
}
2015-05-05 03:00:01 +02:00
public function explodeSlug($delimiter="/")
{
return explode($delimiter, $this->slug);
}
2015-03-08 18:02:59 +01:00
public function uri()
{
return $this->uri;
}
// Return the filter used
2015-09-08 02:51:48 +02:00
public function filters($type, $trim=true)
2015-03-08 18:02:59 +01:00
{
2015-09-08 02:51:48 +02:00
$filter = $this->filters[$type];
if($trim) {
$filter = trim($filter, '/');
}
return $filter;
2015-03-08 18:02:59 +01:00
}
2017-05-09 00:24:15 +02:00
// Returns where is the user, home, pages, categories, tags..
2015-03-08 18:02:59 +01:00
public function whereAmI()
{
return $this->whereAmI;
}
public function setWhereAmI($where)
{
$GLOBALS['WHERE_AM_I'] = $where;
2015-03-08 18:02:59 +01:00
$this->whereAmI = $where;
}
public function notFound()
{
return $this->notFound;
}
2015-05-15 00:07:45 +02:00
public function pageNumber()
{
if(isset($this->parameters['page'])) {
2017-05-24 00:48:29 +02:00
return (int)$this->parameters['page'];
2015-05-15 00:07:45 +02:00
}
2017-05-24 00:48:29 +02:00
return 1;
2015-05-15 00:07:45 +02:00
}
public function setNotFound()
2015-03-08 18:02:59 +01:00
{
$this->notFound = true;
$this->httpCode = 404;
$this->httpMessage = 'Not Found';
}
public function httpCode()
{
return $this->httpCode;
}
public function setHttpCode($code = 200)
{
$this->httpCode = $code;
}
public function httpMessage()
{
return $this->httpMessage;
}
public function setHttpMessage($msg = 'OK')
{
$this->httpMessage = $msg;
2015-03-08 18:02:59 +01:00
}
2015-11-30 01:45:30 +01:00
// Returns the slug after the $filter, the slug could be an empty string
2015-06-23 06:20:19 +02:00
// If the filter is not included in the uri, returns FALSE
2015-03-08 18:02:59 +01:00
// ex: http://domain.com/cms/$filter/slug123 => slug123
2015-11-30 01:45:30 +01:00
// ex: http://domain.com/cms/$filter/name/lastname => name/lastname
// ex: http://domain.com/cms/$filter/ => empty string
// ex: http://domain.com/cms/$filter => empty string
2015-03-27 02:00:01 +01:00
private function getSlugAfterFilter($filter)
2015-03-08 18:02:59 +01:00
{
2015-11-30 01:45:30 +01:00
// Remove both slash from the filter
$filter = trim($filter, '/');
// Add to the filter the root directory
$filter = HTML_PATH_ROOT.$filter;
2015-03-14 15:45:30 +01:00
2015-03-27 02:00:01 +01:00
// Check if the filter is in the uri.
2015-11-30 01:45:30 +01:00
$position = Text::stringPosition($this->uri, $filter);
// If the position is FALSE, the filter isn't in the URI.
2015-05-05 03:00:01 +02:00
if($position===false) {
2015-03-08 18:02:59 +01:00
return false;
2015-05-05 03:00:01 +02:00
}
2015-03-08 18:02:59 +01:00
2015-11-30 01:45:30 +01:00
// Start position to cut
2015-05-31 03:06:55 +02:00
$start = $position + Text::length($filter);
2015-11-30 01:45:30 +01:00
// End position to cut
2015-03-27 02:00:01 +01:00
$end = $this->uriStrlen;
2015-03-08 18:02:59 +01:00
2015-11-30 01:45:30 +01:00
// Get the slug from the URI
2015-05-31 03:06:55 +02:00
$slug = Text::cut($this->uri, $start, $end);
2015-03-08 18:02:59 +01:00
2015-11-30 01:45:30 +01:00
if(Text::isEmpty($slug)) {
return '';
}
if($slug[0]=='/') {
return ltrim($slug, '/');
}
if($filter==HTML_PATH_ROOT) {
return $slug;
}
return false;
2015-03-27 02:00:01 +01:00
}
2015-03-08 18:02:59 +01:00
2015-03-27 02:00:01 +01:00
private function sortByLength($a, $b)
{
return strlen($b)-strlen($a);
2015-03-08 18:02:59 +01:00
}
2015-11-30 01:45:30 +01:00
}