diff --git a/change_log.txt b/change_log.txt index 202966b0a..10a0169cc 100644 --- a/change_log.txt +++ b/change_log.txt @@ -1,3 +1,5 @@ + - fix foreachelse on arrayiterators https://github.com/smarty-php/smarty/issues/506 + ===== 3.1.34 release ===== 05.11.2019 13.01.2020 - fix typo in exception message (JercSi) diff --git a/libs/sysplugins/smarty_internal_compile_foreach.php b/libs/sysplugins/smarty_internal_compile_foreach.php index 78b45ea7e..42814582b 100644 --- a/libs/sysplugins/smarty_internal_compile_foreach.php +++ b/libs/sysplugins/smarty_internal_compile_foreach.php @@ -192,7 +192,7 @@ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) $this->openTag( $compiler, 'foreach', - array('foreach', $compiler->nocache, $local, $itemVar, empty($itemAttr) ? 1 : 2) + array('foreach', $compiler->nocache, $local, $itemVar, empty($itemAttr) ? 0 : 1) ); // maybe nocache because of nocache variables $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; @@ -219,8 +219,9 @@ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) if (isset($itemAttr[ 'index' ])) { $output .= "{$itemVar}->index = -1;\n"; } - $output .= "if (\$_from !== null) {\n"; + $output .= "{$itemVar}->do_else = true;\n"; $output .= "foreach (\$_from as {$keyTerm}{$itemVar}->value) {\n"; + $output .= "{$itemVar}->do_else = false;\n"; if (isset($attributes[ 'key' ]) && isset($itemAttr[ 'key' ])) { $output .= "\$_smarty_tpl->tpl_vars['{$key}']->value = {$itemVar}->key;\n"; } @@ -296,7 +297,7 @@ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) if ($restore === 2) { $output .= "{$itemVar} = {$local}saved;\n"; } - $output .= "}\n} else {\n?>"; + $output .= "}\nif ({$itemVar}->do_else) {\n?>"; return $output; } }