1: <?php
2: /**
3: * Smarty Internal Plugin Compile While
4: * Compiles the {while} tag
5: *
6: * @package Smarty
7: * @subpackage Compiler
8: * @author Uwe Tews
9: */
10:
11: /**
12: * Smarty Internal Plugin Compile While Class
13: *
14: * @package Smarty
15: * @subpackage Compiler
16: */
17: class Smarty_Internal_Compile_While extends Smarty_Internal_CompileBase
18: {
19: /**
20: * Compiles code for the {while} tag
21: *
22: * @param array $args array with attributes from parser
23: * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
24: * @param array $parameter array with compilation parameter
25: *
26: * @return string compiled code
27: * @throws \SmartyCompilerException
28: */
29: public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
30: {
31: $compiler->loopNesting++;
32: // check and get attributes
33: $_attr = $this->getAttributes($compiler, $args);
34: $this->openTag($compiler, 'while', $compiler->nocache);
35: if (!array_key_exists('if condition', $parameter)) {
36: $compiler->trigger_template_error('missing while condition', null, true);
37: }
38: // maybe nocache because of nocache variables
39: $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
40: if (is_array($parameter[ 'if condition' ])) {
41: if ($compiler->nocache) {
42: // create nocache var to make it know for further compiling
43: if (is_array($parameter[ 'if condition' ][ 'var' ])) {
44: $var = $parameter[ 'if condition' ][ 'var' ][ 'var' ];
45: } else {
46: $var = $parameter[ 'if condition' ][ 'var' ];
47: }
48: $compiler->setNocacheInVariable($var);
49: }
50: $prefixVar = $compiler->getNewPrefixVariable();
51: $assignCompiler = new Smarty_Internal_Compile_Assign();
52: $assignAttr = array();
53: $assignAttr[][ 'value' ] = $prefixVar;
54: if (is_array($parameter[ 'if condition' ][ 'var' ])) {
55: $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ][ 'var' ];
56: $_output = "<?php while ({$prefixVar} = {$parameter[ 'if condition' ][ 'value' ]}) {?>";
57: $_output .= $assignCompiler->compile(
58: $assignAttr,
59: $compiler,
60: array('smarty_internal_index' => $parameter[ 'if condition' ][ 'var' ][ 'smarty_internal_index' ])
61: );
62: } else {
63: $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ];
64: $_output = "<?php while ({$prefixVar} = {$parameter[ 'if condition' ][ 'value' ]}) {?>";
65: $_output .= $assignCompiler->compile($assignAttr, $compiler, array());
66: }
67: return $_output;
68: } else {
69: return "<?php\n while ({$parameter['if condition']}) {?>";
70: }
71: }
72: }
73:
74: /**
75: * Smarty Internal Plugin Compile Whileclose Class
76: *
77: * @package Smarty
78: * @subpackage Compiler
79: */
80: class Smarty_Internal_Compile_Whileclose extends Smarty_Internal_CompileBase
81: {
82: /**
83: * Compiles code for the {/while} tag
84: *
85: * @param array $args array with attributes from parser
86: * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
87: *
88: * @return string compiled code
89: */
90: public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
91: {
92: $compiler->loopNesting--;
93: // must endblock be nocache?
94: if ($compiler->nocache) {
95: $compiler->tag_nocache = true;
96: }
97: $compiler->nocache = $this->closeTag($compiler, array('while'));
98: return "<?php }?>\n";
99: }
100: }
101: