/** * 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]); } }
/** * 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; }