Esempio n. 1
0
 /**
  * Analyses a template file content (string) and extracts the blocks
  *
  * @param string $tpl the template in which to look for blocks
  * @return void
  * @see self::$blocks
  */
 protected function searchBlocks($tpl)
 {
     $r = array();
     $blockStarts = array();
     $blockEnds = array();
     preg_match_all('#{block([[:blank:]]*)name=(' . tpltools::$varreg . '+)(.*)}#U', $tpl, $r, PREG_OFFSET_CAPTURE);
     foreach ($r[0] as $k => $match) {
         $p = tpltools::readParams($match[0]);
         $blockStarts[] = array($match[1], strlen($match[0]), $p['params']);
     }
     preg_match_all('#{/block}#', $tpl, $r, PREG_OFFSET_CAPTURE);
     foreach ($r[0] as $match) {
         $blockEnds[] = $match[1];
     }
     $s = sizeof($blockStarts);
     for ($i = 0; $i < $s; $i++) {
         for ($j = $i + 1; $j < $s; $j++) {
             if ($blockStarts[$j][0] < $blockEnds[$i]) {
                 $tmp = $blockEnds[$j];
                 $blockEnds[$j] = $blockEnds[$i];
                 $blockEnds[$i] = $tmp;
             }
         }
     }
     foreach ($blockStarts as $k => $b) {
         $this->blocks[$b[2]['name']][] = array('content' => substr($tpl, $b[0] + $b[1], $blockEnds[$k] - $b[0] - $b[1]), 'command' => substr($tpl, $b[0], $b[1]), 'params' => $b[2]);
     }
 }
Esempio n. 2
0
 /**
  * Replaces template logic tags by PHP logic and control structures
  * Also replaces the user functions
  *
  * @param string $tpl the template string to process
  * @return string processed template string
  */
 public static function logicAndTags($tpl)
 {
     preg_match_all('#{(.*)}#U', $tpl, $tags);
     foreach ($tags[1] as $k => $tag) {
         $a = explode(' ', $tag);
         $t = $a[0];
         $a[0] = '';
         $a = implode(' ', $a);
         $r = false;
         if ($t == 'if') {
             $r = '<?php if (' . $a . '): ?>';
         } elseif ($t == 'elseif') {
             $r = '<?php elseif (' . $a . '): ?>';
         } elseif ($t == 'else') {
             $r = '<?php else: ?>';
         } elseif ($t == '/if') {
             $r = '<?php endif; ?>';
         } elseif ($t == 'foreach') {
             $t = preg_split('/ as /i', $a);
             $t[0] = trim($t[0]);
             $t[1] = trim($t[1]);
             $foreach_vars = explode('=>', $t[1]);
             $foreach_id = uniqid();
             $r = '<?php if (isset(' . $t[0] . ') && is_array(' . $t[0] . ') && count(' . $t[0] . ') > 0): ' . PHP_EOL . '$_tpl->assign("_keys_' . $foreach_id . '", array_keys(' . $t[0] . ')); ' . PHP_EOL . '$_tpl->assign("_length_' . $foreach_id . '", count(' . $t[0] . ')); ' . PHP_EOL . '$_tpl->assign("_loop_' . $foreach_id . '", 0); ' . PHP_EOL . 'while ($_loop_' . $foreach_id . ' < $_length_' . $foreach_id . '): ' . PHP_EOL . '$_tpl->assign("' . substr(trim($foreach_vars[(count($foreach_vars) + 1) % 2]), 1) . '", ' . $t[0] . '[$_keys_' . $foreach_id . '[$_loop_' . $foreach_id . ']]); ' . PHP_EOL . (count($foreach_vars) == 2 ? '$_tpl->assign("' . substr(trim($foreach_vars[0]), 1) . '", $_keys_' . $foreach_id . '[$_loop_' . $foreach_id . ']); ' : '') . PHP_EOL . '$_tpl->assign("_loop_' . $foreach_id . '", $_loop_' . $foreach_id . ' + 1); ' . '?>';
         } elseif ($t == 'foreachelse') {
             $foreachelse_id = uniqid();
             $r = '<?php endwhile; else:' . PHP_EOL . '$_tpl->assign("_foreachelse_' . $foreachelse_id . '", true); ' . PHP_EOL . 'while ($_foreachelse_' . $foreachelse_id . '):' . PHP_EOL . '$_tpl->assign("_foreachelse_' . $foreachelse_id . '", false); ' . '?>';
         } elseif ($t == '/foreach') {
             $r = '<?php endwhile; endif; ?>';
         } elseif ($t == 'while') {
             $r = '<?php while(' . $a . '): ?>';
         } elseif ($t == '/while') {
             $r = '<?php endwhile; ?>';
         } elseif ($t == 'for') {
             $args = tpltools::readParams('{' . $tag . '}');
             $args = $args['params'];
             $args['step'] = isset($args['step']) ? $args['step'] : (isset($args['to']) ? 1 : -1);
             $for_id = uniqid();
             $r = '<?php' . PHP_EOL . '$_tpl->assign("_loop_' . $for_id . '", ' . $args['from'] . '); ' . PHP_EOL . 'while ($_loop_' . $for_id . (isset($args['to']) ? ' <= ' . $args['to'] : ' >= ' . $args['downto']) . '): ' . PHP_EOL . '$_tpl->assign("' . $args['var'] . '", $_loop_' . $for_id . '); ' . PHP_EOL . '$_tpl->assign("_loop_' . $for_id . '", $_loop_' . $for_id . ' + ' . $args['step'] . '); ' . '?>';
         } elseif ($t == '/for') {
             $r = '<?php endwhile; ?>';
         } elseif (preg_match('#^(' . tpltools::$filereg . '+)$#', $t)) {
             if (in_array($tags[0][$k], tpltools::$specials)) {
                 $r = str_replace(tpltools::$specials, tpltools::$rspecials, $tags[0][$k]);
             } else {
                 $p = tpltools::readparams($tags[0][$k]);
                 $r = '<?php echo tplfunction_' . $p['function'] . '(array(';
                 $t = [];
                 foreach ($p['params'] as $param => $val) {
                     $t[] = '"' . $param . '"=>' . ($val != '' && $val[0] == '$' ? $val : '"' . $val . '"');
                 }
                 $r .= implode(',', $t);
                 $r .= '), $_tpl); ?>';
             }
         }
         if ($r !== false) {
             $tpl = str_replace($tags[0][$k], $r, $tpl);
         }
     }
     return $tpl;
 }