Как подключить к шаблону динамический контент?

Страшный Злодей

Бывший член клуба (достало хамство).
Как подключить к шаблону динамический контент?

Пишу микро-CMS для управления маленьким сайтом. Сайт строится из блоков примерно следующим образом:
PHP:
$templ = "tpl/template.php";  // собственно сам шаблон
$vars[head] = file_get_contents("templates/head.php"); // верхняя часть страницы
$vars[right] = file_get_contents("templates/right.php"); // правая часть страницы
$vars[left] = file_get_contents("templates/left.php"); // левая часть страницы

// Функция обрабатывающая шаблон -------------------
function show_tpl($vars, $template)
  {
     $tpl = file_get_contents($template);
         foreach($vars as $k=>$v)
         {
          $tpl=str_replace('{{'.$k.'}}', $v, $tpl);
         }
     $tpl=preg_replace('|{{.*?}}|si','',$tpl);
     echo $tpl;
  }
//-------------------------------------------------
show_tpl($vars, "$templ");
Если бы сайт был полностью статичным, то все бы работало без проблем, но мне нужно динамически
формировать правую часть страницы, т.е. "$vars
". Функция "file_get_contents" естественно просто
считывает файл не выполняя кода, а "include", выполняется немедленно и соответственно "инклюдит"
правую часть, до всего остального кода... Пожалуйста, не пинайте, а подскажите как решаются подобные
задачи?​
 

Wicked

Новичок
очень часто они решаются с помощью перехвата буфера - т.е. в итоге получаем, что результат вывода include у нас сохраняется в переменную. Читай про [m]ob_start[/m], [m]ob_get_contents[/m], [m]ob_end_clean[/m].
 

Страшный Злодей

Бывший член клуба (достало хамство).
Wicked
да, это идея, но мне почему-то кажется (не бейте только..), что должно быть какое-то более красивое решение... Задачка то видимо встречается более чем часто...

В любом случае спасибо за совет, если ничего больше не придумаю, то буду через буфер решать.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Укажите файл через http://
но, думаю, лучше так как Wicked указал
Так-как http запросы медленнее чем include
 

Wicked

Новичок
более красиво - инклюдить файл именно тогда, когда его аутпуту будет самое время.

-~{}~ 26.07.07 01:12:

Mr_Max
ты в своем уме? :)
 

Страшный Злодей

Бывший член клуба (достало хамство).
Автор оригинала: Mr_Max
Укажите файл через http://
но, думаю, лучше так как Wicked указал
Так-как http запросы медленнее чем include
http запросы - к сожалению, не подходят, именно по названой вами причине :( ...

Автор оригинала: Wicked
более красиво - инклюдить файл именно тогда, когда его аутпуту будет самое время.
В общем-то я так и хочу сделать... Но как это реализовать, хотя бы в теории? Верю, что должен быть красивый и легкий путь ;)
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума

Страшный Злодей

Бывший член клуба (достало хамство).
Mr_Max
Я в курсе и ссылки видел и между прочим, я даже ответил на тот пост ;)

Просто очень не хочется использовать буферизацию, Подозреваю, что уж сильно эта штука код путает, особенно когда несколько "инклудов" сделать нужно и к "памяти" сервера, наверное, все эти "ob_" не равнодушны... Или ошибаюсь?

-~{}~ 25.07.07 22:36:

Автор оригинала: Mr_Max
Ещё [m]exec[/m]
"exec" вроде тоже не рекомендуют использовать...
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Просто очень не хочется использовать буферизацию, Подозреваю, что уж сильно эта штука код путает, особенно когда несколько "инклудов" сделать нужно и к "памяти" сервера, наверное, все эти "ob_" не равнодушны... Или ошибаюсь?
инклюдить файл именно тогда, когда его аутпуту будет самое время.
 

Страшный Злодей

Бывший член клуба (достало хамство).
Mr_Max

Ну, вот как например, в описанном мною примере "инклюдить файл именно тогда, когда его аутпуту будет самое время."? Я об этом и спрашиваю...
 

Wicked

Новичок
Например, в файле tpl/template.php пишется
PHP:
<div class="head-block">
  <?php include("templates/head.php") ?>
</div>
<div class="left-block">
  <?php include("templates/left.php") ?>
</div>
<div class="right-block">
  <?php include("templates/right.php") ?>
</div>
Затем файл tpl/template.php инклюдится, когда нужно вывести всю морду целиком.
 

Страшный Злодей

Бывший член клуба (достало хамство).
Wicked
Ну да... так и есть. В принципе всегда так раньше и делал, да вот купился на идею "разделения кода, дизайна и контента". Тормоз я блин! Wicked спасибо, что вернул на путь истиный! :)
 

Sokil.Dmytro

Новичок
дизайн не отделить от кода только по той простой причине что в шаблонах все равно встречаются переменные :)

самый нормальный вариатн и самый элегантный есть буферизация - считал вывод в переменную и выдал в нужном месте хоть 10 раз
 

AmdY

Пью пиво
Команда форума
самый нормальный вариатн это использовать способ Wicked. инклуд в шаблонах - это нормально
 

Wicked

Новичок
В принципе всегда так раньше и делал, да вот купился на идею "разделения кода, дизайна и контента".
Что значит купился? Ты, наверное, слегка не понял. Такое разделение - это хорошо. И, в принципе, разумное использование PHP в качестве еще и для описания темплейтов никуда тебя от этого не уводит. На мой взгляд хороший пример использования пхпшных темплейтов - фрэймворк Symfony.

Еще у меня есть подозрение, что раньше ты делал так называемую лапшу -- это когда и представление, и логика контроллера, и м.б. даже модель перемешаны в кучу. А это действительно плохо.
 

Страшный Злодей

Бывший член клуба (достало хамство).
Автор оригинала: Wicked
Еще у меня есть подозрение, что раньше ты делал так называемую лапшу -- это когда и представление, и логика контроллера, и м.б. даже модель перемешаны в кучу. А это действительно плохо.
Подозрения, абсолютно верны, каюсь... не бейте братцы ;)

Я в основном писал отдельные скрипты, для специфических задач, мало связанных с программированием сайтов, к тому же и ПХПистов знакомых нет, а все же, живое наставничество очень важно, его не заменить ни книгами, ни google.com (ИМХО), т.е. источниками по которым, в основном и изучаю PHP...

-~{}~ 26.07.07 14:13:

А все-таки, какой вариант предпочтителен: инклуд в шаблонах или через буферизацию? Понятно, что в разных задачах, решения могут быть разные, но чем обусловлен выбор в том или ином случае? Какие минусы и плюсы у того и другого подхода?
 

Фанат

oncle terrible
Команда форума
Да никто тебя не бьёт.
просто надо понять, что означает понятие "дизайн".
когда начинаешь разбираться, то выходит, что имел в виду "шаблон".
когда дальше начинаешь разбираться, то выходит, что шаблон без управляющих структур не бывает.
отсюда выходит, что совсем выкинуть код из шаблона невозможно.
но можно разделить код приложения и код отображения.

но лучше всего разобраться в этих понятиях помогает ответ на вопрос "зачем?".
вот тебе - зачем отделять код от дизайна?

-~{}~ 26.07.07 14:21:

А все-таки, какой вариант предпочтителен: инклуд в шаблонах или через буферизацию?
в принципе, все равно.
это не тот вопрос, который должен тебя занимать.
что тебе удобнее - то и используй.
 

Bakti9rov

!*|=?
Страшный Злодей
Инклюды - куда поставил, там и вывелось. А output buffer - еще следить надо, сколько раз вызван ob_start()...
 
Сверху