/qeephp/library/core/context.php
PHP | 1395 lines | 694 code | 79 blank | 622 comment | 75 complexity | 882684c911cca8b709611ad6c51d69fe MD5 | raw file
Possible License(s): BSD-3-Clause
- <?php
- // $Id: context.php 2421 2009-04-14 08:59:23Z jerry $
- /**
- * ?? QContext ?
- *
- * @link http://qeephp.com/
- * @copyright Copyright (c) 2006-2009 Qeeyuan Inc. {@link http://www.qeeyuan.com}
- * @license New BSD License {@link http://qeephp.com/license/}
- * @version $Id: context.php 2421 2009-04-14 08:59:23Z jerry $
- * @package core
- */
- /**
- * QContext ?????????
- *
- * ?????????? QeePHP ????????????
- * QContext ????????????????? URL ??????
- *
- * QContext ???????????????? QContext::instance() ???
- * QContext ????????
- *
- * QContext ??? ArrayAccess ?????? QContext ???????????
- *
- * @code php
- * if (isset($context['title']))
- * {
- * echo $context['title'];
- * }
- * @endcode
- *
- * @author YuLei Liao <liaoyulei@qeeyuan.com>
- * @version $Id: context.php 2421 2009-04-14 08:59:23Z jerry $
- * @package core
- */
- class QContext implements ArrayAccess
- {
- /**
- * ?? UDI ????
- */
- // UDI ??????
- const UDI_ALL = 'all';
- // UDI ?????
- const UDI_CONTROLLER = 'controller';
- // UDI ????
- const UDI_ACTION = 'action';
- // UDI ??????
- const UDI_NAMESPACE = 'namespace';
- // UDI ????
- const UDI_MODULE = 'module';
- /**
- * ?? UDI ????
- */
- // ?????
- const UDI_DEFAULT_CONTROLLER = 'default';
- // ????
- const UDI_DEFAULT_ACTION = 'index';
- // ?????
- const UDI_DEFAULT_MODULE = 'default';
- // ???????
- const UDI_DEFAULT_NAMESPACE = 'default';
- /**
- * ?? URL ??
- */
- // ?? URL ??
- const URL_MODE_STANDARD = 'standard';
- // ?? PATHINFO
- const URL_MODE_PATHINFO = 'pathinfo';
- // ?? URL ??
- const URL_MODE_REWRITE = 'rewrite';
- /**
- * ????????
- *
- * ???????$module_name ???? public ?????
- * ???????? changeRequestUDI() ????? $module_name ????
- *
- * @var string
- */
- public $module_name;
- /**
- * ?????????
- *
- * @var string
- */
- public $namespace;
- /**
- * ??????????
- *
- * @var string
- */
- public $controller_name;
- /**
- * ????????
- *
- * @var string
- */
- public $action_name;
- /**
- * ?????
- *
- * @var array
- */
- private $_params = array();
- /**
- * ????
- *
- * @var QRouter
- */
- private $_router;
- /**
- * ???? URL
- *
- * @var string
- */
- static private $_request_uri;
- /**
- * ???? URL ??????????
- *
- * @var string
- */
- static private $_base_uri;
- /**
- * ???? URL ?????
- *
- * @var string
- */
- static private $_base_dir;
- /**
- * ????
- *
- * @var string
- */
- static private $_url_mode;
- /**
- * UDI ????
- */
- private static $_udi_defaults = array(
- self::UDI_MODULE => self::UDI_DEFAULT_MODULE,
- self::UDI_NAMESPACE => self::UDI_DEFAULT_NAMESPACE,
- self::UDI_CONTROLLER => self::UDI_DEFAULT_CONTROLLER,
- self::UDI_ACTION => self::UDI_DEFAULT_ACTION,
- );
- /**
- * ????
- */
- private function __construct()
- {
- $this->reinit();
- }
- /**
- * ??????????????? QContext ??
- *
- * @param boolean $full_init ??????????
- */
- function reinit($full_init = false)
- {
- if ($full_init)
- {
- $this->_params = array();
- $this->_router = null;
- }
- self::$_request_uri = null;
- self::$_base_uri = null;
- self::$_base_dir = null;
- self::$_url_mode = null;
- // ?????????????
- $url_mode = strtolower(Q::ini('dispatcher_url_mode'));
- if (is_null($this->_router)
- && ($url_mode == self::URL_MODE_PATHINFO || $url_mode == self::URL_MODE_REWRITE))
- {
- $this->_router = new QRouter();
- $this->_router->import(Q::ini('routes'), 'global_default_routes');
- $result = $this->_router->match('/' . ltrim($this->pathinfo(), '/'));
- if ($result)
- {
- foreach ($result as $var => $value)
- {
- if (empty($value) && $value !== '0') continue;
- if (empty($_GET[$var]))
- {
- $_GET[$var] = $_REQUEST[$var] = $value;
- }
- }
- }
- }
- self::$_url_mode = $url_mode;
- // ? $_GET ???????
- $keys = array_keys($_GET);
- if (!empty($keys))
- {
- $keys = array_combine($keys, $keys);
- $keys = array_change_key_case($keys);
- }
- $udi = array();
- $udi[self::UDI_CONTROLLER] = (isset($keys[self::UDI_CONTROLLER]))
- ? $_GET[$keys[self::UDI_CONTROLLER]] : null;
- $udi[self::UDI_ACTION] = (isset($keys[self::UDI_ACTION]))
- ? $_GET[$keys[self::UDI_ACTION]] : null;
- $udi[self::UDI_MODULE] = (isset($keys[self::UDI_MODULE]))
- ? $_GET[$keys[self::UDI_MODULE]] : null;
- $udi[self::UDI_NAMESPACE] = (isset($keys[self::UDI_NAMESPACE]))
- ? $_GET[$keys[self::UDI_NAMESPACE]] : null;
- $this->changeRequestUDI($udi);
- }
- /**
- * ?? QContext ???????
- *
- * @code php
- * $context = QContext::instance();
- * @endcode
- *
- * @return QContext QContext ???????
- */
- static function instance()
- {
- static $instance;
- if (is_null($instance)) $instance = new QContext();
- return $instance;
- }
- /**
- * ???????????
- *
- * __get() ??????????? $context->parameter ??????????
- * ?????????????? null?
- *
- * @code php
- * $title = $context->title;
- * @endcode
- *
- * ?????????? $_GET?$_POST ? QContext ???????
- *
- * @param string $parameter ????????
- *
- * @return mixed ???
- */
- function __get($parameter)
- {
- return $this->query($parameter);
- }
- /**
- * ???????????
- *
- * ? __get() ???????__set() ???? QContext ???????
- * ??? $_GET ? $_POST ?????????? __set() ??????
- * ???? QContext::param() ??????
- *
- * @code php
- * $context->title = $title;
- * echo $context->param('title');
- * @endcode
- *
- * @param string $parameter ????????
- * @param mixed $value ???
- */
- function __set($parameter, $value)
- {
- $this->changeParam($parameter, $value);
- }
- /**
- * ????????????????
- *
- * @param string $parameter ??????
- *
- * @return boolean ????????
- */
- function __isset($parameter)
- {
- return $this->offsetExists($parameter);
- }
- /**
- * ?????????
- *
- * __unset() ??????? QContext ????????
- *
- * @code php
- * unset($context['title']);
- * // ???? title ??????? null
- * echo $context->param('title');
- * @endcode
- *
- * @param string $parameter ??????
- */
- function __unset($parameter)
- {
- unset($this->_params[$parameter]);
- }
- /**
- * ?????????????? ArrayAccess ??
- *
- * @code php
- * echo isset($context['title']);
- * @endcode
- *
- * @param string $parameter ??????
- *
- * @return boolean ??????
- */
- function offsetExists($parameter)
- {
- if (isset($_GET[$parameter]))
- return true;
- elseif (isset($_POST[$parameter]))
- return true;
- else
- return isset($this->_params[$parameter]);
- }
- /**
- * ????????? ArrayAccess ??
- *
- * ?????? __set() ?????
- *
- * @code php
- * $context['title'] = $title;
- * echo $context->param('title');
- * @endcode
- *
- * @param string $parameter ??????
- * @param mixed $value ???
- */
- function offsetSet($parameter, $value)
- {
- $this->changeParam($parameter, $value);
- }
- /**
- * ????????? ArrayAccess ??
- *
- * @code php
- * $title = $context['title'];
- * @endcode
- *
- * @param string $parameter ????????
- *
- * @return mixed ???
- */
- function offsetGet($parameter)
- {
- return $this->query($parameter);
- }
- /**
- * ????????? ArrayAccess ??
- *
- * ? __unset() ???QContext::offsetUnset() ??? QContext ????????
- *
- * @code php
- * unset($context['title']);
- * @endcode
- *
- * @param string $parameter ????????
- */
- function offsetUnset($parameter)
- {
- unset($this->_params[$parameter]);
- }
- /**
- * ???????????
- *
- * QContext::get() ????????? $context->parameter ??????????
- * ?????????????? $default ?????????
- *
- * @code php
- * $title = $context->query('title', 'default title');
- * @endcode
- *
- * ?????????? $_GET?$_POST ? QContext ???????
- *
- * @param string $parameter ????????
- * @param mixed $default ?????????????
- *
- * @return mixed ???
- */
- function query($parameter, $default = null)
- {
- if (isset($_GET[$parameter]))
- return $_GET[$parameter];
- elseif (isset($_POST[$parameter]))
- return $_POST[$parameter];
- elseif (isset($this->_params[$parameter]))
- return $this->_params[$parameter];
- else
- return $default;
- }
- /**
- * ?? GET ??
- *
- * ? $_GET ?????????????????? $default ???????
- *
- * @code php
- * $title = $context->get('title', 'default title');
- * @endcode
- *
- * ?? $parameter ??? null?????? $_GET ????
- *
- * @param string $parameter ???????
- * @param mixed $default ?????????????
- *
- * @return mixed ???
- */
- function get($parameter = null, $default = null)
- {
- if (is_null($parameter))
- return $_GET;
- return isset($_GET[$parameter]) ? $_GET[$parameter] : $default;
- }
- /**
- * ?? POST ??
- *
- * ? $_POST ?????????????????? $default ???????
- *
- * @code php
- * $body = $context->post('body', 'default body');
- * @endcode
- *
- * ?? $parameter ??? null?????? $_POST ????
- *
- * @param string $parameter ???????
- * @param mixed $default ?????????????
- *
- * @return mixed ???
- */
- function post($parameter = null, $default = null)
- {
- if (is_null($parameter))
- return $_POST;
- return isset($_POST[$parameter]) ? $_POST[$parameter] : $default;
- }
- /**
- * ?? Cookie ??
- *
- * ? $_COOKIE ?????????????????? $default ???????
- *
- * @code php
- * $auto_login = $context->cookie('auto_login');
- * @endcode
- *
- * ?? $parameter ??? null?????? $_COOKIE ????
- *
- * @param string $parameter ???????
- * @param mixed $default ?????????????
- *
- * @return mixed ???
- */
- function cookie($parameter = null, $default = null)
- {
- if (is_null($parameter))
- return $_COOKIE;
- return isset($_COOKIE[$parameter]) ? $_COOKIE[$parameter] : $default;
- }
- /**
- * ? $_SERVER ???????????
- *
- * ?????????? $default ???????
- *
- * @code php
- * $request_time = $context->server('REQUEST_TIME');
- * @endcode
- *
- * ?? $parameter ??? null?????? $_SERVER ????
- *
- * @param string $parameter ???????
- * @param mixed $default ?????????????
- *
- * @return mixed ???
- */
- function server($parameter = null, $default = null)
- {
- if (is_null($parameter))
- return $_SERVER;
- return isset($_SERVER[$parameter]) ? $_SERVER[$parameter] : $default;
- }
- /**
- * ? $_ENV ???????????
- *
- * ?????????? $default ???????
- *
- * @code php
- * $os_type = $context->env('OS', 'non-win');
- * @endcode
- *
- * ?? $parameter ??? null?????? $_ENV ????
- *
- * @param string $parameter ???????
- * @param mixed $default ?????????????
- *
- * @return mixed ???
- */
- function env($parameter = null, $default = null)
- {
- if (is_null($parameter))
- return $_ENV;
- return isset($_ENV[$parameter]) ? $_ENV[$parameter] : $default;
- }
- /**
- * ?? QContext ???????
- *
- * @code php
- * $context->changeParam('arg', $value);
- * @endcode
- *
- * @param string $parameter ???????
- * @param mixed $value ???
- *
- * @return QContext ?? QContext ???????????
- */
- function changeParam($parameter, $value)
- {
- $this->_params[$parameter] = $value;
- }
- /**
- * ?? QContext ???????
- *
- * ?????????? $default ???????
- *
- * @code php
- * $value = $context->param('arg', 'default value');
- * @endcode
- *
- * ?? $parameter ??? null??????????????
- *
- * @param string $parameter ???????
- * @param mixed $default ?????????????
- *
- * @return mixed ???
- */
- function param($parameter, $default = null)
- {
- if (is_null($parameter))
- return $this->_params;
- return isset($this->_params[$parameter]) ? $this->_params[$parameter] : $default;
- }
- /**
- * ?????????
- *
- */
- function params()
- {
- return $this->_params;
- }
- /**
- * ???????????
- *
- * ??????????????????? HTTP?
- *
- * @code php
- * $protocol = $context->protocol();
- * echo $protocol;
- * @endcode
- *
- * @return string ?????????
- */
- function protocol()
- {
- static $protocol;
- if (is_null($protocol))
- {
- list ($protocol) = explode('/', $_SERVER['SERVER_PROTOCOL']);
- }
- return strtolower($protocol);
- }
- /**
- * ?? REQUEST_URI
- *
- * ???????? $_SERVER ???????? QContext::requestUri() ??????
- * ????? QContext::baseUri() ? QContext::baseDir() ??????
- *
- * @param string $request_uri ?? REQUEST_URI ?
- *
- * @return QContext ?? QContext ???????????
- */
- function changeRequestUri($request_uri)
- {
- self::$_request_uri = $request_uri;
- self::$_base_uri = self::$_base_dir = null;
- return $this;
- }
- /**
- * ??????? URL
- *
- * ?????
- *
- * <ul>
- * <li>?? http://www.example.com/index.php?controller=posts&action=create</li>
- * <li>?? /index.php?controller=posts&action=create</li>
- * </ul>
- * <ul>
- * <li>?? http://www.example.com/news/index.php?controller=posts&action=create</li>
- * <li>?? /news/index.php?controller=posts&action=create</li>
- * </ul>
- * <ul>
- * <li>?? http://www.example.com/index.php/posts/create</li>
- * <li>?? /index.php/posts/create</li>
- * </ul>
- * <ul>
- * <li>?? http://www.example.com/news/show/id/1</li>
- * <li>?? /news/show/id/1</li>
- * </ul>
- *
- * ????? Zend Framework ???
- *
- * @return string ????? URL
- */
- function requestUri()
- {
- if (self::$_request_uri) return self::$_request_uri;
- if (isset($_SERVER['HTTP_X_REWRITE_URL']))
- {
- $uri = $_SERVER['HTTP_X_REWRITE_URL'];
- }
- elseif (isset($_SERVER['REQUEST_URI']))
- {
- $uri = $_SERVER['REQUEST_URI'];
- }
- elseif (isset($_SERVER['ORIG_PATH_INFO']))
- {
- $uri = $_SERVER['ORIG_PATH_INFO'];
- if (! empty($_SERVER['QUERY_STRING']))
- {
- $uri .= '?' . $_SERVER['QUERY_STRING'];
- }
- }
- else
- {
- $uri = '';
- }
- self::$_request_uri = $uri;
- return $uri;
- }
- /**
- * ???????????? URI?????????
- *
- * ?????
- *
- * <ul>
- * <li>?? http://www.example.com/index.php?controller=posts&action=create</li>
- * <li>?? /index.php</li>
- * </ul>
- * <ul>
- * <li>?? http://www.example.com/news/index.php?controller=posts&action=create</li>
- * <li>?? /news/index.php</li>
- * </ul>
- * <ul>
- * <li>?? http://www.example.com/index.php/posts/create</li>
- * <li>?? /index.php</li>
- * </ul>
- * <ul>
- * <li>?? http://www.example.com/news/show/id/1</li>
- * <li>?? /news/show/id/1</li>
- * <li>????? URL ????? index.php ?????</li>
- * </ul>
- *
- * ????? Zend Framework ???
- *
- * @return string ?? URL ???????????
- */
- function baseUri()
- {
- if (self::$_base_uri) return self::$_base_uri;
- $filename = basename($_SERVER['SCRIPT_FILENAME']);
- if (basename($_SERVER['SCRIPT_NAME']) === $filename)
- {
- $url = $_SERVER['SCRIPT_NAME'];
- }
- elseif (basename($_SERVER['PHP_SELF']) === $filename)
- {
- $url = $_SERVER['PHP_SELF'];
- }
- elseif (isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME']) === $filename)
- {
- $url = $_SERVER['ORIG_SCRIPT_NAME']; // 1and1 shared hosting compatibility
- }
- else
- {
- // Backtrack up the script_filename to find the portion matching
- // php_self
- $path = $_SERVER['PHP_SELF'];
- $segs = explode('/', trim($_SERVER['SCRIPT_FILENAME'], '/'));
- $segs = array_reverse($segs);
- $index = 0;
- $last = count($segs);
- $url = '';
- do
- {
- $seg = $segs[$index];
- $url = '/' . $seg . $url;
- ++ $index;
- } while (($last > $index) && (false !== ($pos = strpos($path, $url))) && (0 != $pos));
- }
- // Does the baseUrl have anything in common with the request_uri?
- $request_uri = $this->requestUri();
- if (0 === strpos($request_uri, $url))
- {
- // full $url matches
- self::$_base_uri = $url;
- return self::$_base_uri;
- }
- if (0 === strpos($request_uri, dirname($url)))
- {
- // directory portion of $url matches
- self::$_base_uri = rtrim(dirname($url), '/') . '/';
- return self::$_base_uri;
- }
- if (! strpos($request_uri, basename($url)))
- {
- // no match whatsoever; set it blank
- return '';
- }
- // If using mod_rewrite or ISAPI_Rewrite strip the script filename
- // out of baseUrl. $pos !== 0 makes sure it is not matching a value
- // from PATH_INFO or QUERY_STRING
- if ((strlen($request_uri) >= strlen($url))
- && ((false !== ($pos = strpos($request_uri, $url)))
- && ($pos !== 0)))
- {
- $url = substr($request_uri, 0, $pos + strlen($url));
- }
- self::$_base_uri = rtrim($url, '/') . '/';
- return self::$_base_uri;
- }
- /**
- * ???? URL ???????????????
- *
- * ?????
- *
- * <ul>
- * <li>?? http://www.example.com/index.php?controller=posts&action=create</li>
- * <li>?? /</li>
- * </ul>
- * <ul>
- * <li>?? http://www.example.com/news/index.php?controller=posts&action=create</li>
- * <li>?? /news/</li>
- * </ul>
- * <ul>
- * <li>?? http://www.example.com/index.php/posts/create</li>
- * <li>?? /</li>
- * </ul>
- * <ul>
- * <li>?? http://www.example.com/news/show/id/1</li>
- * <li>?? /</li>
- * </ul>
- *
- * @return string ?? URL ??????
- */
- function baseDir()
- {
- if (self::$_base_dir) return self::$_base_dir;
- $base_uri = $this->baseUri();
- if (substr($base_uri, - 1, 1) == '/')
- {
- $base_dir = $base_uri;
- }
- else
- {
- $base_dir = dirname($base_uri);
- }
- self::$_base_dir = rtrim($base_dir, '/\\') . '/';
- return self::$_base_dir;
- }
- /**
- * ??????????????
- *
- * ??????? 80 ???????????????????????????
- *
- * @return string ????????????
- */
- function serverPort()
- {
- static $server_port = null;
- if ($server_port) return $server_port;
- if (isset($_SERVER['SERVER_PORT']))
- {
- $server_port = intval($_SERVER['SERVER_PORT']);
- }
- else
- {
- $server_port = 80;
- }
- if (isset($_SERVER['HTTP_HOST']))
- {
- $arr = explode(':', $_SERVER['HTTP_HOST']);
- $count = count($arr);
- if ($count > 1)
- {
- $port = intval($arr[$count - 1]);
- if ($port != $server_port)
- {
- $server_port = $port;
- }
- }
- }
- return $server_port;
- }
- /**
- * ????????????
- *
- * @return string ??????????
- */
- function scriptName()
- {
- return basename($_SERVER['SCRIPT_FILENAME']);
- }
- /**
- * ?? PATHINFO ??
- *
- * <ul>
- * <li>?? http://www.example.com/index.php?controller=posts&action=create</li>
- * <li>?? /</li>
- * </ul>
- * <ul>
- * <li>?? http://www.example.com/news/index.php?controller=posts&action=create</li>
- * <li>?? /</li>
- * </ul>
- * <ul>
- * <li>?? http://www.example.com/index.php/posts/create</li>
- * <li>?? /</li>
- * </ul>
- * <ul>
- * <li>?? http://www.example.com/news/show/id/1</li>
- * <li>?? /news/show/id/1</li>
- * <li>????? URL ????? index.php ?????</li>
- * </ul>
- *
- * ????? Zend Framework ???
- *
- * @return string
- */
- function pathinfo()
- {
- if (!empty($_SERVER['PATH_INFO'])) return $_SERVER['PATH_INFO'];
- $base_url = $this->baseUri();
- if (null === ($request_uri = $this->requestUri())) return '';
- // Remove the query string from REQUEST_URI
- if (($pos = strpos($request_uri, '?')))
- {
- $request_uri = substr($request_uri, 0, $pos);
- }
- if ((null !== $base_url) && (false === ($pathinfo = substr($request_uri, strlen($base_url)))))
- {
- // If substr() returns false then PATH_INFO is set to an empty string
- $pathinfo = '';
- }
- elseif (null === $base_url)
- {
- $pathinfo = $request_uri;
- }
- return $pathinfo;
- }
- /**
- * ?????????
- *
- * @return string
- */
- function requestMethod()
- {
- return $_SERVER['REQUEST_METHOD'];
- }
- /**
- * ??? GET ??
- *
- * @return boolean
- */
- function isGET()
- {
- return $this->requestMethod() == 'GET';
- }
- /**
- * ??? POST ??
- *
- * @return boolean
- */
- function isPOST()
- {
- return $this->requestMethod() == 'POST';
- }
- /**
- * ??? PUT ??
- *
- * @return boolean
- */
- function isPUT()
- {
- return $this->requestMethod() == 'PUT';
- }
- /**
- * ??? DELETE ??
- *
- * @return boolean
- */
- function isDELETE()
- {
- return $this->requestMethod() == 'DELETE';
- }
- /**
- * ??? HEAD ??
- *
- * @return boolean
- */
- function isHEAD()
- {
- return $this->requestMethod() == 'HEAD';
- }
- /**
- * ??? OPTIONS ??
- *
- * @return boolean
- */
- function isOPTIONS()
- {
- return $this->requestMethod() == 'OPTIONS';
- }
- /**
- * ?? HTTP ??????? XMLHttp ???
- *
- * @return boolean
- */
- function isAJAX()
- {
- return strtolower($this->header('X_REQUESTED_WITH')) == 'xmlhttprequest';
- }
- /**
- * ?? HTTP ??????? Flash ???
- *
- * @return boolean
- */
- function isFlash()
- {
- return strtolower($this->header('USER_AGENT')) == 'shockwave flash';
- }
- /**
- * ?????????
- *
- * @return string
- */
- function requestRawBody()
- {
- $body = file_get_contents('php://input');
- return (strlen(trim($body)) > 0) ? $body : false;
- }
- /**
- * ?? HTTP ????????????????????? false
- *
- * @param string $header ?????????
- *
- * @return string ???
- */
- function header($header)
- {
- $temp = 'HTTP_' . strtoupper(str_replace('-', '_', $header));
- if (!empty($_SERVER[$temp])) return $_SERVER[$temp];
- if (function_exists('apache_request_headers'))
- {
- $headers = apache_request_headers();
- if (!empty($headers[$header])) return $headers[$header];
- }
- return false;
- }
- /**
- * ????????? URL
- *
- * @return string ??????? URL
- */
- function referer()
- {
- return $this->header('REFERER');
- }
- /**
- * ?????????????
- *
- * ???????????? null?
- *
- * @return QRouter ???????????
- */
- function router()
- {
- return $this->_router;
- }
- /**
- * ?? url
- *
- * ???
- *
- * @code php
- * url(UDI, [??????], [???])
- * @endcode
- *
- * UDI ??????????Uniform Destination Identifier?????
- * UDI ????????????????????????????
- *
- * @code php
- * namespace::controller/action@module
- * @endcode
- *
- * UDI ????????????????
- * ??????????????????????????????index????
- * ??????????????????????????
- *
- * UDI ????????
- *
- * @code php
- * 'controller'
- * 'controller/action'
- * '/action'
- * 'controller@module'
- * 'controller/action@module'
- * 'namespace::controller'
- * 'namespace::controller/action'
- * 'namespace::controller@module'
- * 'namespace::controller/action@module'
- * '@module'
- * 'namespace::@module'
- * @endcode
- *
- * ???
- * @code php
- * url('admin::posts/edit', array('id' => $post->id()));
- * @endcode
- *
- * $params ??????????????/?????????
- *
- * @code php
- * url('posts/index', 'page/3');
- * url('users/show', 'id/5/profile/yes');
- * @endcode
- *
- * ??? PATHINFO ? URL ???????????????????? QeePHP
- * ???????????? URL????????????? URL ????
- * ???????????????????? URL ????
- *
- * $opts ?????????? URL????????
- *
- * - base_uri: ?? URL ???????????????????????????
- * - script: ?? URL ?????????
- * - mode: ?? URL ???????? standard?pathinfo ? rewrite
- *
- * @param string $udi UDI ???
- * @param array|string $params ??????
- * @param string $route_name ???
- * @param array $opts ?????? URL ???
- *
- * @return string ??? URL ??
- */
- function url($udi, $params = null, $route_name = null, array $opts = null)
- {
- static $base_uri;
- if (is_null($base_uri))
- {
- $base_uri = '/' . trim($this->baseDir(), '/');
- if ($base_uri != '/')
- {
- $base_uri .= '/';
- }
- }
- $udi = $this->normalizeUDI($udi);
- if (!is_array($params))
- {
- $arr = Q::normalize($params, '/');
- $params = array();
- while ($key = array_shift($arr))
- {
- $value = array_shift($arr);
- $params[$key] = $value;
- }
- }
- // ?? $opts
- if (is_array($opts))
- {
- $mode = !empty($opts['mode']) ? $opts['mode'] : self::$_url_mode;
- $script = !empty($opts['script'])
- ? $opts['script']
- : $this->scriptName();
- $url = !empty($opts['base_uri'])
- ? rtrim($opts['base_uri'], '/') . '/'
- : $base_uri;
- }
- else
- {
- $mode = self::$_url_mode;
- $url = $base_uri;
- $script = $this->scriptName();
- }
- if (!is_null($this->_router) && $mode != self::URL_MODE_STANDARD)
- {
- // ?????? URL
- $params = array_merge($params, $udi);
- $path = $this->_router->url($params, $route_name);
- if (self::$_url_mode == self::URL_MODE_PATHINFO && $path != '/')
- {
- $url .= $this->scriptName();
- }
- else
- {
- $url = rtrim($url, '/');
- }
- $url .= $path;
- }
- else
- {
- foreach (self::$_udi_defaults as $key => $value)
- {
- if ($udi[$key] == $value) unset($udi[$key]);
- unset($params[$key]);
- }
- $params = array_filter(array_merge($udi, $params));
- $url .= $script;
- if (!empty($params))
- {
- $url .= '?' . http_build_query($params, '', '&');
- }
- }
- return $url;
- }
- /**
- * ?? UDI ????????
- *
- * @param array $udi ???? UDI
- *
- * @return string
- */
- function UDIString(array $udi)
- {
- return "{$udi[self::UDI_NAMESPACE]}::{$udi[self::UDI_CONTROLLER]}/{$udi[self::UDI_ACTION]}@{$udi[self::UDI_MODULE]}";
- }
- /**
- * ???????? UDI ??
- *
- * @code php
- * $udi = array(
- * QContext::UDI_CONTROLLER => '',
- * QContext::UDI_ACTION => '',
- * QContext::UDI_NAMESPACE => '',
- * QContext::UDI_MODULE => '',
- * );
- *
- * // ??
- * // array(
- * // controller: default
- * // action: index
- * // namespace: default
- * // module: default
- * // )
- * dump($context->normalizeUDI($udi));
- *
- * $udi = 'admin::posts/edit';
- * // ??
- * // array(
- * // controller: posts
- * // action: edit
- * // namespace: admin
- * // module: default
- * // )
- * dump($context->normalizeUDI($udi));
- * @endcode
- *
- * ??????????? UDI??? $return_array ??? false?
- *
- * @param string|array $udi ???? UDI
- * @param boolean $return_array ????????? UDI
- *
- * @return array ???? UDI
- */
- function normalizeUDI($udi, $return_array = true)
- {
- if (!is_array($udi))
- {
- // ???? ".", "/" UDI??
- // url('.') ??????
- // url('/') ???????+index
- if($udi === '.')
- {
- $namespace = $this->namespace;
- $module_name = $this->module_name;
- $controller = $this->controller;
- $action = $this->action;
- }
- elseif($udi === '/')
- {
- $namespace = $this->namespace;
- $module_name = $this->module_name;
- $controller = $this->controller;
- $action = self::$_udi_defaults[self::UDI_ACTION];
- }
- else
- {
- if (strpos($udi, '::') !== false)
- {
- $arr = explode('::', $udi);
- $namespace = array_shift($arr);
- $udi = array_shift($arr);
- }
- else
- {
- $namespace = $this->namespace;
- }
- if (strpos($udi, '@') !== false)
- {
- $arr = explode('@', $udi);
- $module_name = array_pop($arr);
- $udi = array_pop($arr);
- }
- else
- {
- $module_name = $this->module_name;
- }
- $arr = explode('/', $udi);
- $controller = array_shift($arr);
- $action = array_shift($arr);
- }
- $udi = array(
- self::UDI_MODULE => $module_name,
- self::UDI_NAMESPACE => $namespace,
- self::UDI_CONTROLLER => $controller,
- self::UDI_ACTION => $action,
- );
- }
- if (empty($udi[self::UDI_MODULE]))
- {
- $udi[self::UDI_MODULE] = $this->module_name;
- }
- if (empty($udi[self::UDI_NAMESPACE]))
- {
- $udi[self::UDI_NAMESPACE] = $this->namespace;
- }
- if (empty($udi[self::UDI_CONTROLLER]))
- {
- $udi[self::UDI_CONTROLLER] = $this->controller_name;
- }
- if (empty($udi[self::UDI_ACTION]) && $udi[self::UDI_ACTION] !== '0')
- {
- $udi[self::UDI_ACTION] = self::UDI_DEFAULT_ACTION;
- }
- foreach (self::$_udi_defaults as $key => $value)
- {
- if (empty($udi[$key]) && $udi[$key] !== '0')
- {
- $udi[$key] = $value;
- }
- else
- {
- $udi[$key] = preg_replace('/[^a-z0-9]+/', '', strtolower($udi[$key]));
- }
- }
- if (!$return_array)
- {
- return "{$udi[self::UDI_NAMESPACE]}::{$udi[self::UDI_CONTROLLER]}/{$udi[self::UDI_ACTION]}@{$udi[self::UDI_MODULE]}";
- }
- else
- {
- return $udi;
- }
- }
- /**
- * ????????? UDI
- *
- * ?????????????????????????????????? UDI?
- *
- * @code php
- * dump($context->requestUDI());
- * @endcode
- *
- * @param boolean $return_array ????????? UDI
- *
- * @return string|array ??????? UDI
- */
- function requestUDI($return_array = true)
- {
- return $this->normalizeUDI("/{$this->action_name}", $return_array);
- }
- /**
- * ? QContext ???????????? UDI ????
- *
- * @code php
- * $context->changeRequestUDI('posts/edit');
- * // ??? posts
- * echo $context->controller_name;
- * @endcode
- *
- * @param array|string $udi ???? UDI
- *
- * @return QContext ?? QContext ???????????
- */
- function changeRequestUDI($udi)
- {
- $udi = $this->normalizeUDI($udi);
-
- $this->controller_name = $udi[self::UDI_CONTROLLER];
- $this->action_name = $udi[self::UDI_ACTION];
- $this->module_name = $udi[self::UDI_MODULE];
- $this->namespace = $udi[self::UDI_NAMESPACE];
- if ($this->module_name == self::UDI_DEFAULT_MODULE)
- {
- $this->module_name = null;
- }
- if ($this->namespace == self::UDI_DEFAULT_NAMESPACE)
- {
- $this->namespace = null;
- }
- return $this;
- }
- }