我正在编写一个TemplateView类,它用它的控制器集代码替换@somevariable@
占位符。 ViewHelpers通过占位符调用,例如模拟像@headerFiles()@
这样的函数。
缺少的是foreach循环定义,例如 smarty
{foreach from=$var key=index item=value}
定义。
到目前为止,我正在迭代控制器内的数据库对象,并为视图分配了heredok或字符串连接。因此控制器内部有很多html
,我认为不应该是控制器工作。
我已经在应用程序中实现了smarty以进行测试并且它正常工作 - 但是当我决定真正使用它时,我将不得不改变很多东西,例如所有部分模板都必须是.tpl文件和所有模板目录必须合并?或在一个地方等等。
所以我的问题是:
我可以使用任何好的示例或代码片段来实现自定义的foreach循环方法吗?在我必须改变一切以使用smarty之前。我也想避免使用像<?php foreach(): endforeach; ?>
更新
有什么顾虑会朝着这个方向发展?
在模板中:
@foreach array@
if($key !== 'fart'){
echo $val;
}
@endforeach@
class Foreacher {
private $template;
protected $array = array('fart' => 'poop', 'foo', 'bar');
public function __construct($template){
$this->template = file_get_contents($template);
}
public function parse(){
if(preg_match_all('/@foreach ([\w]+)@(.*?)@endforeach@/is', $this->template, $matches, PREG_SET_ORDER)){
$var = $matches[0][1];
$freach = "<?php foreach(\$this->$var as \$key => \$val){";
$freach .= $matches[0][2];
$freach .= "} ?>";
$parsed = str_replace($matches[0][0], $freach, $this->template);
$this->render($parsed);
}
}
public function __get($var){
if(isset($this->$var)){
return $this->$var;
}
return null;
}
protected function render($string){
$tmp = tmpfile();
fwrite($tmp, $string);
fseek($tmp, 0);
ob_start();
$file = stream_get_meta_data($tmp);
include $file['uri'];
$data = ob_get_clean();
fclose($tmp);
echo $data;
}
}