mirror of
https://github.com/smarty-php/smarty.git
synced 2025-08-05 02:44:27 +02:00
put php style object syntax back in
This commit is contained in:
@@ -127,15 +127,6 @@ class Smarty_Compiler extends Smarty {
|
|||||||
// "text"
|
// "text"
|
||||||
$this->_var_regexp = '(?:' . $this->_avar_regexp . '|' . $this->_qstr_regexp . ')';
|
$this->_var_regexp = '(?:' . $this->_avar_regexp . '|' . $this->_qstr_regexp . ')';
|
||||||
|
|
||||||
// matches valid object property access
|
|
||||||
// $foo->bar
|
|
||||||
// $foo.bar->bar
|
|
||||||
// $foo.bar.foo->bar
|
|
||||||
// $foo->bar->foo
|
|
||||||
// $foo->bar->foo->bar
|
|
||||||
$this->_obj_call_regexp = '(?:' . $this->_dvar_regexp . '(?:\->\w+)+)';
|
|
||||||
|
|
||||||
/* // this is code for allowing full object access, not officially supported
|
|
||||||
// matches valid object call (no objects allowed in parameters):
|
// matches valid object call (no objects allowed in parameters):
|
||||||
// $foo->bar
|
// $foo->bar
|
||||||
// $foo->bar()
|
// $foo->bar()
|
||||||
@@ -144,11 +135,10 @@ class Smarty_Compiler extends Smarty {
|
|||||||
// $foo->bar($foo|bar, "foo"|bar)
|
// $foo->bar($foo|bar, "foo"|bar)
|
||||||
// $foo->bar->foo()
|
// $foo->bar->foo()
|
||||||
// $foo->bar->foo->bar()
|
// $foo->bar->foo->bar()
|
||||||
$this->_obj_start_regexp = ''(?:' . $this->_dvar_regexp . '(?:\->\w+)+)';
|
$this->_obj_start_regexp = '(?:' . $this->_dvar_regexp . '(?:\->\w+)+)';
|
||||||
$this->_obj_call_regexp = '(?:' . $this->_obj_start_regexp . '(?:\((?:\w+|'
|
$this->_obj_call_regexp = '(?:' . $this->_obj_start_regexp . '(?:\((?:\w+|'
|
||||||
. $this->_var_regexp . '(?>' . $this->_mod_regexp . '*)(?:\s*,\s*(?:(?:\w+|'
|
. $this->_var_regexp . '(?>' . $this->_mod_regexp . '*)(?:\s*,\s*(?:(?:\w+|'
|
||||||
. $this->_var_regexp . '(?>' . $this->_mod_regexp . '*))))*)?\))?)';
|
. $this->_var_regexp . '(?>' . $this->_mod_regexp . '*))))*)?\))?)';
|
||||||
*/
|
|
||||||
|
|
||||||
// matches valid function name:
|
// matches valid function name:
|
||||||
// foo123
|
// foo123
|
||||||
@@ -926,13 +916,13 @@ class Smarty_Compiler extends Smarty {
|
|||||||
$output .= "{$foreach_props}['show'] = {$foreach_props}['total'] > 0;\n";
|
$output .= "{$foreach_props}['show'] = {$foreach_props}['total'] > 0;\n";
|
||||||
$output .= "if ({$foreach_props}['show']):\n";
|
$output .= "if ({$foreach_props}['show']):\n";
|
||||||
$output .= "{$foreach_props}['iteration'] = 0;\n";
|
$output .= "{$foreach_props}['iteration'] = 0;\n";
|
||||||
$output .= " foreach ((array)$from as $key_part\$this->_tpl_vars['$item']):\n";
|
$output .= " foreach ((array)$from as $key_part$item):\n";
|
||||||
$output .= " {$foreach_props}['iteration']++;\n";
|
$output .= " {$foreach_props}['iteration']++;\n";
|
||||||
$output .= " {$foreach_props}['first'] = ({$foreach_props}['iteration'] == 1);\n";
|
$output .= " {$foreach_props}['first'] = ({$foreach_props}['iteration'] == 1);\n";
|
||||||
$output .= " {$foreach_props}['last'] = ({$foreach_props}['iteration'] == {$foreach_props}['total']);\n";
|
$output .= " {$foreach_props}['last'] = ({$foreach_props}['iteration'] == {$foreach_props}['total']);\n";
|
||||||
} else {
|
} else {
|
||||||
$output .= "if (count((array)$from)):\n";
|
$output .= "if (count((array)$from)):\n";
|
||||||
$output .= " foreach ((array)$from as $key_part\$this->_tpl_vars['$item']):\n";
|
$output .= " foreach ((array)$from as $key_part$item):\n";
|
||||||
}
|
}
|
||||||
$output .= '?>';
|
$output .= '?>';
|
||||||
|
|
||||||
@@ -1184,7 +1174,7 @@ class Smarty_Compiler extends Smarty {
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* Tokenize tag attributes. */
|
/* Tokenize tag attributes. */
|
||||||
preg_match_all('/(?:' . $this->_qstr_regexp . ' | (?>[^"\'=\s]+)
|
preg_match_all('/(?:' . $this->_obj_call_regexp . '|' . $this->_qstr_regexp . ' | (?>[^"\'=\s]+)
|
||||||
)+ |
|
)+ |
|
||||||
[=]
|
[=]
|
||||||
/x', $tag_args, $match);
|
/x', $tag_args, $match);
|
||||||
@@ -1336,7 +1326,7 @@ class Smarty_Compiler extends Smarty {
|
|||||||
Function: _parse_var
|
Function: _parse_var
|
||||||
Purpose: parse variable expression into PHP code
|
Purpose: parse variable expression into PHP code
|
||||||
\*======================================================================*/
|
\*======================================================================*/
|
||||||
function _parse_var($var_expr, $tag_attrs = null)
|
function _parse_var($var_expr)
|
||||||
{
|
{
|
||||||
|
|
||||||
preg_match('!(' . $this->_obj_call_regexp . '|' . $this->_var_regexp . ')(' . $this->_mod_regexp . '*)$!', $var_expr, $match);
|
preg_match('!(' . $this->_obj_call_regexp . '|' . $this->_var_regexp . ')(' . $this->_mod_regexp . '*)$!', $var_expr, $match);
|
||||||
@@ -1373,6 +1363,7 @@ class Smarty_Compiler extends Smarty {
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach ($indexes as $index) {
|
foreach ($indexes as $index) {
|
||||||
|
|
||||||
if ($index{0} == '[') {
|
if ($index{0} == '[') {
|
||||||
$index = substr($index, 1, -1);
|
$index = substr($index, 1, -1);
|
||||||
if (is_numeric($index)) {
|
if (is_numeric($index)) {
|
||||||
@@ -1386,58 +1377,18 @@ class Smarty_Compiler extends Smarty {
|
|||||||
$output .= "[\$this->_sections['$section']['$section_prop']]";
|
$output .= "[\$this->_sections['$section']['$section_prop']]";
|
||||||
}
|
}
|
||||||
} else if ($index{0} == '.') {
|
} else if ($index{0} == '.') {
|
||||||
// figure out if reference to array or object
|
if ($index{1} == '$')
|
||||||
if ($index{1} == '$') {
|
|
||||||
// array reference
|
|
||||||
$output .= "[\$this->_tpl_vars['" . substr($index, 2) . "']]";
|
$output .= "[\$this->_tpl_vars['" . substr($index, 2) . "']]";
|
||||||
} else if (!preg_match('!^\w+$!', substr($index, 1))) {
|
else
|
||||||
// array reference
|
|
||||||
$output .= "['" . substr($index, 1) . "']";
|
$output .= "['" . substr($index, 1) . "']";
|
||||||
} else {
|
|
||||||
if(eval("return is_object($output);")) {
|
|
||||||
// is object
|
|
||||||
if($this->security && substr($index, 1, 1) == '_') {
|
|
||||||
$this->_syntax_error('(secure) call to private object member is not allowed', E_USER_ERROR, __FILE__, __LINE__);
|
|
||||||
}
|
|
||||||
if(eval("return method_exists($output,'" . substr($index,1) . "');")) {
|
|
||||||
// object method reference
|
|
||||||
// parse parameters
|
|
||||||
if(isset($tag_attrs)) {
|
|
||||||
if(isset($tag_attrs['wrapper'])) {
|
|
||||||
$_object_wrapper = $tag_attrs['wrapper'];
|
|
||||||
unset($tag_attrs['wrapper']);
|
|
||||||
} else {
|
|
||||||
$_object_wrapper = $this->_object_wrapper;
|
|
||||||
}
|
|
||||||
if(isset($tag_attrs['assign'])) {
|
|
||||||
unset($tag_attrs['assign']);
|
|
||||||
}
|
|
||||||
if(!$_object_wrapper) {
|
|
||||||
// pass args as associative array
|
|
||||||
$index .= '(array(' . implode(',' , $tag_attrs) . '), $this)';
|
|
||||||
} else {
|
|
||||||
// pass args as separate parameters
|
|
||||||
$index .= '(' . implode(',' , array_values($tag_attrs)) . ')';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// no args for method
|
|
||||||
$index .= '()';
|
|
||||||
}
|
|
||||||
$output .= '->' . substr($index, 1);
|
|
||||||
} else {
|
|
||||||
// object property reference
|
|
||||||
$output .= "->" . substr($index, 1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// array reference
|
|
||||||
$output .= "['" . substr($index, 1) . "']";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (substr($index,0,2) == '->') {
|
} else if (substr($index,0,2) == '->') {
|
||||||
// object property reference syntax (deprecated)
|
if($this->security && substr($index,2,1) == '_') {
|
||||||
if($this->security && strstr($index, '->_')) {
|
|
||||||
$this->_syntax_error('(secure) call to private object member is not allowed', E_USER_ERROR, __FILE__, __LINE__);
|
$this->_syntax_error('(secure) call to private object member is not allowed', E_USER_ERROR, __FILE__, __LINE__);
|
||||||
} else {
|
} else {
|
||||||
|
// parse each parameter to the object
|
||||||
|
if(preg_match('!(?:\->\w+)+(?:(' . $this->_parenth_param_regexp . '))?!', $index, $match)) {
|
||||||
|
$index = str_replace($match[1], $this->_parse_parenth_args($match[1]), $index);
|
||||||
|
}
|
||||||
$output .= $index;
|
$output .= $index;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1455,6 +1406,21 @@ class Smarty_Compiler extends Smarty {
|
|||||||
return $output;
|
return $output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*======================================================================*\
|
||||||
|
Function: _parse_parenth_args
|
||||||
|
Purpose: parse arguments in function call parenthesis
|
||||||
|
\*======================================================================*/
|
||||||
|
function _parse_parenth_args($parenth_args)
|
||||||
|
{
|
||||||
|
preg_match_all('!' . $this->_param_regexp . '!',$parenth_args, $match);
|
||||||
|
$match = $match[0];
|
||||||
|
rsort($match);
|
||||||
|
reset($match);
|
||||||
|
$orig_vals = $match;
|
||||||
|
$this->_parse_vars_props($match);
|
||||||
|
return str_replace($orig_vals, $match, $parenth_args);
|
||||||
|
}
|
||||||
|
|
||||||
/*======================================================================*\
|
/*======================================================================*\
|
||||||
Function: _parse_conf_var
|
Function: _parse_conf_var
|
||||||
Purpose: parse configuration variable expression into PHP code
|
Purpose: parse configuration variable expression into PHP code
|
||||||
|
@@ -127,15 +127,6 @@ class Smarty_Compiler extends Smarty {
|
|||||||
// "text"
|
// "text"
|
||||||
$this->_var_regexp = '(?:' . $this->_avar_regexp . '|' . $this->_qstr_regexp . ')';
|
$this->_var_regexp = '(?:' . $this->_avar_regexp . '|' . $this->_qstr_regexp . ')';
|
||||||
|
|
||||||
// matches valid object property access
|
|
||||||
// $foo->bar
|
|
||||||
// $foo.bar->bar
|
|
||||||
// $foo.bar.foo->bar
|
|
||||||
// $foo->bar->foo
|
|
||||||
// $foo->bar->foo->bar
|
|
||||||
$this->_obj_call_regexp = '(?:' . $this->_dvar_regexp . '(?:\->\w+)+)';
|
|
||||||
|
|
||||||
/* // this is code for allowing full object access, not officially supported
|
|
||||||
// matches valid object call (no objects allowed in parameters):
|
// matches valid object call (no objects allowed in parameters):
|
||||||
// $foo->bar
|
// $foo->bar
|
||||||
// $foo->bar()
|
// $foo->bar()
|
||||||
@@ -144,11 +135,10 @@ class Smarty_Compiler extends Smarty {
|
|||||||
// $foo->bar($foo|bar, "foo"|bar)
|
// $foo->bar($foo|bar, "foo"|bar)
|
||||||
// $foo->bar->foo()
|
// $foo->bar->foo()
|
||||||
// $foo->bar->foo->bar()
|
// $foo->bar->foo->bar()
|
||||||
$this->_obj_start_regexp = ''(?:' . $this->_dvar_regexp . '(?:\->\w+)+)';
|
$this->_obj_start_regexp = '(?:' . $this->_dvar_regexp . '(?:\->\w+)+)';
|
||||||
$this->_obj_call_regexp = '(?:' . $this->_obj_start_regexp . '(?:\((?:\w+|'
|
$this->_obj_call_regexp = '(?:' . $this->_obj_start_regexp . '(?:\((?:\w+|'
|
||||||
. $this->_var_regexp . '(?>' . $this->_mod_regexp . '*)(?:\s*,\s*(?:(?:\w+|'
|
. $this->_var_regexp . '(?>' . $this->_mod_regexp . '*)(?:\s*,\s*(?:(?:\w+|'
|
||||||
. $this->_var_regexp . '(?>' . $this->_mod_regexp . '*))))*)?\))?)';
|
. $this->_var_regexp . '(?>' . $this->_mod_regexp . '*))))*)?\))?)';
|
||||||
*/
|
|
||||||
|
|
||||||
// matches valid function name:
|
// matches valid function name:
|
||||||
// foo123
|
// foo123
|
||||||
@@ -926,13 +916,13 @@ class Smarty_Compiler extends Smarty {
|
|||||||
$output .= "{$foreach_props}['show'] = {$foreach_props}['total'] > 0;\n";
|
$output .= "{$foreach_props}['show'] = {$foreach_props}['total'] > 0;\n";
|
||||||
$output .= "if ({$foreach_props}['show']):\n";
|
$output .= "if ({$foreach_props}['show']):\n";
|
||||||
$output .= "{$foreach_props}['iteration'] = 0;\n";
|
$output .= "{$foreach_props}['iteration'] = 0;\n";
|
||||||
$output .= " foreach ((array)$from as $key_part\$this->_tpl_vars['$item']):\n";
|
$output .= " foreach ((array)$from as $key_part$item):\n";
|
||||||
$output .= " {$foreach_props}['iteration']++;\n";
|
$output .= " {$foreach_props}['iteration']++;\n";
|
||||||
$output .= " {$foreach_props}['first'] = ({$foreach_props}['iteration'] == 1);\n";
|
$output .= " {$foreach_props}['first'] = ({$foreach_props}['iteration'] == 1);\n";
|
||||||
$output .= " {$foreach_props}['last'] = ({$foreach_props}['iteration'] == {$foreach_props}['total']);\n";
|
$output .= " {$foreach_props}['last'] = ({$foreach_props}['iteration'] == {$foreach_props}['total']);\n";
|
||||||
} else {
|
} else {
|
||||||
$output .= "if (count((array)$from)):\n";
|
$output .= "if (count((array)$from)):\n";
|
||||||
$output .= " foreach ((array)$from as $key_part\$this->_tpl_vars['$item']):\n";
|
$output .= " foreach ((array)$from as $key_part$item):\n";
|
||||||
}
|
}
|
||||||
$output .= '?>';
|
$output .= '?>';
|
||||||
|
|
||||||
@@ -1184,7 +1174,7 @@ class Smarty_Compiler extends Smarty {
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* Tokenize tag attributes. */
|
/* Tokenize tag attributes. */
|
||||||
preg_match_all('/(?:' . $this->_qstr_regexp . ' | (?>[^"\'=\s]+)
|
preg_match_all('/(?:' . $this->_obj_call_regexp . '|' . $this->_qstr_regexp . ' | (?>[^"\'=\s]+)
|
||||||
)+ |
|
)+ |
|
||||||
[=]
|
[=]
|
||||||
/x', $tag_args, $match);
|
/x', $tag_args, $match);
|
||||||
@@ -1336,7 +1326,7 @@ class Smarty_Compiler extends Smarty {
|
|||||||
Function: _parse_var
|
Function: _parse_var
|
||||||
Purpose: parse variable expression into PHP code
|
Purpose: parse variable expression into PHP code
|
||||||
\*======================================================================*/
|
\*======================================================================*/
|
||||||
function _parse_var($var_expr, $tag_attrs = null)
|
function _parse_var($var_expr)
|
||||||
{
|
{
|
||||||
|
|
||||||
preg_match('!(' . $this->_obj_call_regexp . '|' . $this->_var_regexp . ')(' . $this->_mod_regexp . '*)$!', $var_expr, $match);
|
preg_match('!(' . $this->_obj_call_regexp . '|' . $this->_var_regexp . ')(' . $this->_mod_regexp . '*)$!', $var_expr, $match);
|
||||||
@@ -1373,6 +1363,7 @@ class Smarty_Compiler extends Smarty {
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach ($indexes as $index) {
|
foreach ($indexes as $index) {
|
||||||
|
|
||||||
if ($index{0} == '[') {
|
if ($index{0} == '[') {
|
||||||
$index = substr($index, 1, -1);
|
$index = substr($index, 1, -1);
|
||||||
if (is_numeric($index)) {
|
if (is_numeric($index)) {
|
||||||
@@ -1386,58 +1377,18 @@ class Smarty_Compiler extends Smarty {
|
|||||||
$output .= "[\$this->_sections['$section']['$section_prop']]";
|
$output .= "[\$this->_sections['$section']['$section_prop']]";
|
||||||
}
|
}
|
||||||
} else if ($index{0} == '.') {
|
} else if ($index{0} == '.') {
|
||||||
// figure out if reference to array or object
|
if ($index{1} == '$')
|
||||||
if ($index{1} == '$') {
|
|
||||||
// array reference
|
|
||||||
$output .= "[\$this->_tpl_vars['" . substr($index, 2) . "']]";
|
$output .= "[\$this->_tpl_vars['" . substr($index, 2) . "']]";
|
||||||
} else if (!preg_match('!^\w+$!', substr($index, 1))) {
|
else
|
||||||
// array reference
|
|
||||||
$output .= "['" . substr($index, 1) . "']";
|
$output .= "['" . substr($index, 1) . "']";
|
||||||
} else {
|
|
||||||
if(eval("return is_object($output);")) {
|
|
||||||
// is object
|
|
||||||
if($this->security && substr($index, 1, 1) == '_') {
|
|
||||||
$this->_syntax_error('(secure) call to private object member is not allowed', E_USER_ERROR, __FILE__, __LINE__);
|
|
||||||
}
|
|
||||||
if(eval("return method_exists($output,'" . substr($index,1) . "');")) {
|
|
||||||
// object method reference
|
|
||||||
// parse parameters
|
|
||||||
if(isset($tag_attrs)) {
|
|
||||||
if(isset($tag_attrs['wrapper'])) {
|
|
||||||
$_object_wrapper = $tag_attrs['wrapper'];
|
|
||||||
unset($tag_attrs['wrapper']);
|
|
||||||
} else {
|
|
||||||
$_object_wrapper = $this->_object_wrapper;
|
|
||||||
}
|
|
||||||
if(isset($tag_attrs['assign'])) {
|
|
||||||
unset($tag_attrs['assign']);
|
|
||||||
}
|
|
||||||
if(!$_object_wrapper) {
|
|
||||||
// pass args as associative array
|
|
||||||
$index .= '(array(' . implode(',' , $tag_attrs) . '), $this)';
|
|
||||||
} else {
|
|
||||||
// pass args as separate parameters
|
|
||||||
$index .= '(' . implode(',' , array_values($tag_attrs)) . ')';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// no args for method
|
|
||||||
$index .= '()';
|
|
||||||
}
|
|
||||||
$output .= '->' . substr($index, 1);
|
|
||||||
} else {
|
|
||||||
// object property reference
|
|
||||||
$output .= "->" . substr($index, 1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// array reference
|
|
||||||
$output .= "['" . substr($index, 1) . "']";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (substr($index,0,2) == '->') {
|
} else if (substr($index,0,2) == '->') {
|
||||||
// object property reference syntax (deprecated)
|
if($this->security && substr($index,2,1) == '_') {
|
||||||
if($this->security && strstr($index, '->_')) {
|
|
||||||
$this->_syntax_error('(secure) call to private object member is not allowed', E_USER_ERROR, __FILE__, __LINE__);
|
$this->_syntax_error('(secure) call to private object member is not allowed', E_USER_ERROR, __FILE__, __LINE__);
|
||||||
} else {
|
} else {
|
||||||
|
// parse each parameter to the object
|
||||||
|
if(preg_match('!(?:\->\w+)+(?:(' . $this->_parenth_param_regexp . '))?!', $index, $match)) {
|
||||||
|
$index = str_replace($match[1], $this->_parse_parenth_args($match[1]), $index);
|
||||||
|
}
|
||||||
$output .= $index;
|
$output .= $index;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1455,6 +1406,21 @@ class Smarty_Compiler extends Smarty {
|
|||||||
return $output;
|
return $output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*======================================================================*\
|
||||||
|
Function: _parse_parenth_args
|
||||||
|
Purpose: parse arguments in function call parenthesis
|
||||||
|
\*======================================================================*/
|
||||||
|
function _parse_parenth_args($parenth_args)
|
||||||
|
{
|
||||||
|
preg_match_all('!' . $this->_param_regexp . '!',$parenth_args, $match);
|
||||||
|
$match = $match[0];
|
||||||
|
rsort($match);
|
||||||
|
reset($match);
|
||||||
|
$orig_vals = $match;
|
||||||
|
$this->_parse_vars_props($match);
|
||||||
|
return str_replace($orig_vals, $match, $parenth_args);
|
||||||
|
}
|
||||||
|
|
||||||
/*======================================================================*\
|
/*======================================================================*\
|
||||||
Function: _parse_conf_var
|
Function: _parse_conf_var
|
||||||
Purpose: parse configuration variable expression into PHP code
|
Purpose: parse configuration variable expression into PHP code
|
||||||
|
Reference in New Issue
Block a user