示例#1
0
 /**
     Рекурсивная функция разворачивает все 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;
 }