127 lines
3.3 KiB
PHP
Executable File
127 lines
3.3 KiB
PHP
Executable File
<?php
|
|
|
|
class URL
|
|
{
|
|
|
|
static $locator = '';
|
|
static $route = array();
|
|
static $error = '';
|
|
static $title = 'TITLE';
|
|
static $page_type = 'html';
|
|
static $fragments = [];
|
|
|
|
# extracts the locator string from parameters or the URI
|
|
static function ParseRequestURI()
|
|
{
|
|
$uri = (string)first($_SERVER['REQUEST_URI']);
|
|
$parsed_uri = parse_url($uri);
|
|
$loc = (string)($parsed_uri['path'] ?? '');
|
|
$query_string = (string)($parsed_uri['query'] ?? '');
|
|
if($query_string !== '')
|
|
{
|
|
$route_found = false;
|
|
$query_parts = explode('&', $query_string);
|
|
$named_parts = array();
|
|
foreach($query_parts as $query_part)
|
|
{
|
|
if($query_part === '')
|
|
continue;
|
|
if(!$route_found && str_contains($query_part, '=') === false)
|
|
{
|
|
$loc = rawurldecode($query_part);
|
|
$route_found = true;
|
|
continue;
|
|
}
|
|
$named_parts[] = $query_part;
|
|
}
|
|
if(sizeof($named_parts) > 0)
|
|
{
|
|
$params = array();
|
|
parse_str(implode('&', $named_parts), $params);
|
|
$_REQUEST = array_merge($_REQUEST, $params);
|
|
}
|
|
}
|
|
|
|
self::$locator = $loc;
|
|
return($loc);
|
|
}
|
|
|
|
static function NotFound($message = 'resource not found')
|
|
{
|
|
header("HTTP/1.0 404 Not Found");
|
|
self::$error = $message;
|
|
}
|
|
|
|
static $tried = array();
|
|
|
|
# determines which view to show given a locator string
|
|
static function MakeRoute($lc = false)
|
|
{
|
|
$route = $GLOBALS['config']['url'];
|
|
if(!$lc)
|
|
$lc = URL::ParseRequestURI();
|
|
if(str_starts_with($lc, $GLOBALS['config']['url']['root']))
|
|
$lc = substr($lc, strlen($GLOBALS['config']['url']['root']));
|
|
$seg = array();
|
|
foreach(explode('/', $lc) as $s)
|
|
if(substr($s, 0, 1) != '.' && $s != '') # strip unnecessary prefixes
|
|
$seg[] = $s;
|
|
$route['l-path'] = implode('/', $seg);
|
|
$route['page'] = first($seg[0] ?? false, 'index');
|
|
if(isset($seg[0]) && $seg[0] !== '' && substr($seg[0], 0, 1) == ':')
|
|
{
|
|
$route['page'] = substr($route['l-path'], 1);
|
|
}
|
|
if(sizeof(self::$route) == 0) self::$route = $route;
|
|
return($route);
|
|
}
|
|
|
|
static function ResolveViewFile($base_dir = 'views')
|
|
{
|
|
$lpath = first(self::$route['l-path'], 'index');
|
|
$base_dir = rtrim($base_dir, '/');
|
|
$content_file = $base_dir.'/'.$lpath;
|
|
if(file_exists($content_file.'.php'))
|
|
return array('file' => $content_file.'.php');
|
|
$dir_index_file = $content_file.'/index.php';
|
|
if(file_exists($dir_index_file))
|
|
return array('file' => $dir_index_file);
|
|
$lpath_parts = array_values(array_filter(explode('/', $lpath), function($segment) {
|
|
return $segment !== '';
|
|
}));
|
|
if(sizeof($lpath_parts) > 1)
|
|
{
|
|
$last_seg = array_pop($lpath_parts);
|
|
$parent_file = $base_dir.'/'.implode('/', $lpath_parts).'/index.php';
|
|
if(file_exists($parent_file))
|
|
return array('file' => $parent_file, 'param' => $last_seg);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
static function Link($path, $params = false)
|
|
{
|
|
$path = ltrim((string)$path, '?');
|
|
$query = $params !== false ? http_build_query($params) : '';
|
|
if(cfg('url/pretty'))
|
|
{
|
|
return($GLOBALS['config']['url']['root'].$path.($query !== '' ? '?'.$query : ''));
|
|
}
|
|
else
|
|
{
|
|
if($path === '')
|
|
return($GLOBALS['config']['url']['root'].($query !== '' ? '?'.$query : ''));
|
|
return($GLOBALS['config']['url']['root'].'?'.$path.($query !== '' ? '&'.$query : ''));
|
|
}
|
|
}
|
|
|
|
# redirect to URL and quit
|
|
static function Redirect($url = '', $params = array())
|
|
{
|
|
header('location: '.self::Link($url, $params));
|
|
die();
|
|
}
|
|
|
|
|
|
}
|