diff --git a/NEWS b/NEWS index 02f91866..9b64f3b1 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,6 @@ - - added "once" attribute to php_include (Monte) + - made it possible to use simple variables inside [] for + indexing. (Andrei) + - added "once" attribute to {include_php}. (Monte) Version 2.1.1 ------------- diff --git a/Smarty_Compiler.class.php b/Smarty_Compiler.class.php index 61f80557..8534a460 100644 --- a/Smarty_Compiler.class.php +++ b/Smarty_Compiler.class.php @@ -235,7 +235,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+(?>(\[(\d+|\w+(\.\w+)?)\])|((\.|->)\$?\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command) || // if a variable + if (preg_match('!^\$\w+(?>(\[(\d+|\$\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'); @@ -1083,7 +1083,7 @@ class Smarty_Compiler extends Smarty { { $qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\''; - $var_exprs = preg_grep('!^\$\w+(?>(\[(\d+|\w+(\.\w+)?)\])|((\.|->)\$?\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); + $var_exprs = preg_grep('!^\$\w+(?>(\[(\d+|\$\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); @@ -1117,7 +1117,7 @@ class Smarty_Compiler extends Smarty { $var_ref = $parts[0]; $modifiers = isset($parts[1]) ? $parts[1] : ''; - preg_match_all('!\[\w+(\.\w+)?\]|(->|\.)\$?\w+|^\w+!', $var_ref, $match); + preg_match_all('!\[(?:\$\w+|\w+(\.\w+)?)\]|(->|\.)\$?\w+|^\w+!', $var_ref, $match); $indexes = $match[0]; $var_name = array_shift($indexes); @@ -1143,6 +1143,8 @@ class Smarty_Compiler extends Smarty { $index = substr($index, 1, -1); if (is_numeric($index)) { $output .= "[$index]"; + } elseif ($index{0} == '$') { + $output .= "[\$this->_tpl_vars['" . substr($index, 1) . "']]"; } else { $parts = explode('.', $index); $section = $parts[0]; diff --git a/libs/Smarty_Compiler.class.php b/libs/Smarty_Compiler.class.php index 61f80557..8534a460 100644 --- a/libs/Smarty_Compiler.class.php +++ b/libs/Smarty_Compiler.class.php @@ -235,7 +235,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+(?>(\[(\d+|\w+(\.\w+)?)\])|((\.|->)\$?\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command) || // if a variable + if (preg_match('!^\$\w+(?>(\[(\d+|\$\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'); @@ -1083,7 +1083,7 @@ class Smarty_Compiler extends Smarty { { $qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\''; - $var_exprs = preg_grep('!^\$\w+(?>(\[(\d+|\w+(\.\w+)?)\])|((\.|->)\$?\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); + $var_exprs = preg_grep('!^\$\w+(?>(\[(\d+|\$\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); @@ -1117,7 +1117,7 @@ class Smarty_Compiler extends Smarty { $var_ref = $parts[0]; $modifiers = isset($parts[1]) ? $parts[1] : ''; - preg_match_all('!\[\w+(\.\w+)?\]|(->|\.)\$?\w+|^\w+!', $var_ref, $match); + preg_match_all('!\[(?:\$\w+|\w+(\.\w+)?)\]|(->|\.)\$?\w+|^\w+!', $var_ref, $match); $indexes = $match[0]; $var_name = array_shift($indexes); @@ -1143,6 +1143,8 @@ class Smarty_Compiler extends Smarty { $index = substr($index, 1, -1); if (is_numeric($index)) { $output .= "[$index]"; + } elseif ($index{0} == '$') { + $output .= "[\$this->_tpl_vars['" . substr($index, 1) . "']]"; } else { $parts = explode('.', $index); $section = $parts[0];