/** Рекурсивная функция разворачивает все INSERT блоки и возвращает развернутый шаблон @param $tpl_content - Текст шаблона @param $tpl_path - Путь к шаблону @param $parent_file - внутренний параметер используется для рекурсивного обхода INSERT блоков. Путь к родительскому файлу внутри которого разворачивается текущий INSERT @return возвращает развернутый шаблон */ private function do_insert_blocks($tpl_content, $tpl_path, $parent_file = '') { // получение списока INSERT блоков $insert_blocks = $this->find_blocks('INSERT', $tpl_content); if (!$insert_blocks) { return $tpl_content; } // обработка каждого INSERT блока foreach ($insert_blocks as $insert_block) { foreach ($insert_block as $tpl_file_name => $preassign_content) { } if (!file_exists($tpl_path . $tpl_file_name)) { echo "Can not find teamplate file '" . $tpl_path . $tpl_file_name . "' in parent teamplate file: '" . $parent_file . "'\n"; exit; } // Загрузка шаблона указанного в INSERT блоке $insert_content = file_get_contents($tpl_path . $tpl_file_name); // удаление коментариев /* */ и // $insert_content = $this->strip_comments($insert_content); // Получение древовидного массива всех блоков с метками для ассайна их в заргужаемый шаблон $preassign_data = $this->get_preassign_data($preassign_content); // асайн древовидного массива статический меток $preassign_tpl = new strontium_tpl(); $preassign_tpl->open_buffer($insert_content); $preassign_tpl->assign(0, $preassign_data['marks']); // ассайн дерева блоков с меткаими в заргужаемый шаблон $preassign_tpl->assign_array($preassign_data); $preassigned_content = $preassign_tpl->result_content; // поиск временных блоковых меток и замена их на заполненное содержимое этих блоков preg_match_all("/<<-(.*)->>/Us", $preassigned_content, $extract); $list_blocks = $extract[1]; if ($list_blocks) { foreach ($list_blocks as $block_name) { $block_src = $this->find_block('BLOCK', $block_name, $insert_content); $preassigned_content = str_replace("<<-" . $block_name . "->>", '<!-- START BLOCK : ' . $block_name . ' -->' . $block_src . '<!-- END BLOCK : ' . $block_name . ' -->', $preassigned_content); } } // поскольку вместо INSERT блока вставляется содержимое этого блока, // то если в содержимом блоке встретится INSERT блок, то к нему надо дописать текущий путь. $insert_path_prefix = $this->get_file_path($tpl_file_name); // рекурсивный запуск для поиска новых INSERT блоков в загруженном шаблоне $preassigned_content = $this->do_insert_blocks($preassigned_content, $tpl_path . $insert_path_prefix, $tpl_file_name); // замена текущего INSERT блока сформированными данными $tpl_content = $this->replace_block('INSERT', $tpl_content, $tpl_file_name, $preassigned_content); } return $tpl_content; }