创建扫描多个级别的模板引擎(递归模板引擎)

时间:2011-10-06 20:23:50

标签: php oop recursion templating

我正在研究模板引擎,但需要一些帮助。它适用于oop中的自定义CMF / CMS。

目前正在抓取每个文档中的信息(它由mysql提供支持,但我正在缓存文档),然后用我的fte类处理它们:


<?php
/* FTE Class */
class fte {
    public $id;
    public $output;

    public function __construct($id, $data) {
        $this->id = $id;
        $this->output = $data;
    }

    public function process() {
        ob_start();
        include(CORE_PATH . 'assets/cache/documents/cache.' . $this->id . '.php');
        /* Settings */
        if(isset($cache['settings'])) {
            foreach($cache['settings'] as $key => $value) {
                $scan = "[@$key]";
                $replace = $value;
                $this->output = str_replace($scan, $replace, $this->output);
            }
        }
        /* System Snippet */
        if(isset($cache['system'])) {
            foreach($cache['system'] as $key => $value) {
                $scan = "[@$value]";
                $replace = $cache['document'][$value];
                $this->output = str_replace($scan, $replace, $this->output);
            }
        }
        /* Custom Snippet */
        if(isset($cache['custom'])) {
            foreach($cache['custom'] as $key => $value) {
                $scan = "{{@$key})";
                $replace = $value;
                $this->output = str_replace($scan, $replace, $this->output);
            }
        }
        /* Snippet */
        if(isset($cache['snippet'])) {
            foreach($cache['snippet'] as $key => $value) {
                $scan = "{@$key}";
                $replace = $value;
                $this->output = str_replace($scan, $replace, $this->output);
            }
        }

        /* Return */
        return $this->output;
        ob_end_flush();  
    }
}
?>

如您所见,有3种类型的标签,

[@] - System Snippets
{{@}} - Custom Snippets
{@} - Snippets

我的代码可以工作,但只适用于第一级,我的意思是它不会扫描片段中的系统片段,但它会扫描系统片段内的片段。 所以代码是按照系统片段的顺序扫描 - &gt;自定义代码段 - &gt;片段。

关于我如何使我的代码扫描多个级别的任何想法,或者我认为它被称为递归,但最多只说4个级别,因此用户不会使用片段,片段内部,片段内部等等来重载它?

另外你可以看到我“可以”重新扫描片段,但这不是我想要实现的,感觉就像糟糕的编程让我重复代码来解决这个问题。

0 个答案:

没有答案