[ Index ]

PHP Cross Reference of vtigercrm-6.1.0

title

Body

[close]

/libraries/Smarty/libs/sysplugins/ -> smarty_internal_compile_foreach.php (source)

   1  <?php
   2  /**
   3   * Smarty Internal Plugin Compile Foreach
   4   *
   5   * Compiles the {foreach} {foreachelse} {/foreach} tags
   6   *
   7   * @package Smarty
   8   * @subpackage Compiler
   9   * @author Uwe Tews
  10   */
  11  
  12  /**
  13   * Smarty Internal Plugin Compile Foreach Class
  14   *
  15   * @package Smarty
  16   * @subpackage Compiler
  17   */
  18  class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase {
  19      /**
  20       * Attribute definition: Overwrites base class.
  21       *
  22       * @var array
  23       * @see Smarty_Internal_CompileBase
  24       */
  25      public $required_attributes = array('from', 'item');
  26      /**
  27       * Attribute definition: Overwrites base class.
  28       *
  29       * @var array
  30       * @see Smarty_Internal_CompileBase
  31       */
  32      public $optional_attributes = array('name', 'key');
  33      /**
  34       * Attribute definition: Overwrites base class.
  35       *
  36       * @var array
  37       * @see Smarty_Internal_CompileBase
  38       */
  39      public $shorttag_order = array('from','item','key','name');
  40  
  41      /**
  42       * Compiles code for the {foreach} tag
  43       *
  44       * @param array  $args      array with attributes from parser
  45       * @param object $compiler  compiler object
  46       * @param array  $parameter array with compilation parameter
  47       * @return string compiled code
  48       */
  49      public function compile($args, $compiler, $parameter)
  50      {
  51          $tpl = $compiler->template;
  52          // check and get attributes
  53          $_attr = $this->getAttributes($compiler, $args);
  54  
  55          $from = $_attr['from'];
  56          $item = $_attr['item'];
  57          if (!strncmp("\$_smarty_tpl->tpl_vars[$item]", $from, strlen($item) + 24)) {
  58              $compiler->trigger_template_error("item variable {$item} may not be the same variable as at 'from'", $compiler->lex->taglineno);
  59          }
  60  
  61          if (isset($_attr['key'])) {
  62              $key = $_attr['key'];
  63          } else {
  64              $key = null;
  65          }
  66  
  67          $this->openTag($compiler, 'foreach', array('foreach', $compiler->nocache, $item, $key));
  68          // maybe nocache because of nocache variables
  69          $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
  70  
  71          if (isset($_attr['name'])) {
  72              $name = $_attr['name'];
  73              $has_name = true;
  74              $SmartyVarName = '$smarty.foreach.' . trim($name, '\'"') . '.';
  75          } else {
  76              $name = null;
  77              $has_name = false;
  78          }
  79          $ItemVarName = '$' . trim($item, '\'"') . '@';
  80          // evaluates which Smarty variables and properties have to be computed
  81          if ($has_name) {
  82              $usesSmartyFirst = strpos($tpl->source->content, $SmartyVarName . 'first') !== false;
  83              $usesSmartyLast = strpos($tpl->source->content, $SmartyVarName . 'last') !== false;
  84              $usesSmartyIndex = strpos($tpl->source->content, $SmartyVarName . 'index') !== false;
  85              $usesSmartyIteration = strpos($tpl->source->content, $SmartyVarName . 'iteration') !== false;
  86              $usesSmartyShow = strpos($tpl->source->content, $SmartyVarName . 'show') !== false;
  87              $usesSmartyTotal = strpos($tpl->source->content, $SmartyVarName . 'total') !== false;
  88          } else {
  89              $usesSmartyFirst = false;
  90              $usesSmartyLast = false;
  91              $usesSmartyTotal = false;
  92              $usesSmartyShow = false;
  93          }
  94  
  95          $usesPropFirst = $usesSmartyFirst || strpos($tpl->source->content, $ItemVarName . 'first') !== false;
  96          $usesPropLast = $usesSmartyLast || strpos($tpl->source->content, $ItemVarName . 'last') !== false;
  97          $usesPropIndex = $usesPropFirst || strpos($tpl->source->content, $ItemVarName . 'index') !== false;
  98          $usesPropIteration = $usesPropLast || strpos($tpl->source->content, $ItemVarName . 'iteration') !== false;
  99          $usesPropShow = strpos($tpl->source->content, $ItemVarName . 'show') !== false;
 100          $usesPropTotal = $usesSmartyTotal || $usesSmartyShow || $usesPropShow || $usesPropLast || strpos($tpl->source->content, $ItemVarName . 'total') !== false;
 101          // generate output code
 102          $output = "<?php ";
 103          $output .= " \$_smarty_tpl->tpl_vars[$item] = new Smarty_Variable; \$_smarty_tpl->tpl_vars[$item]->_loop = false;\n";
 104          if ($key != null) {
 105              $output .= " \$_smarty_tpl->tpl_vars[$key] = new Smarty_Variable;\n";
 106          }
 107          $output .= " \$_from = $from; if (!is_array(\$_from) && !is_object(\$_from)) { settype(\$_from, 'array');}\n";
 108          if ($usesPropTotal) {
 109              $output .= " \$_smarty_tpl->tpl_vars[$item]->total= \$_smarty_tpl->_count(\$_from);\n";
 110          }
 111          if ($usesPropIteration) {
 112              $output .= " \$_smarty_tpl->tpl_vars[$item]->iteration=0;\n";
 113          }
 114          if ($usesPropIndex) {
 115              $output .= " \$_smarty_tpl->tpl_vars[$item]->index=-1;\n";
 116          }
 117          if ($usesPropShow) {
 118              $output .= " \$_smarty_tpl->tpl_vars[$item]->show = (\$_smarty_tpl->tpl_vars[$item]->total > 0);\n";
 119          }
 120          if ($has_name) {
 121              if ($usesSmartyTotal) {
 122                  $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['total'] = \$_smarty_tpl->tpl_vars[$item]->total;\n";
 123              }
 124              if ($usesSmartyIteration) {
 125                  $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['iteration']=0;\n";
 126              }
 127              if ($usesSmartyIndex) {
 128                  $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['index']=-1;\n";
 129              }
 130              if ($usesSmartyShow) {
 131                  $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['show']=(\$_smarty_tpl->tpl_vars[$item]->total > 0);\n";
 132              }
 133          }
 134          $output .= "foreach (\$_from as \$_smarty_tpl->tpl_vars[$item]->key => \$_smarty_tpl->tpl_vars[$item]->value){\n\$_smarty_tpl->tpl_vars[$item]->_loop = true;\n";
 135          if ($key != null) {
 136              $output .= " \$_smarty_tpl->tpl_vars[$key]->value = \$_smarty_tpl->tpl_vars[$item]->key;\n";
 137          }
 138          if ($usesPropIteration) {
 139              $output .= " \$_smarty_tpl->tpl_vars[$item]->iteration++;\n";
 140          }
 141          if ($usesPropIndex) {
 142              $output .= " \$_smarty_tpl->tpl_vars[$item]->index++;\n";
 143          }
 144          if ($usesPropFirst) {
 145              $output .= " \$_smarty_tpl->tpl_vars[$item]->first = \$_smarty_tpl->tpl_vars[$item]->index === 0;\n";
 146          }
 147          if ($usesPropLast) {
 148              $output .= " \$_smarty_tpl->tpl_vars[$item]->last = \$_smarty_tpl->tpl_vars[$item]->iteration === \$_smarty_tpl->tpl_vars[$item]->total;\n";
 149          }
 150          if ($has_name) {
 151              if ($usesSmartyFirst) {
 152                  $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['first'] = \$_smarty_tpl->tpl_vars[$item]->first;\n";
 153              }
 154              if ($usesSmartyIteration) {
 155                  $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['iteration']++;\n";
 156              }
 157              if ($usesSmartyIndex) {
 158                  $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['index']++;\n";
 159              }
 160              if ($usesSmartyLast) {
 161                  $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['last'] = \$_smarty_tpl->tpl_vars[$item]->last;\n";
 162              }
 163          }
 164          $output .= "?>";
 165  
 166          return $output;
 167      }
 168  }
 169  
 170  /**
 171   * Smarty Internal Plugin Compile Foreachelse Class
 172   *
 173   * @package Smarty
 174   * @subpackage Compiler
 175   */
 176  class Smarty_Internal_Compile_Foreachelse extends Smarty_Internal_CompileBase {
 177  
 178      /**
 179       * Compiles code for the {foreachelse} tag
 180       *
 181       * @param array  $args array with attributes from parser
 182       * @param object $compiler compiler object
 183       * @param array  $parameter array with compilation parameter
 184       * @return string compiled code
 185       */
 186      public function compile($args, $compiler, $parameter)
 187      {
 188          // check and get attributes
 189          $_attr = $this->getAttributes($compiler, $args);
 190  
 191          list($openTag, $nocache, $item, $key) = $this->closeTag($compiler, array('foreach'));
 192          $this->openTag($compiler, 'foreachelse', array('foreachelse', $nocache, $item, $key));
 193  
 194          return "<?php }\nif (!\$_smarty_tpl->tpl_vars[$item]->_loop) {\n?>";
 195      }
 196  
 197  }
 198  
 199  /**
 200   * Smarty Internal Plugin Compile Foreachclose Class
 201   *
 202   * @package Smarty
 203   * @subpackage Compiler
 204   */
 205  class Smarty_Internal_Compile_Foreachclose extends Smarty_Internal_CompileBase {
 206  
 207      /**
 208       * Compiles code for the {/foreach} tag
 209       *
 210       * @param array  $args      array with attributes from parser
 211       * @param object $compiler  compiler object
 212       * @param array  $parameter array with compilation parameter
 213       * @return string compiled code
 214       */
 215      public function compile($args, $compiler, $parameter)
 216      {
 217          // check and get attributes
 218          $_attr = $this->getAttributes($compiler, $args);
 219          // must endblock be nocache?
 220          if ($compiler->nocache) {
 221              $compiler->tag_nocache = true;
 222          }
 223  
 224          list($openTag, $compiler->nocache, $item, $key) = $this->closeTag($compiler, array('foreach', 'foreachelse'));
 225  
 226          return "<?php } ?>";
 227      }
 228  
 229  }
 230  
 231  ?>


Generated: Fri Nov 28 20:08:37 2014 Cross-referenced by PHPXref 0.7.1