From ea1f3ded5ab6f63b74f0a012b73309f8fe8e1b99 Mon Sep 17 00:00:00 2001 From: andrey Date: Mon, 26 Feb 2001 16:50:04 +0000 Subject: [PATCH] Added index_prev, index_next section properties and ability to index by them. --- NEWS | 5 ++++- Smarty.class.php | 15 ++++++++++----- libs/Smarty.class.php | 15 ++++++++++----- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/NEWS b/NEWS index 62ca2790..9d69a138 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,7 @@ - - fixed issue with php executing in literal blocks (Monte) + - added ability to index looped variables by section properties, e.g. + $foo.index_prev/bar. (Andrei) + - added index_prev and index_next section properties. (Andrei) + - fixed issue with php executing in literal blocks. (Monte) Version 1.3.0 ------------- diff --git a/Smarty.class.php b/Smarty.class.php index 1daa5b3a..76039dee 100644 --- a/Smarty.class.php +++ b/Smarty.class.php @@ -628,7 +628,7 @@ class Smarty /* If the tag name matches a variable or section property definition, we simply process it. */ - if (preg_match('!^\$(\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'); @@ -861,6 +861,8 @@ class Smarty {$section_props}['index'] < {$section_props}['loop']; {$section_props}['index']++):\n"; $output .= "{$section_props}['rownum'] = {$section_props}['index'] + 1;\n"; + $output .= "{$section_props}['index_prev'] = {$section_props}['index'] - 1;\n"; + $output .= "{$section_props}['index_next'] = {$section_props}['index'] + 1;\n"; $output .= "?>"; @@ -1126,11 +1128,11 @@ class Smarty allow people to use older versions of PHP we emulate preg_grep() and use the version check to see what function to call. */ if (strnatcmp(PHP_VERSION, '4.0.4') >= 0) { - $var_exprs = preg_grep('!^\$(\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); } else { - $var_exprs = $this->_preg_grep('!^\$(\w+/)*\w+(?>\.\w+)*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); + $var_exprs = $this->_preg_grep('!^\$(\w+(\.\w+)?/)*\w+(?>\.\w+)*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); $conf_var_exprs = $this->_preg_grep('!^#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); $sect_prop_exprs = $this->_preg_grep('!^%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); } @@ -1164,8 +1166,11 @@ class Smarty $output = "\$$var_name"; - foreach ($sections as $section) { - $output .= "[\$_sections['$section']['properties']['index']]"; + foreach ($sections as $section_ref) { + list($section, $section_prop) = explode('.', $section_ref); + if (!isset($section_prop)) + $section_prop = 'index'; + $output .= "[\$_sections['$section']['properties']['$section_prop']]"; } foreach ($props as $prop) { $output .= "['$prop']"; diff --git a/libs/Smarty.class.php b/libs/Smarty.class.php index 1daa5b3a..76039dee 100644 --- a/libs/Smarty.class.php +++ b/libs/Smarty.class.php @@ -628,7 +628,7 @@ class Smarty /* If the tag name matches a variable or section property definition, we simply process it. */ - if (preg_match('!^\$(\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'); @@ -861,6 +861,8 @@ class Smarty {$section_props}['index'] < {$section_props}['loop']; {$section_props}['index']++):\n"; $output .= "{$section_props}['rownum'] = {$section_props}['index'] + 1;\n"; + $output .= "{$section_props}['index_prev'] = {$section_props}['index'] - 1;\n"; + $output .= "{$section_props}['index_next'] = {$section_props}['index'] + 1;\n"; $output .= "?>"; @@ -1126,11 +1128,11 @@ class Smarty allow people to use older versions of PHP we emulate preg_grep() and use the version check to see what function to call. */ if (strnatcmp(PHP_VERSION, '4.0.4') >= 0) { - $var_exprs = preg_grep('!^\$(\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); } else { - $var_exprs = $this->_preg_grep('!^\$(\w+/)*\w+(?>\.\w+)*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); + $var_exprs = $this->_preg_grep('!^\$(\w+(\.\w+)?/)*\w+(?>\.\w+)*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); $conf_var_exprs = $this->_preg_grep('!^#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); $sect_prop_exprs = $this->_preg_grep('!^%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); } @@ -1164,8 +1166,11 @@ class Smarty $output = "\$$var_name"; - foreach ($sections as $section) { - $output .= "[\$_sections['$section']['properties']['index']]"; + foreach ($sections as $section_ref) { + list($section, $section_prop) = explode('.', $section_ref); + if (!isset($section_prop)) + $section_prop = 'index'; + $output .= "[\$_sections['$section']['properties']['$section_prop']]"; } foreach ($props as $prop) { $output .= "['$prop']";