Расскажите, как использовать PHP в качестве шаблонизатора. Инклюдами что ли? Как выводите шаблоны, как внутри шаблонов используете переменные, циклы, условия. Поподробнее расскажите.
кто-то и так делает. А разве смарти не на PHP написан?! Насколько я помню именно на нём. Если не хотим пользоваться смарти пишем свой шаблонизатор. Я именно так и сделал. например это функция замены псевдопеременных в шаблоне: PHP: <? // parse function parse($template = NULL, $replace_array = NULL) { if($template == NULL) $this->tpl_error("Error. Bad argument "\$template" in function "parse()"."); if($replace_array == NULL) $this->tpl_error("Error. Bad argument "\$replace_array" in function "parse()"."); $i = 0; foreach($replace_array as $index => $value) { $search_array[$i] = "".$this->open_tag."".$index."".$this->close_tag.""; $i++; } if($this->parse_mode == (int)0): $result = str_replace($search_array, $replace_array, $template); elseif($this->parse_mode == (int)1): $result = str_ireplace($search_array, $replace_array, $template); elseif($this->parse_mode == (int)2): $result = preg_replace("/".$this->open_tag."([a-z A-Z_0-9]+)".$this->close_tag."/e", '( array_key_exists("${1}", $replace_array) )? $replace_array["${1}"]: $this->open_tag."${1}".$this->close_tag', $template, -1); endif; return($result); } // /parse помимо этой функции есть функция выборки чистых шаблонов в буфер, парсинг статических шаблонов, инициализация шаблонизатора, логирование и вывод ошибок. кажется всё. Это мне даёт быстрый и удобный инструмент для полноценной работы с шаблонами. Главное с умом этим пользоваться. А смарти - это монстр.
Вот ещё пример: PHP: <?php // index.php function parse($fname, $vars = array()) { foreach ($vars as $name => $value) { $$name = $value; } ob_start(); include $fname; return ob_get_clean(); } $records = array('Один', 'Два', 'Три'); $head = array('title' => 'Заголовок страницы'); print parse('body.php', array('records' => $records, 'head' => $head)); ?> PHP: <?=parse('head.php', $head)?> <!-- body.php --> <ul> <?foreach($records as $value) { ?> <li><?=$value?></li> <?}?> <ul> <?=parse('foot.php')?> PHP: <!-- head.php --> <html> <head> <title><?=$title?></title> </head> <body> PHP: <!-- foot.php --> </body> </html> На выходе: Код (Text): <!-- head.php --> <html> <head> <title>Заголовок страницы</title> </head> <body> <!-- body.php --> <ul> <li>Один</li> <li>Два</li> <li>Три</li> <ul> <!-- foot.php --> </body> </html> Сам что-то похожее использую, только вот все короткие теги перевожу к XML виду Код (Text): array('<?' => '<?php', '<?=' => '<?php print') и сохраняю шаблон в файле.
у меня на eval основано, шаблони компилируемые, с применением конструкций типа <if cond="$var">bla<else />blo</if> HTML: <html> <head> <title>{$DocTitle}</title> </head> <body> <if cond="$SomethingHere"> <a href="asd">12412</a> <else /> <a href="vvv">6666</a> </if> </body> </html> вызовы простые PHP: $TPL->LoadTemplate('_index.tpl', 'MainPage'); // тут код какойнить eval(Template::Parse('MainPage')); // можно ченить поделать с $TPL_TMP - там результат обработки шаблона return $TPL_TMP;
я использую технологию, при которой шаблоны рендерятся в html и применяются к страницам сайта до его опубликования, а в процессе вызова скрипта работает только бизнес-логика страницы, а не генерится шаблон, а потом уже запускается бизнес-логика. таким образом требуется дополнительная компиляция перед опубликованием, но зато экономится уйма рабочего времени и ресурсов на сервере.
stas_t Не совсем понял тебя... ты говоришь про предварительную генерацию всех страниц сайта? А если хоть на одной странице сайта есть динамика, например, список последних тем форума? Неужели фрейм?
Dagdamor шутите? если на странице есть динамические элементы -- используйте php. это и есть бизнес-логика (не важно, генерятся при этом реальные бабки, или просто таблица с результатами поиска). просто общие визуальные элементы, остающиеся одинаковыми на всех страницах сайта (page layout, если хотите), я не вижу смысла регенерировать при каждом запросе если их можно вставить в страницы заранее. вот смотрите, пример этого форума: здесь есть всего несколько страниц (index.php, viewforum.php, viewtopic.php, profile.php так навскидочку), у которых заголовок (до рекламы) и окончание страницы (Powered by...) абсолютно одинаковые и не требуют вообще никакой динамики. их спокойно можно было сгенерить до выкладывания на сервер. настоящая динамика начинается с меню. но даже меню я бы вставил в шаблон (так как оно появляется на всех страницах), просто две последние позиции отрисовывал бы не прямым html, а вызовом пхп-функций. да, кстати, я говорю не только о генерации статического сайта, но и пхп-страниц тоже. под бизнес-логикой я понимаю именно скрипты, которые на разных страницах выполняют разные действия. скрипты, которые для разных страниц генерируют одинаковый html, я предпочитаю переводить в чистый html и вставлять в страницу при помощи шаблонов до выкладывания на сервер.
stas_t Вот этого я не понимаю. Что значит, сгенерировать до выкладывания? Вы думаете, эти части дизайна в phpBB не в виде обычного HTML хранятся? Все шаблонизаторы работают одинаково - статические блоки в них хранятся как статические блоки, и отдаются при сборке страницы как статические блоки. Я по-прежнему не вижу отличий вашего подхода от общепринятого.
спасибо за сомнительный комплимент, но мне не кажется возможным, чтобы лебедев со своими артистами чесали рунет без подобного инструментария. а чёс начался задолго до выкладывания osb на sourceforge. dark-demon фреймы, действительно, очень удобная вещь. я, правда, использую не классические фреймсеты, а iframe-вариант. очень хорошо смотрится для размещения длинных списков в окошке с прокруткой и позволяет быстро открыть основную страницу пока подгружается весь список в окно. но здесь есть и серьёзный минус -- дело в том, что на одну страницу уходит два запроса к серверу. оба запроса проверяют сессию, права доступа, стучатся к базе каждый за своими данными... в общем, нагрузка возрастает. не говоря уже о том, что если эта технология используется в интернете (а не во внутренних системах), то вложенные страницы индексируются поисковиками и выдаются потом в результатах поиска без необходимой обёртки, а это не есть хорошо. поэтому насчёт "самого правильного решения" я бы не торопился. я бы сказал, что это решение подходящее для определённых ситуаций
зато каждую такую страницу ты можешь полноценно закешировать => нагрузка очень сильно падает. http://dark-demon.nm.ru/web/samples/xhtml/rightside.xml
stas_t Я уже удалил свою мессагу. Не хочу начинать новый флеймвар. Система мне не понравилась, звиняйте уж. Фреймы... о боги я про них упомянул совершенно не всерьез. Мне почему-то казалось, что использовать frame/iframe при генерации контента считается у разработчиков дурным тоном.
использование их (да и не только их) дурными разработчиками - является дурным тоном ;-) а так, фреймы не просто так придуманы были... пример?
у вас страница, на которой выдаётся список ваших... э-э... дел на сегодня. страница называется my_tasks.php и доступна для каждого пользователя в организации. пользователей... э-э... ну... Х человек. список должен быть сгенерён для вас и включать по выбору либо все ваши дела, либо все открытые дела на сегодня, либо открытые дела на текущую неделю. что будем кешировать?
dark-demon Насколько я знаю, фреймы были введены до появления полноценных серверных технологий, возможно даже до появления SSI. В то время это был единственный способ сборки сайта из шаблонов. Сейчас iframe'ы больше ассоциируются с баннерами, рекламой и генераторами траффика хотя конечно и метлу в квартире можно использовать по назначению...
stas_t, а что ты тут собираешься пихать во фрейм? впрочем, да, эту единственную страницу можно закэшировать допустим на 5 минут. Dagdamor, не думаю, что фреймы появились раньше ssi...
dark-demon в iframe я бы вынес собственно таблицу с заголовками и списком. вне фрейма останутся элементы управления (выбор фильтра, кнопка для подтверждения отмеченных дел как выполненых и пр.). если потребуется отсортировать список по полю, то делается это внутри фрейма без перезагрузки основной таблицы. хотелось бы уточнить, какую версию страницы будем кешировать? вариант "все"? или "сегодня"? или "недельку"? или сразу три? только для меня или для всех пользователей? напоминаю, страница во фрейме отображает список в зависимости от сессии текущего пользователя и параметров фильтра, который он выбрал. Dagdamor у меня фреймы вообще ни с чем не ассоциируются. кем и для чего они создавались -- меня абсолютно не волнует. когда понадобятся, они будут использованы. то же самое могу сказать и про другие тэги.
stas_t, вот поэтому использование фреймов и является дурным тоном посмотри как сделано это у меня на http://dark-demon.nm.ru/ (только не надо обсуждать кривость вёрстки, дизайна и тп ^_^) - вся навигация находится во фреймах. на самой же странице находится исключительно контент и ссылки на файлы с навигацией. параметры фильтра определяются буковками после знака вопроса - это основа REST-а. с учётом сессии есть смысл делать только конфиденциальные страницы - тут не только кэширование есть смысл отключить, но и шифрование применить.
dark-demon а по-моему, если страница не может быть кеширована, это ещё не значит, что "использование фреймов и является дурным тоном". у фреймов есть и плюсы, и минусы. даже не используя фреймов вы не сможете реализовать данную страницу без обращения к серверу. это совсем не значит, что написание серверных приложений является дурным тоном ;-) p.s. для каждого пользователя актуальна своя версия страницы. будем кешировать актуальные версии для всех пользователей?
не поэтому, а потому, что во фрейм выносят контент. а надо наоборот - всё не относящееся к контенту. да. каждый пользователь закеширует у себя свою страницу. впрочем, не помешает их и на серваке закешировать, чтобы при каждом обращении не генерировать её снова...
Столкнулся с такой проблемой: Интернет-магазин (Shop Script) использует Smarty, в котором я к сожалению не разбираюсь вообще. Нужно было изменить главную страницу - полез в шаблоны, попытался заменить теги Smarty на пхп - не сработало, попробовал закоментировать пхп чтоб он шел без обработки Smarty - тоже не сработало - подскажите, пожалуйста, можно ли использовать PHP в шаблонах для Smarty, если можно, то как?
шаблоны смарти "компилируются" в php код и потом исполняется именно этот код. по умолчанию он должен перед исполнением проверять, что оригинальная версия шаблона не изменилась, но иногда для увеличения быстродействия эту фичу отключают. поищите в руководстве смарти (у них есть и русский перевод мануала в очень читаемом варианте)