Создание шаблонизатора, который сканирует несколько уровней (Рекурсивный шаблонизатор) - PullRequest
0 голосов
/ 07 октября 2011

Я работаю над движком шаблонов, но мне нужна помощь.Это для кастомной CMF / CMS в oop.

На данный момент я собираю информацию из каждого документа (он работает на 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

Мой код работает, но только для первого уровня, я имею в виду, что он не будет сканироватьСистемные фрагменты в фрагментах, но они будут сканировать фрагменты внутри системных фрагментов.Таким образом, код сканируется в порядке системных фрагментов -> пользовательских фрагментов -> фрагментов.

Любые идеи о том, как заставить мой код сканировать несколько уровней, или я считаю, что он называется рекурсивным, но только до 4уровни, чтобы пользователи не перегружали его фрагментами, внутри фрагментов, внутри фрагментов и т. д.

Также вы можете видеть, что я «мог» повторно сканировать фрагменты, но это не то, чего я хочу достичьМне кажется плохое программирование повторять код, чтобы это исправить.

...