如何实现自定义foreach模板视图方法

时间:2016-02-17 19:00:49

标签: php html templating smarty3

我正在编写一个TemplateView类,它用它的控制器集代码替换@somevariable@占位符。 ViewHelpers通过占位符调用,例如模拟像@headerFiles()@这样的函数。

缺少的是foreach循环定义,例如 smarty
 {foreach from=$var key=index item=value}定义。

到目前为止,我正在迭代控制器内的数据库对象,并为视图分配了heredok或字符串连接。因此控制器内部有很多html,我认为不应该是控制器工作。

我已经在应用程序中实现了smarty以进行测试并且它正常工作 - 但是当我决定真正使用它时,我将不得不改变很多东西,例如所有部分模板都必须是.tpl文件和所有模板目录必须合并?或在一个地方等等。

所以我的问题是:
我可以使用任何好的示例或代码片段来实现自定义的foreach循环方法吗?在我必须改变一切以使用smarty之前。我也想避免使用像<?php foreach(): endforeach; ?>

这样的纯PHP

更新
有什么顾虑会朝着这个方向发展?

在模板中:

 @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;
      }
 }

0 个答案:

没有答案