Циклы и темплейты

Циклы и темплейты

Здравствуйте!

Начал работать с темплейтами. Всё было понятно до того момента когда дошло до вывода данных из БД. Например

- Обычный темплейт -
template1.tpl
<b>{WELCOME}</b>, {USERNAME}!

template.php
PHP:
// Массив для замены
$content=file_get_contents("template1.tpl");
$lang['welcome']="Привет";
$lang['username']="Петя";
foreach($lang as $key=>$val)
{
      while (preg_match("/{".$key."}/",$content))
         {
               $content=str_replace("{".$key."}",$val,$content);
         }
}
echo $content; // Привет, Вася!
В таком варианте всё - чудесно, но когда надо вывести из БД строки, например пользователей, это проблема. Например:

-Сложный темплейт (скорее непонятный :))-
template2.tpl
<b>{WELCOME}</b>, {USERNAME}

Привет, Вася!
Привет, Петя!
Привет, Юра!

и таких юзеров есть n. Подскажите решение данной задачи.
Заранее спасибо.
 

WP

^_^
Решение - выпить йаду. И юзать нормальный шаблонизатор.
 

Фанат

oncle terrible
Команда форума
С добрым утром! =)
Удивительное открытие, правда? =)

У тебя есть три пути.
1 самый простой и самый гиморный - сделать так, как у тебя и написано: файл template2.tpl содержащий именно строчку
<b>{WELCOME}</b>, {USERNAME}
а в шаблон добавить конструкцию, которая обрабатывает инклюды.
но ты запаришься искать и редактировать все эти микрошаблончики.

2 - изобрести свой собственный аналог цикла чтобы писать его прямо в шаблоне, типа {{LOOP}} {{/LOOP}}

3 - использовать какой-нибудь шаблонизатор, который не изображает отсутствие логики, которая в шаблоне ВСЁ РАВНО ЕСТЬ, а открыто её и реализует.

к примеру, ты можешь написать шаблон на PHP
вместо
<b>{WELCOME}</b>, {USERNAME}
можно написать
<b><?=$WELCOME?></b>, <?=$USERNAME?>
а в цикле вывести с помощью конструкции
<? foreach ($DATA as $item): ??>
<b><?=$item['welcome']?></b>, <?=$item['username']?>
<? endforeach ?>

или воспользоваться аналогичной конструкцией в Smarty

-~{}~ 03.11.06 12:27:

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

WP

^_^
Фанат
Виноват, не повторится.
// разговор давичи был..
Curly-fingers
Однажды я шел по твоему пути и пытался сделать логику в шаблоне, и аналогичную задачу решил написав простейший парсер в котором был {for}, но потом понял что это убийство времени т.к. для того чтобы приблизиться по функциональности к одну из популярных, например Smarty нужно убить немало сил. А также пробовал создавать нечто вроде "компонентов", но этот вариант тоже не понравился, об этом написал Фанат. Остановился на Smarty.
А также стоит заметить, что твоя замена не требует аж двух циклов, а делается так:
PHP:
$content = str_replace(array_keys($lang),array_values($lang),$content);
 
Сверху