Мысли о буферах

Спасибо одному замечательному человеку за то, что почти с самого начала разработки «шаблонизатора» я пошел по неправильному пути. Использовать callback для перехвата буферизованного вывода — не всегда хорошая идея. Выводить нельзя, но и буферизацию еще раз сделать нельзя. Следовательно нельзя тупо заинклудить шаблон. В результате приходится изобретать «PHP на PHP» чтобы в шаблоне из файла можно было сделать простой if.

А ведь с самого начала я хотел либо запускать finish из страницы ручками, либо из auto_append_file’а. И почему меня смутила эта лишняя строчка в .htaccess — одному аллаху известно.
Вобщем теперь PGT примерно в полтора раза меньше, а извраты с заменой <?...?> на eval остались только в самых страшных кошмарах.

Запись опубликована в рубрике Микро-хаки. Добавьте в закладки постоянную ссылку.

8 комментариев: Мысли о буферах

  1. Михаил говорит:

    А почем не используются уровни буферизации (вложенность буферов) ?
    (см. ob_get_level() )
    Или почему нельзя сделать свой «над-буфер», сохранить в него содержимое из стандартного буфера, очищать стандратный и буферизировать себе спокойно дальше ?

  2. kolo говорит:

    Причем тут ob_get_level. В самом коллбеке (в котором требуется засунуть сбуферизированное в шаблон и закончить все это щастъе) вобще нельзя использовать буферизацию и нельзя ничего отправлять в браузер. Проверьте ;) А значит единственный вариант из него читать шаблон как файл и прогонять сквозь eval. Изврат.

  3. Михаил говорит:

    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();

  4. Михаил говорит:

    Проверю вечером, но мне всегда казалось, что подобная конструкция должна работать.

  5. kolo говорит:

    Тоже конструкция. Но у меня интереснее.

  6. kolo говорит:

    < ? start("This is page title", TRUE, TRUE); ?>
    Some content with < ? echo "php-code"; ?>
    < ? finish(); ?>

    И в таком виде все страницы сайта. а апачевым auto_prepend_file приаттачивается скрипт, в котором описаны start и finish пихающие это дело в дизаин. Задача была избавится от finish в странице.

  7. РБ говорит:

    Я уж думал ты наконец-то напишешь о буферах. Оказалось, о [бип] очередной.

  8. kolo говорит:

    А че о них писать?)

Комментарии запрещены.