Спасибо одному замечательному человеку за то, что почти с самого начала разработки «шаблонизатора» я пошел по неправильному пути. Использовать callback для перехвата буферизованного вывода – не всегда хорошая идея. Выводить нельзя, но и буферизацию еще раз сделать нельзя. Следовательно нельзя тупо заинклудить шаблон. В результате приходится изобретать «PHP на PHP» чтобы в шаблоне из файла можно было сделать простой if.
А ведь с самого начала я хотел либо запускать finish из страницы ручками, либо из auto_append_file’а. И почему меня смутила эта лишняя строчка в .htaccess – одному аллаху известно.
Вобщем теперь PGT примерно в полтора раза меньше, а извраты с заменой <?...?> на eval остались только в самых страшных кошмарах.
А почем не используются уровни буферизации (вложенность буферов) ?
(см. ob_get_level() )
Или почему нельзя сделать свой «над-буфер», сохранить в него содержимое из стандартного буфера, очищать стандратный и буферизировать себе спокойно дальше ?
Причем тут ob_get_level. В самом коллбеке (в котором требуется засунуть сбуферизированное в шаблон и закончить все это щастъе) вобще нельзя использовать буферизацию и нельзя ничего отправлять в браузер. Проверьте ;) А значит единственный вариант из него читать шаблон как файл и прогонять сквозь eval. Изврат.
function page_callback( $input ) { return ‘__PAGE_START___’ . $input . ‘__PAGE_END__’; }
function template_callback( $input ) { return ‘__TEMPLATE_START__’ . $input . ‘__TEMPLATE_END__’; }
function process_page() {
foreach ( $templates as $tpl ) {
ob_start( ‘template_callback’ );
include( $template_file_name );
ob_end_flush();
}
}
// MAIN
ob_start( ‘page_callback’ );
process_page();
ob_end_flush();
Проверю вечером, но мне всегда казалось, что подобная конструкция должна работать.
Тоже конструкция. Но у меня интереснее.
< ? start("This is page title", TRUE, TRUE); ?>
Some content with < ? echo "php-code"; ?>
< ? finish(); ?>
И в таком виде все страницы сайта. а апачевым auto_prepend_file приаттачивается скрипт, в котором описаны start и finish пихающие это дело в дизаин. Задача была избавится от finish в странице.
Я уж думал ты наконец-то напишешь о буферах. Оказалось, о [бип] очередной.
А че о них писать?)