|
1 <?php |
|
2 /** |
|
3 * Smarty Internal Plugin Compile For |
|
4 * |
|
5 * Compiles the {for} {forelse} {/for} tags |
|
6 * |
|
7 * @package Smarty |
|
8 * @subpackage Compiler |
|
9 * @author Uwe Tews |
|
10 */ |
|
11 |
|
12 /** |
|
13 * Smarty Internal Plugin Compile For Class |
|
14 * |
|
15 * @package Smarty |
|
16 * @subpackage Compiler |
|
17 */ |
|
18 class Smarty_Internal_Compile_For extends Smarty_Internal_CompileBase { |
|
19 |
|
20 /** |
|
21 * Compiles code for the {for} tag |
|
22 * |
|
23 * Smarty 3 does implement two different sytaxes: |
|
24 * |
|
25 * - {for $var in $array} |
|
26 * For looping over arrays or iterators |
|
27 * |
|
28 * - {for $x=0; $x<$y; $x++} |
|
29 * For general loops |
|
30 * |
|
31 * The parser is gereration different sets of attribute by which this compiler can |
|
32 * determin which syntax is used. |
|
33 * |
|
34 * @param array $args array with attributes from parser |
|
35 * @param object $compiler compiler object |
|
36 * @param array $parameter array with compilation parameter |
|
37 * @return string compiled code |
|
38 */ |
|
39 public function compile($args, $compiler, $parameter) |
|
40 { |
|
41 if ($parameter == 0) { |
|
42 $this->required_attributes = array('start', 'to'); |
|
43 $this->optional_attributes = array('max', 'step'); |
|
44 } else { |
|
45 $this->required_attributes = array('start', 'ifexp', 'var', 'step'); |
|
46 $this->optional_attributes = array(); |
|
47 } |
|
48 // check and get attributes |
|
49 $_attr = $this->getAttributes($compiler, $args); |
|
50 |
|
51 $output = "<?php "; |
|
52 if ($parameter == 1) { |
|
53 foreach ($_attr['start'] as $_statement) { |
|
54 $output .= " \$_smarty_tpl->tpl_vars[$_statement[var]] = new Smarty_Variable;"; |
|
55 $output .= " \$_smarty_tpl->tpl_vars[$_statement[var]]->value = $_statement[value];\n"; |
|
56 } |
|
57 $output .= " if ($_attr[ifexp]){ for (\$_foo=true;$_attr[ifexp]; \$_smarty_tpl->tpl_vars[$_attr[var]]->value$_attr[step]){\n"; |
|
58 } else { |
|
59 $_statement = $_attr['start']; |
|
60 $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]] = new Smarty_Variable;"; |
|
61 if (isset($_attr['step'])) { |
|
62 $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->step = $_attr[step];"; |
|
63 } else { |
|
64 $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->step = 1;"; |
|
65 } |
|
66 if (isset($_attr['max'])) { |
|
67 $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->total = (int)min(ceil((\$_smarty_tpl->tpl_vars[$_statement[var]]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$_statement[var]]->step)),$_attr[max]);\n"; |
|
68 } else { |
|
69 $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->total = (int)ceil((\$_smarty_tpl->tpl_vars[$_statement[var]]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$_statement[var]]->step));\n"; |
|
70 } |
|
71 $output .= "if (\$_smarty_tpl->tpl_vars[$_statement[var]]->total > 0){\n"; |
|
72 $output .= "for (\$_smarty_tpl->tpl_vars[$_statement[var]]->value = $_statement[value], \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration = 1;\$_smarty_tpl->tpl_vars[$_statement[var]]->iteration <= \$_smarty_tpl->tpl_vars[$_statement[var]]->total;\$_smarty_tpl->tpl_vars[$_statement[var]]->value += \$_smarty_tpl->tpl_vars[$_statement[var]]->step, \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration++){\n"; |
|
73 $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->first = \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration == 1;"; |
|
74 $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->last = \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration == \$_smarty_tpl->tpl_vars[$_statement[var]]->total;"; |
|
75 } |
|
76 $output .= "?>"; |
|
77 |
|
78 $this->openTag($compiler, 'for', array('for', $compiler->nocache)); |
|
79 // maybe nocache because of nocache variables |
|
80 $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; |
|
81 // return compiled code |
|
82 return $output; |
|
83 } |
|
84 |
|
85 } |
|
86 |
|
87 /** |
|
88 * Smarty Internal Plugin Compile Forelse Class |
|
89 * |
|
90 * @package Smarty |
|
91 * @subpackage Compiler |
|
92 */ |
|
93 class Smarty_Internal_Compile_Forelse extends Smarty_Internal_CompileBase { |
|
94 |
|
95 /** |
|
96 * Compiles code for the {forelse} tag |
|
97 * |
|
98 * @param array $args array with attributes from parser |
|
99 * @param object $compiler compiler object |
|
100 * @param array $parameter array with compilation parameter |
|
101 * @return string compiled code |
|
102 */ |
|
103 public function compile($args, $compiler, $parameter) |
|
104 { |
|
105 // check and get attributes |
|
106 $_attr = $this->getAttributes($compiler, $args); |
|
107 |
|
108 list($openTag, $nocache) = $this->closeTag($compiler, array('for')); |
|
109 $this->openTag($compiler, 'forelse', array('forelse', $nocache)); |
|
110 return "<?php }} else { ?>"; |
|
111 } |
|
112 |
|
113 } |
|
114 |
|
115 /** |
|
116 * Smarty Internal Plugin Compile Forclose Class |
|
117 * |
|
118 * @package Smarty |
|
119 * @subpackage Compiler |
|
120 */ |
|
121 class Smarty_Internal_Compile_Forclose extends Smarty_Internal_CompileBase { |
|
122 |
|
123 /** |
|
124 * Compiles code for the {/for} tag |
|
125 * |
|
126 * @param array $args array with attributes from parser |
|
127 * @param object $compiler compiler object |
|
128 * @param array $parameter array with compilation parameter |
|
129 * @return string compiled code |
|
130 */ |
|
131 public function compile($args, $compiler, $parameter) |
|
132 { |
|
133 // check and get attributes |
|
134 $_attr = $this->getAttributes($compiler, $args); |
|
135 // must endblock be nocache? |
|
136 if ($compiler->nocache) { |
|
137 $compiler->tag_nocache = true; |
|
138 } |
|
139 |
|
140 list($openTag, $compiler->nocache) = $this->closeTag($compiler, array('for', 'forelse')); |
|
141 |
|
142 if ($openTag == 'forelse') { |
|
143 return "<?php } ?>"; |
|
144 } else { |
|
145 return "<?php }} ?>"; |
|
146 } |
|
147 } |
|
148 |
|
149 } |
|
150 |
|
151 ?> |