summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwei <>2006-09-28 00:11:36 +0000
committerwei <>2006-09-28 00:11:36 +0000
commit36a61db3144c111b722db89baf5a1d55c1c9a6b2 (patch)
treefd1d4d15db709356e3a9c0af8e3f07250e2a85ad
parentd8b4c4f055f51d23aa5a728bbf7a5c1ef99893a4 (diff)
Update TUrlMapping and THttpRequest
-rw-r--r--buildscripts/texbuilder/Page2Tex.php111
-rw-r--r--buildscripts/texbuilder/quickstart.tex10
-rw-r--r--demos/quickstart/protected/pages/Advanced/Error.page6
-rw-r--r--demos/quickstart/protected/pages/Advanced/MasterContent.page2
-rw-r--r--demos/quickstart/protected/pages/Configurations/Templates1.page2
-rw-r--r--demos/quickstart/protected/pages/Configurations/UrlMapping.page41
-rw-r--r--demos/quickstart/protected/pages/Controls/Validation.page4
-rw-r--r--demos/quickstart/protected/pages/GettingStarted/CommandLine.page10
-rw-r--r--framework/Web/THttpRequest.php9
-rw-r--r--framework/Web/TUrlMapping.php51
10 files changed, 152 insertions, 94 deletions
diff --git a/buildscripts/texbuilder/Page2Tex.php b/buildscripts/texbuilder/Page2Tex.php
index c8cad6c9..f225d973 100644
--- a/buildscripts/texbuilder/Page2Tex.php
+++ b/buildscripts/texbuilder/Page2Tex.php
@@ -1,14 +1,14 @@
<?php
-class Page2Tex
+class Page2Tex
{
private $_current_page;
private static $header_count = 0;
private $_base;
private $_dir;
- private $_verb_find = array('\$','\%', '\{', '\}', "\t",'``');
- private $_verb_replace = array('$', '%', '{','}', " ",'"');
+ private $_verb_find = array('\$','\%', '\{', '\}', "\t",'``','`');
+ private $_verb_replace = array('$', '%', '{','}', " ",'"','\'');
function __construct($base, $dir, $current='')
{
@@ -16,7 +16,7 @@ class Page2Tex
$this->_current_page = $current;
$this->_dir = $dir;
}
-
+
function setCurrentPage($current)
{
$this->_current_page = $current;
@@ -24,22 +24,24 @@ class Page2Tex
function escape_verbatim($matches)
{
- return "\begin{verbatim}".str_replace($this->_verb_find, $this->_verb_replace, $matches[1])."\end{verbatim}\n";
+ return "\begin{small}\begin{verbatim}".
+ str_replace($this->_verb_find, $this->_verb_replace, $matches[1]).
+ "\end{verbatim}\end{small}\n";
}
-
+
function escape_verb($matches)
{
$text = str_replace($this->_verb_find, $this->_verb_replace, $matches[1]);
- return '\verb<'.$text.'<';
+ return '\begin{small}\verb<'.$text.'< \end{small}';
}
-
+
function include_image($matches)
{
-
+
$current_path = $this->_current_page;
-
+
$image = dirname($current_path).'/'.trim($matches[1]);
-
+
$file = realpath($image);
$info = getimagesize($file);
switch($info[2])
@@ -51,7 +53,7 @@ class Page2Tex
case 3: $im = imagecreatefrompng($file); break;
}
$base = $this->_base;
-
+
if(isset($im))
{
$prefix = strtolower(str_replace(realpath($base), '', $file));
@@ -64,7 +66,7 @@ class Page2Tex
return $this->include_figure($info, $filename);
}
}
-
+
function include_figure($info, $filename)
{
$width = sprintf('%0.2f', $info[0]/(135/2.54));
@@ -76,18 +78,18 @@ class Page2Tex
\end{figure}
';
}
-
+
function anchor($matches)
{
$page = $this->get_current_path();
return '\hypertarget{'.$page.'/'.strtolower($matches[1]).'}{}';
}
-
+
function texttt($matches)
{
- return '\texttt{'.str_replace(array('#','_'),array('\#','\_'), $matches[1]).'}';
+ return '\texttt{'.str_replace(array('#','_','&amp;'),array('\#','\_','\&'), $matches[1]).'}';
}
-
+
function get_current_path()
{
$current_path = $this->_current_page;
@@ -95,7 +97,7 @@ class Page2Tex
$page = strtolower(substr(str_replace($base, '', $current_path),1));
return $page;
}
-
+
function make_link($matches)
{
if(is_int(strpos($matches[1], '#')))
@@ -120,62 +122,63 @@ class Page2Tex
}
return '\href{'.$matches[1].'}{'.$matches[2].'}';
}
-
+
function parse_html($page,$html)
{
-
-
+
+
$html = preg_replace('/<\/?com:TContent[^>]*>/', '', $html);
$html = preg_replace('/<\/?p [^>]*>/', '', $html);
$html = preg_replace('/<\/?p>/', '', $html);
-
+
$html = preg_replace('/(\s+|\(+|\[+)"/', '$1``', $html);
-
+ $html = preg_replace('/(\s+|\(+|\[+)\'/', '$1`', $html);
+
//escape { and }
$html = preg_replace('/([^\s]+){([^}]*)}([^\s]+)/', '$1\\\{$2\\\}$3', $html);
-
+
$html = preg_replace_callback('/<img\s+src="?<%~([^"]*)%>"?[^>]*\/>/', array($this, 'include_image'), $html);
//escape %
$html = str_replace('%', '\%', $html);
-
+
//codes
$html = str_replace('$', '\$', $html);
-
+
$html = preg_replace_callback('/<com:TTextHighlighter[^>]*>((.|\n)*?)<\/com:TTextHighlighter>/', array($this,'escape_verbatim'), $html);
// $html = preg_replace('/<\/com:TTextHighlighter>/', '`2`', $html);
// $html = preg_replace_callback('/(`1`)([^`]*)(`2`)/m', array($this,'escape_verbatim'), $html);
$html = preg_replace_callback('/(<div class="source">)((.|\n)*?)(<\/div>)/', array($this,'escape_verbatim'), $html);
$html = preg_replace_callback('/(<pre>)([^<]*)(<\/pre>)/', array($this,'escape_verbatim'), $html);
-
+
//<code>
$html = preg_replace_callback('/<code>([^<]*)<\/code>/', array($this,'escape_verb'), $html);
-
+
//runbar
$html = preg_replace('/<com:RunBar\s+PagePath="([^"]*)"\s+\/>/',
'\href{http://www.pradosoft.com/demos/quickstart/index.php?page=$1}{$1 Demo}', $html);
-
+
//DocLink
$html = preg_replace('/<com:DocLink\s+ClassPath="([^"]*)[.]([^.]*)"\s+\/>/',
'\href{http://www.pradosoft.com/docs/manual/$1/$2.html}{$1.$2 API Reference}', $html);
-
+
//text modifiers
$html = preg_replace('/<b[^>]*>([^<]*)<\/b>/', '\textbf{$1}', $html);
$html = preg_replace('/<i[^>]*>([^<]*)<\/i>/', '\emph{$1}', $html);
$html = preg_replace_callback('/<tt>([^<]*)<\/tt>/', array($this,'texttt'), $html);
-
+
//links
$html = preg_replace_callback('/<a[^>]+href="([^"]*)"[^>]*>([^<]*)<\/a>/',
array($this,'make_link'), $html);
//anchor
$html = preg_replace_callback('/<a[^>]+name="([^"]*)"[^>]*><\/a>/', array($this,'anchor'), $html);
-
+
//description <dl>
$html = preg_replace('/<dt>([^<]*)<\/dt>/', '\item[$1]', $html);
$html = preg_replace('/<\/?dd>/', '', $html);
$html = preg_replace('/<dl>/', '\begin{description}', $html);
$html = preg_replace('/<\/dl>/', '\end{description}', $html);
-
+
//item lists
$html = preg_replace('/<ul[^>]*>/', '\begin{itemize}', $html);
$html = preg_replace('/<\/ul>/', '\end{itemize}', $html);
@@ -183,25 +186,25 @@ class Page2Tex
$html = preg_replace('/<\/ol>/', '\end{enumerate}', $html);
$html = preg_replace('/<li[^>]*>/', '\item ', $html);
$html = preg_replace('/<\/li>/', '', $html);
-
+
//headings
$html = preg_replace('/<h1(\s+id="[^"]+")?>([^<]+)<\/h1>/', '\section{$2}', $html);
$html = preg_replace('/<h2(\s+id="[^"]+")?>([^<]+)<\/h2>/', '\subsection{$2}', $html);
$html = preg_replace('/<h3(\s+id="[^"]+")?>([^<]+)<\/h3>/', '\subsubsection{$2}', $html);
-
+
//div box
$html = preg_replace_callback('/<div class="[tipnofe]*?">((.|\n)*?)<\/div>/',
- array($this, 'mbox'), $html);
-
+ array($this, 'mbox'), $html);
+
//tabular
$html = preg_replace_callback('/<!--\s*tabular:([^-]*)-->\s*<table[^>]*>((.|\n)*?)<\/table>/',
array($this, 'tabular'), $html);
-
+
$html = html_entity_decode($html);
-
+
return $html;
}
-
+
function tabular($matches)
{
$options = array();
@@ -210,13 +213,13 @@ class Page2Tex
$sub = explode('=', trim($string));
$options[trim($sub[0])] = trim($sub[1]);
}
-
+
$widths = explode(' ',preg_replace('/\(|\)/', '', $options['width']));
$this->_tabular_widths = $widths;
-
+
$this->_tabular_total = count($widths);
$this->_tabular_col = 0;
-
+
$begin = "\begin{table}[!hpt]\centering \n \begin{tabular}{".$options['align']."}\\hline";
$end = "\end{tabular} \n \end{table}\n";
$table = preg_replace('/<\/tr>/', '\\\\\\\\ \hline', $matches[2]);
@@ -224,11 +227,11 @@ class Page2Tex
$table = preg_replace('/<th>([^<]+)<\/th>/', '\textbf{$1} &', $table);
$table = preg_replace_callback('/<td>((.|\n)*?)<\/td>/', array($this, 'table_column'), $table);
$table = preg_replace('/<br \/>/', ' \\\\\\\\', $table);
-
+
$table = preg_replace('/&\s*\\\\\\\\/', '\\\\\\\\', $table);
return $begin.$table.$end;
}
-
+
function table_column($matches)
{
$width = $this->_tabular_widths[$this->_tabular_col];
@@ -239,24 +242,24 @@ class Page2Tex
return '\begin{minipage}{'.$width.'\textwidth}\vspace{3mm}'.
$matches[1].'\vspace{3mm}\end{minipage} & ';
}
-
+
function mbox($matches)
{
return "\n\begin{mybox}\n".$matches[1]."\n\end{mybox}\n";
}
-
+
function get_chapter_label($chapter)
{
return '\hypertarget{'.str_replace(' ', '', $chapter).'}{}';
}
-
+
function get_section_label($section)
{
$section = str_replace('.page', '', $section);
return '\hypertarget{'.str_replace('/', '.', $section).'}{}';
}
-
-
+
+
function set_header_id($content, $count)
{
self::$header_count = $count*100;
@@ -265,22 +268,22 @@ class Page2Tex
$content = preg_replace_callback('/<h3>/', array($this,"h3"), $content);
return $content;
}
-
+
function h1($matches)
{
return "<h1 id=\"".(++self::$header_count)."\">";
}
-
+
function h2($matches)
{
return "<h2 id=\"".(++self::$header_count)."\">";
}
-
+
function h3($matches)
{
return "<h3 id=\"".(++self::$header_count)."\">";
}
-
+
}
?> \ No newline at end of file
diff --git a/buildscripts/texbuilder/quickstart.tex b/buildscripts/texbuilder/quickstart.tex
index 8a7d017e..e5851268 100644
--- a/buildscripts/texbuilder/quickstart.tex
+++ b/buildscripts/texbuilder/quickstart.tex
@@ -42,6 +42,16 @@
\fancyhead[RE]{\nouppercase{\scshape\leftmark}}
%-----------------------------------------------------------------------
+% boxes
+
+\newsavebox{\fmboxb}
+\newenvironment{mybox}
+ {\vspace{-2mm}\begin{center}\begin{lrbox}{\fmboxb}\hspace{2mm}
+ \begin{minipage}{0.85\textwidth} \vspace{2mm}\small}
+ { \vspace{2mm} \end{minipage}
+ \hspace{2mm}\end{lrbox}\fbox{\usebox{\fmboxb}}\end{center}}
+
+
%----------------- TITLE --------------
\title{\Huge \bfseries PRADO v3.0.5 Quickstart Tutorial
diff --git a/demos/quickstart/protected/pages/Advanced/Error.page b/demos/quickstart/protected/pages/Advanced/Error.page
index a0765c10..9d2cf9ec 100644
--- a/demos/quickstart/protected/pages/Advanced/Error.page
+++ b/demos/quickstart/protected/pages/Advanced/Error.page
@@ -70,8 +70,8 @@ The naming convention for the template files used for all other exceptions is as
<p>
Again, if the preferred language is not found, PRADO will try to use <tt>exception.html</tt>, instead.
</p>
-<p>
-CAUTION: When saving a template file, please make sure the file is saved using UTF-8 encoding. On Windows, you may use <tt>Notepad.exe</tt> to accomplish such saving.
-</p>
+<div class="note">
+<b class="tip">CAUTION:</b> When saving a template file, please make sure the file is saved using UTF-8 encoding. On Windows, you may use <tt>Notepad.exe</tt> to accomplish such saving.
+</div>
</com:TContent> \ No newline at end of file
diff --git a/demos/quickstart/protected/pages/Advanced/MasterContent.page b/demos/quickstart/protected/pages/Advanced/MasterContent.page
index b7bcc9bb..b0836393 100644
--- a/demos/quickstart/protected/pages/Advanced/MasterContent.page
+++ b/demos/quickstart/protected/pages/Advanced/MasterContent.page
@@ -40,7 +40,7 @@ Then, the contents are inserted into the master control according to the followi
<img src=<%~ mastercontent.gif %> alt="Master and Content" />
<img src=<%~ pcrelation.gif %> alt="Parent-child relationship between master and content" />
-<h2>Master vs. External Template</h2>
+<h2 id="6301">Master vs. External Template</h2>
<p>
Master is very similar to external templates which are introduced since version 3.0.5. A special <a href="?page=Configurations.Templates1">include tag</a> is used to include an external template file into a base template.
</p>
diff --git a/demos/quickstart/protected/pages/Configurations/Templates1.page b/demos/quickstart/protected/pages/Configurations/Templates1.page
index 7acd92d0..958e27cf 100644
--- a/demos/quickstart/protected/pages/Configurations/Templates1.page
+++ b/demos/quickstart/protected/pages/Configurations/Templates1.page
@@ -85,7 +85,7 @@ Comments INVISIBLE to end-users
Note, template comments (by &lt;!-- ... --!&gt;) cannot appear in a property value.
</p>
-<h2>Include Tags</h2>
+<h2 id="1601">Include Tags</h2>
<p>
Since version 3.0.5, PRADO starts to support external template inclusion. This is accomplished via include tags, where external template files are specified in namespace format and their file name must be terminated as <tt>.tpl</tt>.
</p>
diff --git a/demos/quickstart/protected/pages/Configurations/UrlMapping.page b/demos/quickstart/protected/pages/Configurations/UrlMapping.page
index dde6854f..ff6f09c7 100644
--- a/demos/quickstart/protected/pages/Configurations/UrlMapping.page
+++ b/demos/quickstart/protected/pages/Configurations/UrlMapping.page
@@ -1,6 +1,6 @@
<com:TContent ID="body" >
-<h1>URL Mapping (Friendly URLs)</h1>
+<h1 id="2101">URL Mapping (Friendly URLs)</h1>
<com:DocLink ClassPath="System.Web.TUrlMapping" />
@@ -17,16 +17,25 @@ globally in the <a href="?page=Configurations.AppConfig">application configurati
file and before any services.
</p>
+<div class="info"><b class="tip">Info:</b>
+The <tt>TUrlMapping</tt> must be configured before the
+<a href="?page=Fundamentals.Modules">Request module</a> resolves the request.
+This usually means delcaring the <tt>TUrlMapping</tt> module before any
+<tt>&lt;services&gt;</tt> tag in the <a href="?page=Configurations.AppConfig">application configuration</a>.
+Specifying the mappings in the per directory <tt>config.xml</tt> is not supported.
+</div>
+
<p>The mapping format is as follows.
<com:TTextHighlighter Language="xml" CssClass="source">
<module id="friendly-url" class="System.Web.TUrlMapping">
- <url serviceParameter="ClassName" pattern="regexp" parameters.id="regexp" />
+ <url serviceParameter="ClassName" pattern="pattern" parameters.id="subpattern" />
</module>
</com:TTextHighlighter>
</p>
<p>The <tt>ServiceParameter</tt> and <tt>ServiceID</tt>
- (the default ID is 'page') set the service parameter and service ID respectively.
+ (the default ID is 'page') set the service parameter and service ID, respectively, of
+ the <a href="?page=Fundamentals.Modules">Request module</a>.
The service parameter for the <tt>TPageService</tt> service is the
Page class name, e.g., for an URL "index.php?page=Home", "page" is the service ID and the service
parameter is "Home". Other services may use the service parameter and ID differently.
@@ -42,15 +51,15 @@ and a right brace '<tt>}</tt>'. The pattens for each parameter can be set
using <tt>Parameters</tt>attribute collection.
For example,
<com:TTextHighlighter Language="xml" CssClass="source">
-<url ServiceParameter="Pages.ShowArticles" pattern="articles/{year}/{month}/{day}"
+<url ServiceParameter="ArticleView" pattern="articles/{year}/{month}/{day}"
parameters.year="\d{4}" parameters.month="\d{2}" parameters.day="\d+" />
</com:TTextHighlighter>
</p>
-The example is equivalent, using regular expression only, to
+The example is equivalent to the following regular expression (it uses the "named group" feature in regular expressions available in PHP):
<com:TTextHighlighter Language="xml" CssClass="source">
-<url ServiceParmaeter="Pages.ShowArticles">
+<url ServiceParmaeter="ArticleView">
<![CDATA[
- articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)
+ /articles\/(?P<year>\d{4})\/(?P<month>\d{2})\/(?P<day>\d+)/u
]]>
</url>
</com:TTextHighlighter>
@@ -59,19 +68,27 @@ In the above example, the pattern contains 3 parameters named "<tt>year</tt>",
"<tt>month</tt>" and "<tt>day</tt>". The pattern for these parameters are,
respectively, "<tt>\d{4}</tt>" (4 digits), "<tt>\d{2}</tt>" (2 digits)
and "<tt>\d+</tt>" (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.
</p>
-<p>For example, an URL "<tt>http://example.com/index.php/articles/2006/07/21</tt>" will be matched
+<div class="note"><b class="tip">Note:</b> If you intended to use the <tt>RegularExpression</tt>
+property you need to escape the slash in regular expressions.
+</div>
+
+<p>Following from the above pattern example,
+an URL "<tt>http://example.com/index.php/articles/2006/07/21</tt>" will be matched
and valid. However, "<tt>http://example.com/index.php/articles/2006/07/hello</tt>" is not
valid since the "<tt>day</tt>" parameter pattern is not satisfied.
In the default <tt>TUrlMappingPattern</tt> class, the pattern is matched against the
<b>path</b> property of the URL only. For example, only the
-"<tt>/index.php/articles/2006/07/21</tt>" portion of the URL is considered and the rest
-is ignored.
+"<tt>/index.php/articles/2006/07/21</tt>" portion of the URL is considered.
</p>
-
-<p>The parameter values are available through the standard <tt>Request</tt>
+<p>
+The mapped request URL is equivalent to <tt>index.php?page=ArticleView&amp;year=2006&amp;month=07&amp;day=21</tt>.
+The request parameter values are available through the standard <tt>Request</tt>
object. For example, <tt>$this->Request['year']</tt>.
</p>
diff --git a/demos/quickstart/protected/pages/Controls/Validation.page b/demos/quickstart/protected/pages/Controls/Validation.page
index 119749db..2405fb45 100644
--- a/demos/quickstart/protected/pages/Controls/Validation.page
+++ b/demos/quickstart/protected/pages/Controls/Validation.page
@@ -151,7 +151,7 @@ The summary can be displayed as a list, a bulleted list, or a single paragraph b
</p>
<com:RunBar PagePath="Controls.Samples.TValidationSummary.Home" />
-<h2>Client and Server Side Conditional Validation</h2>
+<h2 id="5301">Client and Server Side Conditional Validation</h2>
<p>
All validators contains the following events.
<ul>
@@ -180,7 +180,7 @@ function onErrorHandler(sender, parameter)
Where <tt>sender</tt> is the current client-side validator and <tt>parameter</tt>
is the control that invoked the validator.
</p>
-<h3>Conditional Validation Example</h3>
+<h3 id="5302">Conditional Validation Example</h3>
<p>
The following example show the use of client-side and server side validator events. The example
demonstrates conditional validation.
diff --git a/demos/quickstart/protected/pages/GettingStarted/CommandLine.page b/demos/quickstart/protected/pages/GettingStarted/CommandLine.page
index c2050246..cf204a40 100644
--- a/demos/quickstart/protected/pages/GettingStarted/CommandLine.page
+++ b/demos/quickstart/protected/pages/GettingStarted/CommandLine.page
@@ -1,18 +1,18 @@
<com:TContent ID="body" >
-<h1>Command Line Tool</h1>
+<h1 id="501">Command Line Tool</h1>
<p>The optional <tt>prado-cli.php</tt> PHP script file in the <tt>framework</tt>
directory provides command line tools to perform various tendious taks in Prado.
The <tt>prado-cli.php</tt> can be used to create Prado project skeletons, create
initial test fixtures, and access to an interactive PHP shell.
</p>
-<h2>Requirements</h2>
+<h2 id="502">Requirements</h2>
<p>
To use the command line tool, you need to use your command prompt, command console
or terminal. In addition, PHP must be able to execute PHP scripts from
the command line.
</p>
-<h2>Usage</h2>
+<h2 id="503">Usage</h2>
<p>
If you type <tt>php path/to/framework/prado-cli.php</tt>, you should see
the following information. Alternatively, if you are not on Windows,
@@ -38,7 +38,7 @@ actions:
<p>The <b>&lt;parameter&gt;</b> are required parameters and <b>[optional]</b>
are optional parameters. </p>
-<h2>Creating a new Prado project skeleton</h2>
+<h2 id="504">Creating a new Prado project skeleton</h2>
<p>To create a Prado project skeleton, do the following:</p>
<ol>
@@ -49,7 +49,7 @@ are optional parameters. </p>
the test fixtures for the <tt>helloworld</tt> project.</li>
</ol>
-<h2>Interactive Shell</h2>
+<h2 id="505">Interactive Shell</h2>
<p>
The interactive shell allows you to evaluate PHP statements from te command line.
The <tt>prado-cli.php</tt> script can be used to start the shell and load an existing
diff --git a/framework/Web/THttpRequest.php b/framework/Web/THttpRequest.php
index aa690540..90007fa2 100644
--- a/framework/Web/THttpRequest.php
+++ b/framework/Web/THttpRequest.php
@@ -596,7 +596,10 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar
}
}
- protected function getRequestResolved()
+ /**
+ * @return boolean true if request is already resolved, false otherwise.
+ */
+ public function getRequestResolved()
{
return $this->_requestResolved;
}
@@ -631,7 +634,7 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar
* Sets the requested service ID.
* @param string requested service ID
*/
- protected function setServiceID($value)
+ public function setServiceID($value)
{
$this->_serviceID=$value;
}
@@ -650,7 +653,7 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar
* Sets the requested service parameter.
* @param string requested service parameter
*/
- protected function setServiceParameter($value)
+ public function setServiceParameter($value)
{
$this->_serviceParam=$value;
}
diff --git a/framework/Web/TUrlMapping.php b/framework/Web/TUrlMapping.php
index 90acfd13..6df08c3f 100644
--- a/framework/Web/TUrlMapping.php
+++ b/framework/Web/TUrlMapping.php
@@ -43,7 +43,7 @@
* @package System.Web
* @since 3.0.5
*/
-class TUrlMapping extends THttpRequest
+class TUrlMapping extends TModule
{
/**
* @var string default pattern class.
@@ -201,9 +201,9 @@ class TUrlMapping extends THttpRequest
*
* Describes an URL mapping pattern, if a given URL matches the pattern, the
* TUrlMapping class will alter the THttpRequest parameters. The
- * url matching is done using regular expressions.
+ * url matching is done using patterns and regular expressions.
*
- * The {@link setPattern Pattern} property takes a regular expression with
+ * The {@link setPattern Pattern} property takes an string expression with
* parameter names enclosed between a left brace '{' and a right brace '}'.
* The pattens for each parameter can be set using {@link getParameters Parameters}
* attribute collection. For example
@@ -215,6 +215,17 @@ class TUrlMapping extends THttpRequest
* 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. A full regular expression
+ * may be expressed using the <tt>RegularExpression</tt> attribute or
+ * as the body content of the &lt;module&gt; tag. The above pattern is equivalent
+ * to the following regular expression 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.
+ * Notice that you need to escape the slash in regular expressions.
*
* In the TUrlMappingPattern class, the pattern is matched against the
* <b>path</b> property of the url only.
@@ -281,20 +292,20 @@ class TUrlMappingPattern extends TComponent
{
$body = trim($config->getValue());
if(strlen($body)>0)
- $this->setPattern($body);
+ $this->setRegularExpression($body);
if(is_null($this->_serviceParameter))
{
throw new TConfigurationException(
'dispatcher_url_service_parameter_missing', $this->getPattern());
}
- $this->initializePattern();
}
/**
* Subsitutue the parameter key value pairs as named groupings
* in the regular expression matching pattern.
+ * @return string regular expression pattern with parameter subsitution
*/
- protected function initializePattern()
+ protected function getParameterizedPattern()
{
$params= array();
$values = array();
@@ -303,18 +314,30 @@ class TUrlMappingPattern extends TComponent
$params[] = '{'.$key.'}';
$values[] = '(?P<'.$key.'>'.$value.')';
}
- $this->_regexp = str_replace($params,$values,$this->getPattern());
+ $params[] = '/';
+ $values[] = '\\/';
+ $regexp = str_replace($params,$values,$this->getPattern());
+ $modifiers = $this->getModifiers();
+ return '/'.$regexp.'/'.$modifiers;
}
/**
- * @return string mapping pattern
+ * @return string full regular expression mapping pattern
*/
- protected function getRegExpPattern()
+ public function getRegularExpression()
{
return $this->_regexp;
}
/**
+ * @param string full regular expression mapping patern.
+ */
+ public function setRegularExpression($value)
+ {
+ $this->_regexp;
+ }
+
+ /**
* @param string service parameter, such as page class name.
*/
public function setServiceParameter($value)
@@ -395,7 +418,8 @@ class TUrlMappingPattern extends TComponent
}
/**
- * Use regular expression to match the given url path.
+ * Uses URL pattern (or full regular expression if available) to
+ * match the given url path.
* @param TUri url to match against
* @return array matched parameters, empty if no matches.
*/
@@ -403,9 +427,10 @@ class TUrlMappingPattern extends TComponent
{
$path = $url->getPath();
$matches=array();
- $pattern = str_replace('/', '\\/', $this->getRegExpPattern());
- $modifiers = $this->getModifiers();
- preg_match('/'.$pattern.'/'.$modifiers, $path, $matches);
+ $pattern = $this->getRegularExpression();
+ if($pattern === null)
+ $pattern = $this->getParameterizedPattern();
+ preg_match($pattern, $path, $matches);
return $matches;
}