summaryrefslogtreecommitdiff
path: root/framework/Web/TUrlMapping.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/Web/TUrlMapping.php')
-rw-r--r--framework/Web/TUrlMapping.php1768
1 files changed, 884 insertions, 884 deletions
diff --git a/framework/Web/TUrlMapping.php b/framework/Web/TUrlMapping.php
index 1cae4ee4..19891da1 100644
--- a/framework/Web/TUrlMapping.php
+++ b/framework/Web/TUrlMapping.php
@@ -1,434 +1,434 @@
-<?php
-/**
- * TUrlMapping, TUrlMappingPattern and TUrlMappingPatternSecureConnection class file.
- *
- * @author Wei Zhuo <weizhuo[at]gamil[dot]com>
- * @link http://www.pradosoft.com/
+<?php
+/**
+ * TUrlMapping, TUrlMappingPattern and TUrlMappingPatternSecureConnection class file.
+ *
+ * @author Wei Zhuo <weizhuo[at]gamil[dot]com>
+ * @link http://www.pradosoft.com/
* @copyright Copyright &copy; 2005-2012 PradoSoft
- * @license http://www.pradosoft.com/license/
- * @version $Id$
- * @package System.Web
- */
-
-Prado::using('System.Web.TUrlManager');
-Prado::using('System.Collections.TAttributeCollection');
-
-/**
- * TUrlMapping Class
- *
- * The TUrlMapping module allows PRADO to construct and recognize URLs
- * based on specific patterns.
- *
- * TUrlMapping consists of a list of URL patterns which are used to match
- * against the currently requested URL. The first matching pattern will then
- * be used to decompose the URL into request parameters (accessible through
- * <code>$this->Request['paramname']</code>).
- *
- * The patterns can also be used to construct customized URLs. In this case,
- * the parameters in an applied pattern will be replaced with the corresponding
- * GET variable values.
- *
- * Since it is derived from {@link TUrlManager}, it should be configured globally
- * in the application configuration like the following,
- * <code>
- * <module id="request" class="THttpRequest" UrlManager="friendly-url" />
- * <module id="friendly-url" class="System.Web.TUrlMapping" EnableCustomUrl="true">
- * <url ServiceParameter="Posts.ViewPost" pattern="post/{id}/" parameters.id="\d+" />
- * <url ServiceParameter="Posts.ListPost" pattern="archive/{time}/" parameters.time="\d{6}" />
- * <url ServiceParameter="Posts.ListPost" pattern="category/{cat}/" parameters.cat="\d+" />
- * </module>
- * </code>
- *
- * In the above, each <tt>&lt;url&gt;</tt> element specifies a URL pattern represented
- * as a {@link TUrlMappingPattern} internally. You may create your own pattern classes
- * by extending {@link TUrlMappingPattern} and specifying the <tt>&lt;class&gt;</tt> attribute
- * in the element.
- *
- * The patterns can be also be specified in an external file using the {@link setConfigFile ConfigFile} property.
- *
- * The URL mapping are evaluated in order, only the first mapping that matches
- * the URL will be used. Cascaded mapping can be achieved by placing the URL mappings
- * in particular order. For example, placing the most specific mappings first.
- *
- * Only the PATH_INFO part of the URL is used to match the available patterns. The matching
- * is strict in the sense that the whole pattern must match the whole PATH_INFO of the URL.
- *
- * From PRADO v3.1.1, TUrlMapping also provides support for constructing URLs according to
- * the specified pattern. You may enable this functionality by setting {@link setEnableCustomUrl EnableCustomUrl} to true.
- * When you call THttpRequest::constructUrl() (or via TPageService::constructUrl()),
- * TUrlMapping will examine the available URL mapping patterns using their {@link TUrlMappingPattern::getServiceParameter ServiceParameter}
- * and {@link TUrlMappingPattern::getPattern Pattern} properties. A pattern is applied if its
- * {@link TUrlMappingPattern::getServiceParameter ServiceParameter} matches the service parameter passed
- * to constructUrl() and every parameter in the {@link getPattern Pattern} is found
- * in the GET variables.
- *
- * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
- * @version $Id$
- * @package System.Web
- * @since 3.0.5
- */
-class TUrlMapping extends TUrlManager
-{
- /**
- * @var TUrlMappingPattern[] list of patterns.
- */
- protected $_patterns=array();
- /**
- * @var TUrlMappingPattern matched pattern.
- */
- private $_matched;
- /**
- * @var string external configuration file
- */
- private $_configFile=null;
- /**
- * @var boolean whether to enable custom contructUrl
- */
- private $_customUrl=false;
- /**
- * @var array rules for constructing URLs
- */
- protected $_constructRules=array();
-
- private $_urlPrefix='';
-
- private $_defaultMappingClass='TUrlMappingPattern';
-
- /**
- * Initializes this module.
- * This method is required by the IModule interface.
- * @param mixed configuration for this module, can be null
- * @throws TConfigurationException if module is configured in the global scope.
- */
- public function init($config)
- {
- parent::init($config);
- if($this->getRequest()->getRequestResolved())
- throw new TConfigurationException('urlmapping_global_required');
- if($this->_configFile!==null)
- $this->loadConfigFile();
- $this->loadUrlMappings($config);
- if($this->_urlPrefix==='')
- $this->_urlPrefix=$this->getRequest()->getApplicationUrl();
- $this->_urlPrefix=rtrim($this->_urlPrefix,'/');
- }
-
- /**
- * Initialize the module from configuration file.
- * @throws TConfigurationException if {@link getConfigFile ConfigFile} is invalid.
- */
- protected function loadConfigFile()
- {
- if(is_file($this->_configFile))
- {
- if($this->getApplication()->getConfigurationType()==TApplication::CONFIG_TYPE_PHP)
- {
- $config = include $this->_configFile;
- $this->loadUrlMappings($dom);
- }
- else
- {
- $dom=new TXmlDocument;
- $dom->loadFromFile($this->_configFile);
- $this->loadUrlMappings($dom);
- }
- }
- else
- throw new TConfigurationException('urlmapping_configfile_inexistent',$this->_configFile);
- }
-
- /**
- * Returns a value indicating whether to enable custom constructUrl.
- * If true, constructUrl() will make use of the URL mapping rules to
- * construct valid URLs.
- * @return boolean whether to enable custom constructUrl. Defaults to false.
- * @since 3.1.1
- */
- public function getEnableCustomUrl()
- {
- return $this->_customUrl;
- }
-
- /**
- * Sets a value indicating whether to enable custom constructUrl.
- * If true, constructUrl() will make use of the URL mapping rules to
- * construct valid URLs.
- * @param boolean whether to enable custom constructUrl.
- * @since 3.1.1
- */
- public function setEnableCustomUrl($value)
- {
- $this->_customUrl=TPropertyValue::ensureBoolean($value);
- }
-
- /**
- * @return string the part that will be prefixed to the constructed URLs. Defaults to the requested script path (e.g. /path/to/index.php for a URL http://hostname/path/to/index.php)
- * @since 3.1.1
- */
- public function getUrlPrefix()
- {
- return $this->_urlPrefix;
- }
-
- /**
- * @param string the part that will be prefixed to the constructed URLs. This is used by constructUrl() when EnableCustomUrl is set true.
- * @see getUrlPrefix
- * @since 3.1.1
- */
- public function setUrlPrefix($value)
- {
- $this->_urlPrefix=$value;
- }
-
- /**
- * @return string external configuration file. Defaults to null.
- */
- public function getConfigFile()
- {
- return $this->_configFile;
- }
-
- /**
- * @param string external configuration file in namespace format. The file
- * must be suffixed with '.xml'.
- * @throws TInvalidDataValueException if the file is invalid.
- */
- public function setConfigFile($value)
- {
- if(($this->_configFile=Prado::getPathOfNamespace($value,$this->getApplication()->getConfigurationFileExt()))===null)
- throw new TConfigurationException('urlmapping_configfile_invalid',$value);
- }
-
- /**
- * @return string the default class of URL mapping patterns. Defaults to TUrlMappingPattern.
- * @since 3.1.1
- */
- public function getDefaultMappingClass()
- {
- return $this->_defaultMappingClass;
- }
-
- /**
- * Sets the default class of URL mapping patterns.
- * When a URL matching pattern does not specify "class" attribute, it will default to the class
- * specified by this property. You may use either a class name or a namespace format of class (if the class needs to be included first.)
- * @param string the default class of URL mapping patterns.
- * @since 3.1.1
- */
- public function setDefaultMappingClass($value)
- {
- $this->_defaultMappingClass=$value;
- }
-
- /**
- * Load and configure each url mapping pattern.
- * @param mixed configuration node
- * @throws TConfigurationException if specific pattern class is invalid
- */
- protected function loadUrlMappings($config)
- {
- $defaultClass = $this->getDefaultMappingClass();
-
- if(is_array($config))
- {
- if(isset($config['urls']) && is_array($config['urls']))
- {
- foreach($config['urls'] as $url)
- {
- $class=null;
- if(!isset($url['class']))
- $class=$defaultClass;
- $pattern=Prado::createComponent($class,$this);
- $properties = isset($url['properties'])?$url['properties']:array();
- $this->buildUrlMapping($class,$pattern,$properties,$url);
- }
- }
- }
- else
- {
- foreach($config->getElementsByTagName('url') as $url)
- {
- $properties=$url->getAttributes();
- if(($class=$properties->remove('class'))===null)
- $class=$defaultClass;
- $pattern=Prado::createComponent($class,$this);
- $this->buildUrlMapping($class,$pattern,$properties,$url);
- }
- }
- }
-
- private function buildUrlMapping($class, $pattern, $properties, $url)
- {
- $pattern=Prado::createComponent($class,$this);
- if(!($pattern instanceof TUrlMappingPattern))
- throw new TConfigurationException('urlmapping_urlmappingpattern_required');
- foreach($properties as $name=>$value)
- $pattern->setSubproperty($name,$value);
-
- if($url instanceof TXmlElement) {
- $text = $url -> getValue();
- if($text) {
- $text = preg_replace('/(\s+)/S', '', $text);
- if(($regExp = $pattern->getRegularExpression()) !== '')
- trigger_error(sPrintF('%s.RegularExpression property value "%s" for ServiceID="%s" and ServiceParameter="%s" was replaced by node value "%s"',
- get_class($pattern),
- $regExp,
- $pattern->getServiceID(),
- $pattern->getServiceParameter(),
- $text),
- E_USER_NOTICE);
- $pattern->setRegularExpression($text);
- }
- }
-
- $this->_patterns[]=$pattern;
- $pattern->init($url);
-
- $key=$pattern->getServiceID().':'.$pattern->getServiceParameter();
- $this->_constructRules[$key][]=$pattern;
- }
-
- /**
- * Parses the request URL and returns an array of input parameters.
- * This method overrides the parent implementation.
- * The input parameters do not include GET and POST variables.
- * This method uses the request URL path to find the first matching pattern. If found
- * the matched pattern parameters are used to return as the input parameters.
- * @return array list of input parameters
- */
- public function parseUrl()
- {
- $request=$this->getRequest();
- foreach($this->_patterns as $pattern)
- {
- $matches=$pattern->getPatternMatches($request);
- if(count($matches)>0)
- {
- $this->_matched=$pattern;
- $params=array();
- foreach($matches as $key=>$value)
- {
- if(is_string($key))
- $params[$key]=$value;
- }
- if (!$pattern->getIsWildCardPattern())
- $params[$pattern->getServiceID()]=$pattern->getServiceParameter();
- return $params;
- }
- }
- return parent::parseUrl();
- }
-
- /**
- * 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...
- * @param string service ID
- * @param string service parameter
- * @param array GET parameters, null if not provided
- * @param boolean whether to encode the ampersand in URL
- * @param boolean whether to encode the GET parameters (their names and values)
- * @return string URL
- * @see parseUrl
- * @since 3.1.1
- */
- public function constructUrl($serviceID,$serviceParam,$getItems,$encodeAmpersand,$encodeGetItems)
- {
- if($this->_customUrl)
- {
- if(!(is_array($getItems) || ($getItems instanceof Traversable)))
- $getItems=array();
- $key=$serviceID.':'.$serviceParam;
+ * @license http://www.pradosoft.com/license/
+ * @version $Id$
+ * @package System.Web
+ */
+
+Prado::using('System.Web.TUrlManager');
+Prado::using('System.Collections.TAttributeCollection');
+
+/**
+ * TUrlMapping Class
+ *
+ * The TUrlMapping module allows PRADO to construct and recognize URLs
+ * based on specific patterns.
+ *
+ * TUrlMapping consists of a list of URL patterns which are used to match
+ * against the currently requested URL. The first matching pattern will then
+ * be used to decompose the URL into request parameters (accessible through
+ * <code>$this->Request['paramname']</code>).
+ *
+ * The patterns can also be used to construct customized URLs. In this case,
+ * the parameters in an applied pattern will be replaced with the corresponding
+ * GET variable values.
+ *
+ * Since it is derived from {@link TUrlManager}, it should be configured globally
+ * in the application configuration like the following,
+ * <code>
+ * <module id="request" class="THttpRequest" UrlManager="friendly-url" />
+ * <module id="friendly-url" class="System.Web.TUrlMapping" EnableCustomUrl="true">
+ * <url ServiceParameter="Posts.ViewPost" pattern="post/{id}/" parameters.id="\d+" />
+ * <url ServiceParameter="Posts.ListPost" pattern="archive/{time}/" parameters.time="\d{6}" />
+ * <url ServiceParameter="Posts.ListPost" pattern="category/{cat}/" parameters.cat="\d+" />
+ * </module>
+ * </code>
+ *
+ * In the above, each <tt>&lt;url&gt;</tt> element specifies a URL pattern represented
+ * as a {@link TUrlMappingPattern} internally. You may create your own pattern classes
+ * by extending {@link TUrlMappingPattern} and specifying the <tt>&lt;class&gt;</tt> attribute
+ * in the element.
+ *
+ * The patterns can be also be specified in an external file using the {@link setConfigFile ConfigFile} property.
+ *
+ * The URL mapping are evaluated in order, only the first mapping that matches
+ * the URL will be used. Cascaded mapping can be achieved by placing the URL mappings
+ * in particular order. For example, placing the most specific mappings first.
+ *
+ * Only the PATH_INFO part of the URL is used to match the available patterns. The matching
+ * is strict in the sense that the whole pattern must match the whole PATH_INFO of the URL.
+ *
+ * From PRADO v3.1.1, TUrlMapping also provides support for constructing URLs according to
+ * the specified pattern. You may enable this functionality by setting {@link setEnableCustomUrl EnableCustomUrl} to true.
+ * When you call THttpRequest::constructUrl() (or via TPageService::constructUrl()),
+ * TUrlMapping will examine the available URL mapping patterns using their {@link TUrlMappingPattern::getServiceParameter ServiceParameter}
+ * and {@link TUrlMappingPattern::getPattern Pattern} properties. A pattern is applied if its
+ * {@link TUrlMappingPattern::getServiceParameter ServiceParameter} matches the service parameter passed
+ * to constructUrl() and every parameter in the {@link getPattern Pattern} is found
+ * in the GET variables.
+ *
+ * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version $Id$
+ * @package System.Web
+ * @since 3.0.5
+ */
+class TUrlMapping extends TUrlManager
+{
+ /**
+ * @var TUrlMappingPattern[] list of patterns.
+ */
+ protected $_patterns=array();
+ /**
+ * @var TUrlMappingPattern matched pattern.
+ */
+ private $_matched;
+ /**
+ * @var string external configuration file
+ */
+ private $_configFile=null;
+ /**
+ * @var boolean whether to enable custom contructUrl
+ */
+ private $_customUrl=false;
+ /**
+ * @var array rules for constructing URLs
+ */
+ protected $_constructRules=array();
+
+ private $_urlPrefix='';
+
+ private $_defaultMappingClass='TUrlMappingPattern';
+
+ /**
+ * Initializes this module.
+ * This method is required by the IModule interface.
+ * @param mixed configuration for this module, can be null
+ * @throws TConfigurationException if module is configured in the global scope.
+ */
+ public function init($config)
+ {
+ parent::init($config);
+ if($this->getRequest()->getRequestResolved())
+ throw new TConfigurationException('urlmapping_global_required');
+ if($this->_configFile!==null)
+ $this->loadConfigFile();
+ $this->loadUrlMappings($config);
+ if($this->_urlPrefix==='')
+ $this->_urlPrefix=$this->getRequest()->getApplicationUrl();
+ $this->_urlPrefix=rtrim($this->_urlPrefix,'/');
+ }
+
+ /**
+ * Initialize the module from configuration file.
+ * @throws TConfigurationException if {@link getConfigFile ConfigFile} is invalid.
+ */
+ protected function loadConfigFile()
+ {
+ if(is_file($this->_configFile))
+ {
+ if($this->getApplication()->getConfigurationType()==TApplication::CONFIG_TYPE_PHP)
+ {
+ $config = include $this->_configFile;
+ $this->loadUrlMappings($dom);
+ }
+ else
+ {
+ $dom=new TXmlDocument;
+ $dom->loadFromFile($this->_configFile);
+ $this->loadUrlMappings($dom);
+ }
+ }
+ else
+ throw new TConfigurationException('urlmapping_configfile_inexistent',$this->_configFile);
+ }
+
+ /**
+ * Returns a value indicating whether to enable custom constructUrl.
+ * If true, constructUrl() will make use of the URL mapping rules to
+ * construct valid URLs.
+ * @return boolean whether to enable custom constructUrl. Defaults to false.
+ * @since 3.1.1
+ */
+ public function getEnableCustomUrl()
+ {
+ return $this->_customUrl;
+ }
+
+ /**
+ * Sets a value indicating whether to enable custom constructUrl.
+ * If true, constructUrl() will make use of the URL mapping rules to
+ * construct valid URLs.
+ * @param boolean whether to enable custom constructUrl.
+ * @since 3.1.1
+ */
+ public function setEnableCustomUrl($value)
+ {
+ $this->_customUrl=TPropertyValue::ensureBoolean($value);
+ }
+
+ /**
+ * @return string the part that will be prefixed to the constructed URLs. Defaults to the requested script path (e.g. /path/to/index.php for a URL http://hostname/path/to/index.php)
+ * @since 3.1.1
+ */
+ public function getUrlPrefix()
+ {
+ return $this->_urlPrefix;
+ }
+
+ /**
+ * @param string the part that will be prefixed to the constructed URLs. This is used by constructUrl() when EnableCustomUrl is set true.
+ * @see getUrlPrefix
+ * @since 3.1.1
+ */
+ public function setUrlPrefix($value)
+ {
+ $this->_urlPrefix=$value;
+ }
+
+ /**
+ * @return string external configuration file. Defaults to null.
+ */
+ public function getConfigFile()
+ {
+ return $this->_configFile;
+ }
+
+ /**
+ * @param string external configuration file in namespace format. The file
+ * must be suffixed with '.xml'.
+ * @throws TInvalidDataValueException if the file is invalid.
+ */
+ public function setConfigFile($value)
+ {
+ if(($this->_configFile=Prado::getPathOfNamespace($value,$this->getApplication()->getConfigurationFileExt()))===null)
+ throw new TConfigurationException('urlmapping_configfile_invalid',$value);
+ }
+
+ /**
+ * @return string the default class of URL mapping patterns. Defaults to TUrlMappingPattern.
+ * @since 3.1.1
+ */
+ public function getDefaultMappingClass()
+ {
+ return $this->_defaultMappingClass;
+ }
+
+ /**
+ * Sets the default class of URL mapping patterns.
+ * When a URL matching pattern does not specify "class" attribute, it will default to the class
+ * specified by this property. You may use either a class name or a namespace format of class (if the class needs to be included first.)
+ * @param string the default class of URL mapping patterns.
+ * @since 3.1.1
+ */
+ public function setDefaultMappingClass($value)
+ {
+ $this->_defaultMappingClass=$value;
+ }
+
+ /**
+ * Load and configure each url mapping pattern.
+ * @param mixed configuration node
+ * @throws TConfigurationException if specific pattern class is invalid
+ */
+ protected function loadUrlMappings($config)
+ {
+ $defaultClass = $this->getDefaultMappingClass();
+
+ if(is_array($config))
+ {
+ if(isset($config['urls']) && is_array($config['urls']))
+ {
+ foreach($config['urls'] as $url)
+ {
+ $class=null;
+ if(!isset($url['class']))
+ $class=$defaultClass;
+ $pattern=Prado::createComponent($class,$this);
+ $properties = isset($url['properties'])?$url['properties']:array();
+ $this->buildUrlMapping($class,$pattern,$properties,$url);
+ }
+ }
+ }
+ else
+ {
+ foreach($config->getElementsByTagName('url') as $url)
+ {
+ $properties=$url->getAttributes();
+ if(($class=$properties->remove('class'))===null)
+ $class=$defaultClass;
+ $pattern=Prado::createComponent($class,$this);
+ $this->buildUrlMapping($class,$pattern,$properties,$url);
+ }
+ }
+ }
+
+ private function buildUrlMapping($class, $pattern, $properties, $url)
+ {
+ $pattern=Prado::createComponent($class,$this);
+ if(!($pattern instanceof TUrlMappingPattern))
+ throw new TConfigurationException('urlmapping_urlmappingpattern_required');
+ foreach($properties as $name=>$value)
+ $pattern->setSubproperty($name,$value);
+
+ if($url instanceof TXmlElement) {
+ $text = $url -> getValue();
+ if($text) {
+ $text = preg_replace('/(\s+)/S', '', $text);
+ if(($regExp = $pattern->getRegularExpression()) !== '')
+ trigger_error(sPrintF('%s.RegularExpression property value "%s" for ServiceID="%s" and ServiceParameter="%s" was replaced by node value "%s"',
+ get_class($pattern),
+ $regExp,
+ $pattern->getServiceID(),
+ $pattern->getServiceParameter(),
+ $text),
+ E_USER_NOTICE);
+ $pattern->setRegularExpression($text);
+ }
+ }
+
+ $this->_patterns[]=$pattern;
+ $pattern->init($url);
+
+ $key=$pattern->getServiceID().':'.$pattern->getServiceParameter();
+ $this->_constructRules[$key][]=$pattern;
+ }
+
+ /**
+ * Parses the request URL and returns an array of input parameters.
+ * This method overrides the parent implementation.
+ * The input parameters do not include GET and POST variables.
+ * This method uses the request URL path to find the first matching pattern. If found
+ * the matched pattern parameters are used to return as the input parameters.
+ * @return array list of input parameters
+ */
+ public function parseUrl()
+ {
+ $request=$this->getRequest();
+ foreach($this->_patterns as $pattern)
+ {
+ $matches=$pattern->getPatternMatches($request);
+ if(count($matches)>0)
+ {
+ $this->_matched=$pattern;
+ $params=array();
+ foreach($matches as $key=>$value)
+ {
+ if(is_string($key))
+ $params[$key]=$value;
+ }
+ if (!$pattern->getIsWildCardPattern())
+ $params[$pattern->getServiceID()]=$pattern->getServiceParameter();
+ return $params;
+ }
+ }
+ return parent::parseUrl();
+ }
+
+ /**
+ * 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...
+ * @param string service ID
+ * @param string service parameter
+ * @param array GET parameters, null if not provided
+ * @param boolean whether to encode the ampersand in URL
+ * @param boolean whether to encode the GET parameters (their names and values)
+ * @return string URL
+ * @see parseUrl
+ * @since 3.1.1
+ */
+ public function constructUrl($serviceID,$serviceParam,$getItems,$encodeAmpersand,$encodeGetItems)
+ {
+ if($this->_customUrl)
+ {
+ if(!(is_array($getItems) || ($getItems instanceof Traversable)))
+ $getItems=array();
+ $key=$serviceID.':'.$serviceParam;
$wildCardKey = ($pos=strrpos($serviceParam,'.'))!==false ?
$serviceID.':'.substr($serviceParam,0,$pos).'.*' : $serviceID.':*';
- if(isset($this->_constructRules[$key]))
- {
- foreach($this->_constructRules[$key] as $rule)
- {
- if($rule->supportCustomUrl($getItems))
- return $rule->constructUrl($getItems,$encodeAmpersand,$encodeGetItems);
- }
+ if(isset($this->_constructRules[$key]))
+ {
+ foreach($this->_constructRules[$key] as $rule)
+ {
+ if($rule->supportCustomUrl($getItems))
+ return $rule->constructUrl($getItems,$encodeAmpersand,$encodeGetItems);
+ }
}
elseif(isset($this->_constructRules[$wildCardKey]))
{
- foreach($this->_constructRules[$wildCardKey] as $rule)
- {
- if($rule->supportCustomUrl($getItems))
+ foreach($this->_constructRules[$wildCardKey] as $rule)
+ {
+ if($rule->supportCustomUrl($getItems))
{
$getItems['*']= $pos ? substr($serviceParam,$pos+1) : $serviceParam;
- return $rule->constructUrl($getItems,$encodeAmpersand,$encodeGetItems);
+ return $rule->constructUrl($getItems,$encodeAmpersand,$encodeGetItems);
}
- }
- }
- }
- return parent::constructUrl($serviceID,$serviceParam,$getItems,$encodeAmpersand,$encodeGetItems);
- }
-
- /**
- * @return TUrlMappingPattern the matched pattern, null if not found.
- */
- public function getMatchingPattern()
- {
- return $this->_matched;
- }
-}
-
-/**
- * TUrlMappingPattern class.
- *
- * TUrlMappingPattern represents a pattern used to parse and construct URLs.
- * If the currently requested URL matches the pattern, it will alter
- * the THttpRequest parameters. If a constructUrl() call matches the pattern
- * parameters, the pattern will generate a valid URL. In both case, only the PATH_INFO
- * part of a URL is parsed/constructed using the pattern.
- *
- * To specify the pattern, set the {@link setPattern Pattern} property.
- * {@link setPattern Pattern} takes a string expression with
- * parameter names enclosed between a left brace '{' and a right brace '}'.
- * The patterns for each parameter can be set using {@link getParameters Parameters}
- * attribute collection. For example
- * <code>
- * <url ... pattern="articles/{year}/{month}/{day}"
- * parameters.year="\d{4}" parameters.month="\d{2}" parameters.day="\d+" />
- * </code>
- *
- * In the above example, the pattern contains 3 parameters named "year",
- * "month" and "day". The pattern for these parameters are, respectively,
- * "\d{4}" (4 digits), "\d{2}" (2 digits) and "\d+" (1 or more digits).
- * Essentially, the <tt>Parameters</tt> attribute name and values are used
- * as substrings in replacing the placeholders in the <tt>Pattern</tt> string
- * to form a complete regular expression string.
- *
- * For more complicated patterns, one may specify the pattern using a regular expression
- * by {@link setRegularExpression RegularExpression}. For example, the above pattern
- * is equivalent to the following regular expression-based pattern:
- * <code>
- * #^articles/(?P<year>\d{4})/(?P<month>\d{2})\/(?P<day>\d+)$#u
- * </code>
- * The above regular expression used the "named group" feature available in PHP.
- * If you intended to use the <tt>RegularExpression</tt> property or
- * regular expressions in CDATA sections, notice that you need to escape the slash,
- * if you are using the slash as regular expressions delimiter.
- *
- * Thus, only an url that matches the pattern will be valid. For example,
- * a URL <tt>http://example.com/index.php/articles/2006/07/21</tt> will match the above pattern,
- * while <tt>http://example.com/index.php/articles/2006/07/hello</tt> will not
- * since the "day" parameter pattern is not satisfied.
- *
- * The parameter values are available through the <tt>THttpRequest</tt> instance (e.g.
- * <tt>$this->Request['year']</tt>).
- *
- * The {@link setServiceParameter ServiceParameter} and {@link setServiceID ServiceID}
- * (the default ID is 'page') set the service parameter and service id respectively.
- *
+ }
+ }
+ }
+ return parent::constructUrl($serviceID,$serviceParam,$getItems,$encodeAmpersand,$encodeGetItems);
+ }
+
+ /**
+ * @return TUrlMappingPattern the matched pattern, null if not found.
+ */
+ public function getMatchingPattern()
+ {
+ return $this->_matched;
+ }
+}
+
+/**
+ * TUrlMappingPattern class.
+ *
+ * TUrlMappingPattern represents a pattern used to parse and construct URLs.
+ * If the currently requested URL matches the pattern, it will alter
+ * the THttpRequest parameters. If a constructUrl() call matches the pattern
+ * parameters, the pattern will generate a valid URL. In both case, only the PATH_INFO
+ * part of a URL is parsed/constructed using the pattern.
+ *
+ * To specify the pattern, set the {@link setPattern Pattern} property.
+ * {@link setPattern Pattern} takes a string expression with
+ * parameter names enclosed between a left brace '{' and a right brace '}'.
+ * The patterns for each parameter can be set using {@link getParameters Parameters}
+ * attribute collection. For example
+ * <code>
+ * <url ... pattern="articles/{year}/{month}/{day}"
+ * parameters.year="\d{4}" parameters.month="\d{2}" parameters.day="\d+" />
+ * </code>
+ *
+ * In the above example, the pattern contains 3 parameters named "year",
+ * "month" and "day". The pattern for these parameters are, respectively,
+ * "\d{4}" (4 digits), "\d{2}" (2 digits) and "\d+" (1 or more digits).
+ * Essentially, the <tt>Parameters</tt> attribute name and values are used
+ * as substrings in replacing the placeholders in the <tt>Pattern</tt> string
+ * to form a complete regular expression string.
+ *
+ * For more complicated patterns, one may specify the pattern using a regular expression
+ * by {@link setRegularExpression RegularExpression}. For example, the above pattern
+ * is equivalent to the following regular expression-based pattern:
+ * <code>
+ * #^articles/(?P<year>\d{4})/(?P<month>\d{2})\/(?P<day>\d+)$#u
+ * </code>
+ * The above regular expression used the "named group" feature available in PHP.
+ * If you intended to use the <tt>RegularExpression</tt> property or
+ * regular expressions in CDATA sections, notice that you need to escape the slash,
+ * if you are using the slash as regular expressions delimiter.
+ *
+ * Thus, only an url that matches the pattern will be valid. For example,
+ * a URL <tt>http://example.com/index.php/articles/2006/07/21</tt> will match the above pattern,
+ * while <tt>http://example.com/index.php/articles/2006/07/hello</tt> will not
+ * since the "day" parameter pattern is not satisfied.
+ *
+ * The parameter values are available through the <tt>THttpRequest</tt> instance (e.g.
+ * <tt>$this->Request['year']</tt>).
+ *
+ * The {@link setServiceParameter ServiceParameter} and {@link setServiceID ServiceID}
+ * (the default ID is 'page') set the service parameter and service id respectively.
+ *
* Since 3.1.4 you can also use simplyfied wildcard patterns to match multiple
* ServiceParameters with a single rule. The pattern must contain the placeholder
* {*} for the ServiceParameter. For example
@@ -465,225 +465,225 @@ class TUrlMapping extends TUrlManager
*
* <tt>.../index.php/admin/listuser/param1-value1/param2-value2</tt>.
*
- * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
- * @version $Id$
- * @package System.Web
- * @since 3.0.5
- */
-class TUrlMappingPattern extends TComponent
-{
- /**
- * @var string service parameter such as Page class name.
- */
- private $_serviceParameter;
- /**
- * @var string service ID, default is 'page'.
- */
- private $_serviceID='page';
- /**
- * @var string url pattern to match.
- */
- private $_pattern;
- /**
- * @var TMap parameter regular expressions.
- */
- private $_parameters;
- /**
- * @var string regular expression pattern.
- */
- private $_regexp='';
-
- private $_customUrl=true;
-
- private $_manager;
-
- private $_caseSensitive=true;
-
- private $_isWildCardPattern=false;
-
- private $_urlFormat=THttpRequestUrlFormat::Get;
-
- private $_separator='/';
-
- /**
- * @var TUrlMappingPatternSecureConnection
- * @since 3.2
- */
- private $_secureConnection = TUrlMappingPatternSecureConnection::Automatic;
-
- /**
- * Constructor.
- * @param TUrlManager the URL manager instance
- */
- public function __construct(TUrlManager $manager)
- {
- $this->_manager=$manager;
- $this->_parameters=new TAttributeCollection;
- $this->_parameters->setCaseSensitive(true);
- }
-
- /**
- * @return TUrlManager the URL manager instance
- */
- public function getManager()
- {
- return $this->_manager;
- }
-
- /**
- * Initializes the pattern.
- * @param TXmlElement configuration for this module.
- * @throws TConfigurationException if service parameter is not specified
- */
- public function init($config)
- {
- if($this->_serviceParameter===null)
- throw new TConfigurationException('urlmappingpattern_serviceparameter_required', $this->getPattern());
+ * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version $Id$
+ * @package System.Web
+ * @since 3.0.5
+ */
+class TUrlMappingPattern extends TComponent
+{
+ /**
+ * @var string service parameter such as Page class name.
+ */
+ private $_serviceParameter;
+ /**
+ * @var string service ID, default is 'page'.
+ */
+ private $_serviceID='page';
+ /**
+ * @var string url pattern to match.
+ */
+ private $_pattern;
+ /**
+ * @var TMap parameter regular expressions.
+ */
+ private $_parameters;
+ /**
+ * @var string regular expression pattern.
+ */
+ private $_regexp='';
+
+ private $_customUrl=true;
+
+ private $_manager;
+
+ private $_caseSensitive=true;
+
+ private $_isWildCardPattern=false;
+
+ private $_urlFormat=THttpRequestUrlFormat::Get;
+
+ private $_separator='/';
+
+ /**
+ * @var TUrlMappingPatternSecureConnection
+ * @since 3.2
+ */
+ private $_secureConnection = TUrlMappingPatternSecureConnection::Automatic;
+
+ /**
+ * Constructor.
+ * @param TUrlManager the URL manager instance
+ */
+ public function __construct(TUrlManager $manager)
+ {
+ $this->_manager=$manager;
+ $this->_parameters=new TAttributeCollection;
+ $this->_parameters->setCaseSensitive(true);
+ }
+
+ /**
+ * @return TUrlManager the URL manager instance
+ */
+ public function getManager()
+ {
+ return $this->_manager;
+ }
+
+ /**
+ * Initializes the pattern.
+ * @param TXmlElement configuration for this module.
+ * @throws TConfigurationException if service parameter is not specified
+ */
+ public function init($config)
+ {
+ if($this->_serviceParameter===null)
+ throw new TConfigurationException('urlmappingpattern_serviceparameter_required', $this->getPattern());
if(strpos($this->_serviceParameter,'*')!==false)
$this->_isWildCardPattern=true;
- }
-
- /**
- * Substitute the parameter key value pairs as named groupings
- * in the regular expression matching pattern.
- * @return string regular expression pattern with parameter subsitution
- */
- protected function getParameterizedPattern()
- {
- $params=array();
- $values=array();
- foreach($this->_parameters as $key=>$value)
- {
- $params[]='{'.$key.'}';
- $values[]='(?P<'.$key.'>'.$value.')';
- }
+ }
+
+ /**
+ * Substitute the parameter key value pairs as named groupings
+ * in the regular expression matching pattern.
+ * @return string regular expression pattern with parameter subsitution
+ */
+ protected function getParameterizedPattern()
+ {
+ $params=array();
+ $values=array();
+ foreach($this->_parameters as $key=>$value)
+ {
+ $params[]='{'.$key.'}';
+ $values[]='(?P<'.$key.'>'.$value.')';
+ }
if ($this->getIsWildCardPattern()) {
$params[]='{*}';
// service parameter must not contain '=' and '/'
$values[]='(?P<'.$this->getServiceID().'>[^=/]+)';
}
- $params[]='/';
- $values[]='\\/';
- $regexp=str_replace($params,$values,trim($this->getPattern(),'/').'/');
+ $params[]='/';
+ $values[]='\\/';
+ $regexp=str_replace($params,$values,trim($this->getPattern(),'/').'/');
if ($this->_urlFormat===THttpRequestUrlFormat::Get)
- $regexp='/^'.$regexp.'$/u';
+ $regexp='/^'.$regexp.'$/u';
+ else
+ $regexp='/^'.$regexp.'(?P<urlparams>.*)$/u';
+
+ if(!$this->getCaseSensitive())
+ $regexp.='i';
+ return $regexp;
+ }
+
+ /**
+ * @return string full regular expression mapping pattern
+ */
+ public function getRegularExpression()
+ {
+ return $this->_regexp;
+ }
+
+ /**
+ * @param string full regular expression mapping pattern.
+ */
+ public function setRegularExpression($value)
+ {
+ $this->_regexp=$value;
+ }
+
+ /**
+ * @return boolean whether the {@link getPattern Pattern} should be treated as case sensititve. Defaults to true.
+ */
+ public function getCaseSensitive()
+ {
+ return $this->_caseSensitive;
+ }
+
+ /**
+ * @param boolean whether the {@link getPattern Pattern} should be treated as case sensititve.
+ */
+ public function setCaseSensitive($value)
+ {
+ $this->_caseSensitive=TPropertyValue::ensureBoolean($value);
+ }
+
+ /**
+ * @param string service parameter, such as page class name.
+ */
+ public function setServiceParameter($value)
+ {
+ $this->_serviceParameter=$value;
+ }
+
+ /**
+ * @return string service parameter, such as page class name.
+ */
+ public function getServiceParameter()
+ {
+ return $this->_serviceParameter;
+ }
+
+ /**
+ * @param string service id to handle.
+ */
+ public function setServiceID($value)
+ {
+ $this->_serviceID=$value;
+ }
+
+ /**
+ * @return string service id.
+ */
+ public function getServiceID()
+ {
+ return $this->_serviceID;
+ }
+
+ /**
+ * @return string url pattern to match. Defaults to ''.
+ */
+ public function getPattern()
+ {
+ return $this->_pattern;
+ }
+
+ /**
+ * @param string url pattern to match.
+ */
+ public function setPattern($value)
+ {
+ $this->_pattern = $value;
+ }
+
+ /**
+ * @return TAttributeCollection parameter key value pairs.
+ */
+ public function getParameters()
+ {
+ return $this->_parameters;
+ }
+
+ /**
+ * @param TAttributeCollection new parameter key value pairs.
+ */
+ public function setParameters($value)
+ {
+ $this->_parameters=$value;
+ }
+
+ /**
+ * Uses URL pattern (or full regular expression if available) to
+ * match the given url path.
+ * @param THttpRequest the request module
+ * @return array matched parameters, empty if no matches.
+ */
+ public function getPatternMatches($request)
+ {
+ $matches=array();
+ if(($pattern=$this->getRegularExpression())!=='')
+ preg_match($pattern,$request->getPathInfo(),$matches);
else
- $regexp='/^'.$regexp.'(?P<urlparams>.*)$/u';
-
- if(!$this->getCaseSensitive())
- $regexp.='i';
- return $regexp;
- }
-
- /**
- * @return string full regular expression mapping pattern
- */
- public function getRegularExpression()
- {
- return $this->_regexp;
- }
-
- /**
- * @param string full regular expression mapping pattern.
- */
- public function setRegularExpression($value)
- {
- $this->_regexp=$value;
- }
-
- /**
- * @return boolean whether the {@link getPattern Pattern} should be treated as case sensititve. Defaults to true.
- */
- public function getCaseSensitive()
- {
- return $this->_caseSensitive;
- }
-
- /**
- * @param boolean whether the {@link getPattern Pattern} should be treated as case sensititve.
- */
- public function setCaseSensitive($value)
- {
- $this->_caseSensitive=TPropertyValue::ensureBoolean($value);
- }
-
- /**
- * @param string service parameter, such as page class name.
- */
- public function setServiceParameter($value)
- {
- $this->_serviceParameter=$value;
- }
-
- /**
- * @return string service parameter, such as page class name.
- */
- public function getServiceParameter()
- {
- return $this->_serviceParameter;
- }
-
- /**
- * @param string service id to handle.
- */
- public function setServiceID($value)
- {
- $this->_serviceID=$value;
- }
-
- /**
- * @return string service id.
- */
- public function getServiceID()
- {
- return $this->_serviceID;
- }
-
- /**
- * @return string url pattern to match. Defaults to ''.
- */
- public function getPattern()
- {
- return $this->_pattern;
- }
-
- /**
- * @param string url pattern to match.
- */
- public function setPattern($value)
- {
- $this->_pattern = $value;
- }
-
- /**
- * @return TAttributeCollection parameter key value pairs.
- */
- public function getParameters()
- {
- return $this->_parameters;
- }
-
- /**
- * @param TAttributeCollection new parameter key value pairs.
- */
- public function setParameters($value)
- {
- $this->_parameters=$value;
- }
-
- /**
- * Uses URL pattern (or full regular expression if available) to
- * match the given url path.
- * @param THttpRequest the request module
- * @return array matched parameters, empty if no matches.
- */
- public function getPatternMatches($request)
- {
- $matches=array();
- if(($pattern=$this->getRegularExpression())!=='')
- preg_match($pattern,$request->getPathInfo(),$matches);
- else
- preg_match($this->getParameterizedPattern(),trim($request->getPathInfo(),'/').'/',$matches);
+ preg_match($this->getParameterizedPattern(),trim($request->getPathInfo(),'/').'/',$matches);
if($this->getIsWildCardPattern() && isset($matches[$this->_serviceID]))
$matches[$this->_serviceID]=str_replace('*',$matches[$this->_serviceID],$this->_serviceParameter);
@@ -708,261 +708,261 @@ class TUrlMappingPattern extends TComponent
unset($matches['urlparams']);
}
- return $matches;
- }
-
- /**
- * Returns a value indicating whether to use this pattern to construct URL.
- * @return boolean whether to enable custom constructUrl. Defaults to true.
- * @since 3.1.1
- */
- public function getEnableCustomUrl()
- {
- return $this->_customUrl;
- }
-
- /**
- * Sets a value indicating whether to enable custom constructUrl using this pattern
- * @param boolean whether to enable custom constructUrl.
- */
- public function setEnableCustomUrl($value)
- {
- $this->_customUrl=TPropertyValue::ensureBoolean($value);
- }
-
- /**
- * @return boolean whether this pattern is a wildcard pattern
- * @since 3.1.4
- */
- public function getIsWildCardPattern() {
- return $this->_isWildCardPattern;
- }
-
- /**
- * @return THttpRequestUrlFormat the format of URLs. Defaults to THttpRequestUrlFormat::Get.
- */
- public function getUrlFormat()
- {
- return $this->_urlFormat;
- }
-
- /**
- * Sets the format of URLs constructed and interpreted by this pattern.
- * A Get URL format is like index.php?name1=value1&name2=value2
- * while a Path URL format is like index.php/name1/value1/name2/value.
- * The separating character between name and value can be configured with
- * {@link setUrlParamSeparator} and defaults to '/'.
- * Changing the UrlFormat will affect {@link constructUrl} and how GET variables
- * are parsed.
- * @param THttpRequestUrlFormat the format of URLs.
- * @param since 3.1.4
- */
- public function setUrlFormat($value)
- {
- $this->_urlFormat=TPropertyValue::ensureEnum($value,'THttpRequestUrlFormat');
- }
-
- /**
- * @return string separator used to separate GET variable name and value when URL format is Path. Defaults to slash '/'.
- */
- public function getUrlParamSeparator()
- {
- return $this->_separator;
- }
-
- /**
- * @param string separator used to separate GET variable name and value when URL format is Path.
- * @throws TInvalidDataValueException if the separator is not a single character
- */
- public function setUrlParamSeparator($value)
- {
- if(strlen($value)===1)
- $this->_separator=$value;
- else
- throw new TInvalidDataValueException('httprequest_separator_invalid');
- }
-
- /**
- * @return TUrlMappingPatternSecureConnection the SecureConnection behavior. Defaults to {@link TUrlMappingPatternSecureConnection::Automatic Automatic}
- * @since 3.2
- */
- public function getSecureConnection()
- {
- return $this->_secureConnection;
- }
-
- /**
- * @param TUrlMappingPatternSecureConnection the SecureConnection behavior.
- * @since 3.2
- */
- public function setSecureConnection($value)
- {
- $this->_secureConnection = TPropertyValue::ensureEnum($value, 'TUrlMappingPatternSecureConnection');
- }
-
- /**
- * @param array list of GET items to be put in the constructed URL
- * @return boolean whether this pattern IS the one for constructing the URL with the specified GET items.
- * @since 3.1.1
- */
- public function supportCustomUrl($getItems)
- {
- if(!$this->_customUrl || $this->getPattern()===null)
- return false;
- foreach($this->_parameters as $key=>$value)
- {
- if(!isset($getItems[$key]))
- return false;
- }
- return true;
- }
-
- /**
- * Constructs a URL using this pattern.
- * @param array list of GET variables
- * @param boolean whether the ampersand should be encoded in the constructed URL
- * @param boolean whether the GET variables should be encoded in the constructed URL
- * @return string the constructed URL
- * @since 3.1.1
- */
- public function constructUrl($getItems,$encodeAmpersand,$encodeGetItems)
- {
- $extra=array();
- $replace=array();
- // for the GET variables matching the pattern, put them in the URL path
- foreach($getItems as $key=>$value)
- {
- if($this->_parameters->contains($key) || $key==='*' && $this->getIsWildCardPattern())
- $replace['{'.$key.'}']=$encodeGetItems ? rawurlencode($value) : $value;
- else
- $extra[$key]=$value;
- }
-
- $url=$this->_manager->getUrlPrefix().'/'.ltrim(strtr($this->getPattern(),$replace),'/');
-
- // for the rest of the GET variables, put them in the query string
- if(count($extra)>0)
- {
+ return $matches;
+ }
+
+ /**
+ * Returns a value indicating whether to use this pattern to construct URL.
+ * @return boolean whether to enable custom constructUrl. Defaults to true.
+ * @since 3.1.1
+ */
+ public function getEnableCustomUrl()
+ {
+ return $this->_customUrl;
+ }
+
+ /**
+ * Sets a value indicating whether to enable custom constructUrl using this pattern
+ * @param boolean whether to enable custom constructUrl.
+ */
+ public function setEnableCustomUrl($value)
+ {
+ $this->_customUrl=TPropertyValue::ensureBoolean($value);
+ }
+
+ /**
+ * @return boolean whether this pattern is a wildcard pattern
+ * @since 3.1.4
+ */
+ public function getIsWildCardPattern() {
+ return $this->_isWildCardPattern;
+ }
+
+ /**
+ * @return THttpRequestUrlFormat the format of URLs. Defaults to THttpRequestUrlFormat::Get.
+ */
+ public function getUrlFormat()
+ {
+ return $this->_urlFormat;
+ }
+
+ /**
+ * Sets the format of URLs constructed and interpreted by this pattern.
+ * A Get URL format is like index.php?name1=value1&name2=value2
+ * while a Path URL format is like index.php/name1/value1/name2/value.
+ * The separating character between name and value can be configured with
+ * {@link setUrlParamSeparator} and defaults to '/'.
+ * Changing the UrlFormat will affect {@link constructUrl} and how GET variables
+ * are parsed.
+ * @param THttpRequestUrlFormat the format of URLs.
+ * @param since 3.1.4
+ */
+ public function setUrlFormat($value)
+ {
+ $this->_urlFormat=TPropertyValue::ensureEnum($value,'THttpRequestUrlFormat');
+ }
+
+ /**
+ * @return string separator used to separate GET variable name and value when URL format is Path. Defaults to slash '/'.
+ */
+ public function getUrlParamSeparator()
+ {
+ return $this->_separator;
+ }
+
+ /**
+ * @param string separator used to separate GET variable name and value when URL format is Path.
+ * @throws TInvalidDataValueException if the separator is not a single character
+ */
+ public function setUrlParamSeparator($value)
+ {
+ if(strlen($value)===1)
+ $this->_separator=$value;
+ else
+ throw new TInvalidDataValueException('httprequest_separator_invalid');
+ }
+
+ /**
+ * @return TUrlMappingPatternSecureConnection the SecureConnection behavior. Defaults to {@link TUrlMappingPatternSecureConnection::Automatic Automatic}
+ * @since 3.2
+ */
+ public function getSecureConnection()
+ {
+ return $this->_secureConnection;
+ }
+
+ /**
+ * @param TUrlMappingPatternSecureConnection the SecureConnection behavior.
+ * @since 3.2
+ */
+ public function setSecureConnection($value)
+ {
+ $this->_secureConnection = TPropertyValue::ensureEnum($value, 'TUrlMappingPatternSecureConnection');
+ }
+
+ /**
+ * @param array list of GET items to be put in the constructed URL
+ * @return boolean whether this pattern IS the one for constructing the URL with the specified GET items.
+ * @since 3.1.1
+ */
+ public function supportCustomUrl($getItems)
+ {
+ if(!$this->_customUrl || $this->getPattern()===null)
+ return false;
+ foreach($this->_parameters as $key=>$value)
+ {
+ if(!isset($getItems[$key]))
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Constructs a URL using this pattern.
+ * @param array list of GET variables
+ * @param boolean whether the ampersand should be encoded in the constructed URL
+ * @param boolean whether the GET variables should be encoded in the constructed URL
+ * @return string the constructed URL
+ * @since 3.1.1
+ */
+ public function constructUrl($getItems,$encodeAmpersand,$encodeGetItems)
+ {
+ $extra=array();
+ $replace=array();
+ // for the GET variables matching the pattern, put them in the URL path
+ foreach($getItems as $key=>$value)
+ {
+ if($this->_parameters->contains($key) || $key==='*' && $this->getIsWildCardPattern())
+ $replace['{'.$key.'}']=$encodeGetItems ? rawurlencode($value) : $value;
+ else
+ $extra[$key]=$value;
+ }
+
+ $url=$this->_manager->getUrlPrefix().'/'.ltrim(strtr($this->getPattern(),$replace),'/');
+
+ // for the rest of the GET variables, put them in the query string
+ if(count($extra)>0)
+ {
if ($this->_urlFormat===THttpRequestUrlFormat::Path && $this->getIsWildCardPattern()) {
foreach ($extra as $name=>$value)
$url.='/'.$name.$this->_separator.($encodeGetItems?rawurlencode($value):$value);
return $url;
}
- $url2='';
- $amp=$encodeAmpersand?'&amp;':'&';
- if($encodeGetItems)
- {
- foreach($extra as $name=>$value)
- {
- if(is_array($value))
- {
- $name=rawurlencode($name.'[]');
- foreach($value as $v)
- $url2.=$amp.$name.'='.rawurlencode($v);
- }
- else
- $url2.=$amp.rawurlencode($name).'='.rawurlencode($value);
- }
- }
- else
- {
- foreach($extra as $name=>$value)
- {
- if(is_array($value))
- {
- foreach($value as $v)
- $url2.=$amp.$name.'[]='.$v;
- }
- else
- $url2.=$amp.$name.'='.$value;
- }
- }
- $url=$url.'?'.substr($url2,strlen($amp));
- }
- return $this -> applySecureConnectionPrefix($url);
- }
-
- /**
- * Apply behavior of {@link SecureConnection} property by conditionaly prefixing
- * URL with {@link THttpRequest::getBaseUrl()}
- *
- * @param string $url
- * @return string
- * @since 3.2
- */
- protected function applySecureConnectionPrefix($url)
- {
- static $request;
- if($request === null) $request = Prado::getApplication() -> getRequest();
-
- static $isSecureConnection;
- if($isSecureConnection === null) $isSecureConnection = $request -> getIsSecureConnection();
-
- switch($this -> getSecureConnection())
- {
- case TUrlMappingPatternSecureConnection::EnableIfNotSecure:
- if($isSecureConnection) return $url;
- return $request -> getBaseUrl(true) . $url;
- break;
- case TUrlMappingPatternSecureConnection::DisableIfSecure:
- if(!$isSecureConnection) return $url;
- return $request -> getBaseUrl(false) . $url;
- break;
- case TUrlMappingPatternSecureConnection::Enable:
- return $request -> getBaseUrl(true) . $url;
- break;
- case TUrlMappingPatternSecureConnection::Disable:
- return $request -> getBaseUrl(false) . $url;
- break;
- case TUrlMappingPatternSecureConnection::Automatic:
- default:
- return $url;
- break;
- }
- }
-}
-
-/**
- * TUrlMappingPatternSecureConnection class
- *
- * TUrlMappingPatternSecureConnection defines the enumerable type for the possible SecureConnection
- * URL prefix behavior that can be used by {@link TUrlMappingPattern::constructUrl()}.
- *
- * @author Yves Berkholz <godzilla80[at]gmx[dot]net>
- * @version $Id$
- * @package System.Web
- * @since 3.2
- */
-class TUrlMappingPatternSecureConnection extends TEnumerable
-{
- /**
- * Keep current SecureConnection status
- * means no prefixing
- */
- const Automatic = 'Automatic';
-
- /**
- * Force use secured connection
- * always prefixing with https://example.com/path/to/app
- */
- const Enable = 'Enable';
-
- /**
- * Force use unsecured connection
- * always prefixing with http://example.com/path/to/app
- */
- const Disable = 'Disable';
-
- /**
- * Force use secured connection, if in unsecured mode
- * prefixing with https://example.com/path/to/app
- */
- const EnableIfNotSecure = 'EnableIfNotSecure';
-
- /**
- * Force use unsecured connection, if in secured mode
- * prefixing with https://example.com/path/to/app
- */
- const DisableIfSecure = 'DisableIfSecure';
-}
+ $url2='';
+ $amp=$encodeAmpersand?'&amp;':'&';
+ if($encodeGetItems)
+ {
+ foreach($extra as $name=>$value)
+ {
+ if(is_array($value))
+ {
+ $name=rawurlencode($name.'[]');
+ foreach($value as $v)
+ $url2.=$amp.$name.'='.rawurlencode($v);
+ }
+ else
+ $url2.=$amp.rawurlencode($name).'='.rawurlencode($value);
+ }
+ }
+ else
+ {
+ foreach($extra as $name=>$value)
+ {
+ if(is_array($value))
+ {
+ foreach($value as $v)
+ $url2.=$amp.$name.'[]='.$v;
+ }
+ else
+ $url2.=$amp.$name.'='.$value;
+ }
+ }
+ $url=$url.'?'.substr($url2,strlen($amp));
+ }
+ return $this -> applySecureConnectionPrefix($url);
+ }
+
+ /**
+ * Apply behavior of {@link SecureConnection} property by conditionaly prefixing
+ * URL with {@link THttpRequest::getBaseUrl()}
+ *
+ * @param string $url
+ * @return string
+ * @since 3.2
+ */
+ protected function applySecureConnectionPrefix($url)
+ {
+ static $request;
+ if($request === null) $request = Prado::getApplication() -> getRequest();
+
+ static $isSecureConnection;
+ if($isSecureConnection === null) $isSecureConnection = $request -> getIsSecureConnection();
+
+ switch($this -> getSecureConnection())
+ {
+ case TUrlMappingPatternSecureConnection::EnableIfNotSecure:
+ if($isSecureConnection) return $url;
+ return $request -> getBaseUrl(true) . $url;
+ break;
+ case TUrlMappingPatternSecureConnection::DisableIfSecure:
+ if(!$isSecureConnection) return $url;
+ return $request -> getBaseUrl(false) . $url;
+ break;
+ case TUrlMappingPatternSecureConnection::Enable:
+ return $request -> getBaseUrl(true) . $url;
+ break;
+ case TUrlMappingPatternSecureConnection::Disable:
+ return $request -> getBaseUrl(false) . $url;
+ break;
+ case TUrlMappingPatternSecureConnection::Automatic:
+ default:
+ return $url;
+ break;
+ }
+ }
+}
+
+/**
+ * TUrlMappingPatternSecureConnection class
+ *
+ * TUrlMappingPatternSecureConnection defines the enumerable type for the possible SecureConnection
+ * URL prefix behavior that can be used by {@link TUrlMappingPattern::constructUrl()}.
+ *
+ * @author Yves Berkholz <godzilla80[at]gmx[dot]net>
+ * @version $Id$
+ * @package System.Web
+ * @since 3.2
+ */
+class TUrlMappingPatternSecureConnection extends TEnumerable
+{
+ /**
+ * Keep current SecureConnection status
+ * means no prefixing
+ */
+ const Automatic = 'Automatic';
+
+ /**
+ * Force use secured connection
+ * always prefixing with https://example.com/path/to/app
+ */
+ const Enable = 'Enable';
+
+ /**
+ * Force use unsecured connection
+ * always prefixing with http://example.com/path/to/app
+ */
+ const Disable = 'Disable';
+
+ /**
+ * Force use secured connection, if in unsecured mode
+ * prefixing with https://example.com/path/to/app
+ */
+ const EnableIfNotSecure = 'EnableIfNotSecure';
+
+ /**
+ * Force use unsecured connection, if in secured mode
+ * prefixing with https://example.com/path/to/app
+ */
+ const DisableIfSecure = 'DisableIfSecure';
+}