Added ability to reference object properties.

This commit is contained in:
andrey
2001-04-26 16:06:21 +00:00
parent 6432cc941f
commit 1f127b0a54
6 changed files with 59 additions and 24 deletions

2
NEWS
View File

@@ -1,5 +1,7 @@
Version 1.4.0
-------------
- implemented '->' syntax for accessing properties of objects passed to the
template. (Andrei)
- allowed custom functions to receive Smarty object as the second
parameter; this can be used to dynamically change template variables, for
example. (Andrei)

View File

@@ -170,7 +170,7 @@ class Smarty_Compiler extends Smarty {
/* If the tag name matches a variable or section property definition,
we simply process it. */
if (preg_match('!^\$\w+(?>(\[\w+(\.\w+)?\])|(\.\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command) || // if a variable
if (preg_match('!^\$\w+(?>(\[\w+(\.\w+)?\])|((\.|->)\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command) || // if a variable
preg_match('!^#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command) || // or a configuration variable
preg_match('!^%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command)) { // or a section property
settype($tag_command, 'array');
@@ -679,7 +679,7 @@ class Smarty_Compiler extends Smarty {
{
$qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'';
$var_exprs = preg_grep('!^\$\w+(?>(\[\w+(\.\w+)?\])|(\.\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens);
$var_exprs = preg_grep('!^\$\w+(?>(\[\w+(\.\w+)?\])|((\.|->)\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens);
$conf_var_exprs = preg_grep('!^#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens);
$sect_prop_exprs = preg_grep('!^%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens);
@@ -710,21 +710,22 @@ class Smarty_Compiler extends Smarty {
{
list($var_ref, $modifiers) = explode('|', substr($var_expr, 1), 2);
$indexes = preg_split('![\[\]]!', $var_ref, -1, PREG_SPLIT_NO_EMPTY);
preg_match_all('!\[\w+\]|(->|\.)\w+|^\w+!', $var_ref, $match);
$indexes = $match[0];
$var_name = array_shift($indexes);
$output = "\$this->_tpl_vars['$var_name']";
foreach ($indexes as $index) {
if ($index{0} == '.') {
foreach (array_slice(explode('.', $index), 1) as $prop) {
$output .= "['$prop']";
}
} else {
list($section, $section_prop) = explode('.', $index);
if ($index{0} == '[') {
list($section, $section_prop) = explode('.', substr($index, 1, -1));
if (!isset($section_prop))
$section_prop = 'index';
$output .= "[\$_smarty_sections['$section']['properties']['$section_prop']]";
} else if ($index{0} == '.') {
$output .= "['" . substr($index, 1) . "']";
} else {
$output .= $index;
}
}

View File

@@ -69,3 +69,8 @@ This is an example of the html_options function:
</form>
{include file="footer.tpl"}
{section name=test loop=$a->foo}
foo: {$a->foo[test]}
bar: {$a->bar[test]}
{/section}

View File

@@ -1244,9 +1244,9 @@ $smarty->display("index.tpl");
<sect3>
<title>Variables assigned from PHP</title>
<para>
Variables that are assigned from PHP are displayed by preceeding
Variables that are assigned from PHP are referenced by preceding
them with a dollar sign ($) and enclosing the variable in delimiters
like so: {$varname}
like so: $varname
</para>
<example>
@@ -1269,8 +1269,9 @@ Your last login was on January 11th, 2001.
<sect3>
<title>Associative arrays</title>
<para>
You can also print variables that are assigned as associative
arrays from PHP by supplying the key value with the array name.
You can also reference associative array variables that are
assigned from PHP by specifying the key after the '.' (period)
symbol.
</para>
<example>
<title>displaying assigned associative array variables</title>
@@ -1295,6 +1296,27 @@ zaphod@slartibartfast.com&lt;br&gt;
</example>
</sect3>
<sect3>
<title>Objects</title>
<para>
Properties of objects assigned from PHP can be referenced
by specifying the property name after the '-&gt;' symbol.
</para>
<example>
<title>displaying object properties</title>
<programlisting>
name: {$person-&gt;name}&lt;br&gt;
email: {$person-&gt;email}&lt;br&gt;
OUTPUT:
name: Zaphod Beeblebrox&lt;br&gt;
email: zaphod@slartibartfast.com&lt;br&gt;
</programlisting>
</example>
</sect3>
<sect3>
<title>Variables passed from config files</title>
@@ -1945,8 +1967,7 @@ OUTPUT:
(usually an array of values) determines the number of times the
section will loop. When printing a variable within a section, the
section name must be given next to variable name within brackets
[]. If you are using an associative array, separate the key and
value with a period (.). <emphasis>sectionelse</emphasis> is
[]. <emphasis>sectionelse</emphasis> is
executed when there are no values in the loop variable.
</para>
<example>

View File

@@ -170,7 +170,7 @@ class Smarty_Compiler extends Smarty {
/* If the tag name matches a variable or section property definition,
we simply process it. */
if (preg_match('!^\$\w+(?>(\[\w+(\.\w+)?\])|(\.\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command) || // if a variable
if (preg_match('!^\$\w+(?>(\[\w+(\.\w+)?\])|((\.|->)\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command) || // if a variable
preg_match('!^#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command) || // or a configuration variable
preg_match('!^%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command)) { // or a section property
settype($tag_command, 'array');
@@ -679,7 +679,7 @@ class Smarty_Compiler extends Smarty {
{
$qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'';
$var_exprs = preg_grep('!^\$\w+(?>(\[\w+(\.\w+)?\])|(\.\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens);
$var_exprs = preg_grep('!^\$\w+(?>(\[\w+(\.\w+)?\])|((\.|->)\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens);
$conf_var_exprs = preg_grep('!^#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens);
$sect_prop_exprs = preg_grep('!^%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens);
@@ -710,21 +710,22 @@ class Smarty_Compiler extends Smarty {
{
list($var_ref, $modifiers) = explode('|', substr($var_expr, 1), 2);
$indexes = preg_split('![\[\]]!', $var_ref, -1, PREG_SPLIT_NO_EMPTY);
preg_match_all('!\[\w+\]|(->|\.)\w+|^\w+!', $var_ref, $match);
$indexes = $match[0];
$var_name = array_shift($indexes);
$output = "\$this->_tpl_vars['$var_name']";
foreach ($indexes as $index) {
if ($index{0} == '.') {
foreach (array_slice(explode('.', $index), 1) as $prop) {
$output .= "['$prop']";
}
} else {
list($section, $section_prop) = explode('.', $index);
if ($index{0} == '[') {
list($section, $section_prop) = explode('.', substr($index, 1, -1));
if (!isset($section_prop))
$section_prop = 'index';
$output .= "[\$_smarty_sections['$section']['properties']['$section_prop']]";
} else if ($index{0} == '.') {
$output .= "['" . substr($index, 1) . "']";
} else {
$output .= $index;
}
}

View File

@@ -69,3 +69,8 @@ This is an example of the html_options function:
</form>
{include file="footer.tpl"}
{section name=test loop=$a->foo}
foo: {$a->foo[test]}
bar: {$a->bar[test]}
{/section}