You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

smarty_internal_compile_for.php 6.6KB

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