Я писал лишь из-за того, что short_tags on надо использовать в шаблонах. А в скриптах short_tags off.
Его цель примитив а не функционал (это скрипт из статьи подобной той на которую я дал ссылку и не предназначен для использования а только для иллюстрации)
ну, коли пошла такая пьянка, то вот и мой php-native шаблонизатор: Код (Text): function inc ($scriptPath) { static $exeCounter= 0; ++$exeCounter; $scriptArgs= func_get_args(); $scriptPath= realpath($scriptPath.'.inc'); $Path= dirname($scriptPath).'/'; ob_start(); $rets= include ($scriptPath); $obs= ob_get_clean(); return ($obs==='') ? $rets : $obs; } шаблон: Код (Text): <? extract($scriptArgs[1]) ?> <?='<?xml version="1.0" encoding="' . $_encoding . '"?>';?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" > <channel> <title><?=$title;?></title> <link>http://<?=$_SERVER['HTTP_HOST'];?></link> <description><?=$desc;?></description> <generator><?=$gen;?></generator> <language><?=$lang;?></language> <? foreach ($items as $item): ?><item> <title><?=$item['title'];?></title> <link><?=$item['link'];?></link> <pubDate><?=_rfcDate($item['date']);?></pubDate> <description><![CDATA[<?=$item['desc'];?>]]></description> <content><![CDATA[<?=$item['msg']?>;]]></content> </item> <? endforeach; ?> </channel> </rss> использование: Код (Text): $pars= array(); $pars['title']= 'Test RSS Feed'; $pars['desc']= 'RSS Feed generated by PHPS Parser 1.0'; $pars['gen']= 'PHPS Parser 1.0'; $pars['lang']= 'RU'; $items = array(); // Test data for ($i = 0; $i < 3; $i++) { $items[] = array( 'title' => 'Title #' . $i, 'link' => 'http://localhost/news/' . $i . '/', 'date' => time() + $i * 10, 'desc' => 'Description #' . $i, 'msg' => 'Message #' . $i, ); } $pars['items']= $items; inc ('out/rss',$pars)
dark-demon PHP: <?=_rfcDate($item['date']);?> Заменить забыл на PHP: <?=date('r', $item['date']);?> И забыл PHP: <?global $_encoding;?>
Sergey89, не суть важно вообще, тут лучше использовать два вложенных шаблона - один формирует хидеры http и xml, а другой собственно тело документа. ps: и никаких global в шаблоне быть не должно...
http://www.massassi.com/php/articles/template_engines/ посмотрел. Ничего не увидел. Функционал такой же. Смысл шаблонизатора по сравнению с чистым пхп: 1) Разделение ХТМЛ разметки и кода - целиком. Они пишутся разными людьми с по-разному устроенными мозгами. Дизайнер не должен писать <? foreach(... ... if (..) ?> <table ...> <? } ?> <tr> а кодер не должен описывать условие выполнения между <tr style="padding:..."><td><div ...> Разделение логики функционала и отображения (холивар смарти) стоит обсудить отдельно. 2) Упрощение обработки таблиц в цикле. HTML: <!-- BEGIN row --> <tr bgcolor="{BGCOLOR}" onMouseOver="javascript: this.style.background={BGCOLOR1}" onMouseOut="javascript: this.style.background='{BGCOLOR}'" > <td align=center>{II}</td> <td align=center><b style='color: #283C42'>{CL_ID}</b></td> <td align=center>{CL_REG_DATE}</td> <td align=center>{STATUS}</td> <td>{CL_FIO}</td> <td>{CL_TEL}</td> <td align=center>{ON_ICON}</td> <td align=center>{CL_ONTIP_ICO}</td> <td>{CL_ADRES}</td> <td align=center><a title="карточка клиента" href=mylink&id={CL_ID}><img src=img/ico.edit.gif border=0></a></td> </tr> <!-- END row --> Это пир. Верстальщик пишет это совершенно не задумываясь откуда что берется, а кодер НЕ ВИДИТ и не желает видеть как это будет в сборе и что как показывается. Смена шаблона может совершенно не менять пхп-код, даже если часть его будет работать впустую. Кешировать часто надо по изменениям, а не времени. Функция ->get() нужна чаще и возвращает строку, а сразу выводит функция ->show()
armadillo почуй разницу между активными и пассивными шаблонами. Ты привёл пример пассивного шаблона, я ниже пример активного. Был вариант: Код (Text): <?use $_encoding?> <?type 'text/xml'?> <?=_tag('xml version="1.0" encoding="' . $_encoding . '"')?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" > <channel> <?set 'info', $info?> <?get 'info.tpl'?> <?foreach($items as $item):?> <item> <?set 'item', $item?> <?get 'item.tpl'?> </item> <?end?> </channel> </rss> Каждый шаблон имеет своё пространство имён. Поэтому мы и передаём туда данные принудительно из родительского шаблона. Насчёт global поясни.
Обсуждалось и не раз, вывод везде один, разделение ПОЛНОСТЬЮ нереально (либо дизайнер пишет логику, либо программист пишет шаблоны, либо между ними ещё ставится верстальщик который пишет всякие "foreach if else итд" подгоняя дизайн под двиг)
а что тут пояснять? результат отработки шаблона должен зависеть только от переданных ему параметров, а не от погоды на марсе впрочем, global ещё можно обойти, а вот если в шаблоне используются static классы, то совсем туши свет...
global - это своего рода захват параметров. Тоесть шаблон сам забирает переменную из вне. Я его применяю, когда хочу использовать в шаблоне какую-то системную переменную. Для передачи данных, предназначенных имено для вывода контента, используется Parser::setVar. Ещё раз говорю - это что-то вроде пространства имён. Чтобы функции применяемые в шаблоне не висели в глобальной области видимости.
тебе не кажется, что той подпрограмме, которая передаёт парметры шаблонизатору виднее в какой кодировке они закодированы? я бы ещё понял, чтобы шаблонизатор автоматически перекодировал в нужную кодировку, но вот так вот полагаться, что данные могут придти в одной единственной кодировке... ну а я ещё раз повторю, что AnySingleton::callMyFunction() ничем не лучше AnySingleton_callMyFunction()
dark-demon с чего ты взял, что это синглетон? Это неймспэйс. Ты лучше скажи чем AnySingleton_callMyFunction лучше AnySingleton::callMyFunction?
Писал парсер для своего проекта CMF. Кодировка жёстко задавалась в настройках. Если бы я хотел использовать всюду в проекте разную кодировку, я бы и сделал, как ты сказал.
банально потому, что в пхп нет "пространств имён" а "статические" классы фактически являются глобальныи объектами - синглетонами. одним символом меньше.
Синлетон, обязан гарантировать существования класса в единственной экземпляре. PHP: $tpl = new Parser(); $tpl2 = new Parser(); Где здесь пахнет синглетоном? Имено такой ответ я и готов был услышать.
да, но это не означает что надо начхать на разделение и лепить вообще без цели. <!-- BEGIN row --> понятно и верстальщику и кодеру, HTML: </form> {if $listCat != ""} {foreach from=$listCat item=cat} <tr bgcolor="#ffffff" onMouseOver="this.style.background='#dddddd'" OnMouseOut="this.style.background='White'"> <td width=24 align="center" {if $cat.on_site_about == ''}bgcolor=gray{/if}>{$cat.on_id}</td> <td align="center"> {if $cat.cn_type == '1'}<b>А</b> {elseif $cat.cn_type == '2'}<b>Пр</b> {elseif $cat.cn_type == '3'}<b>По</b> {/if} </td> понятно только программисту. И лучше уж я сам это напишу, чем потом править за тем, что наворотит верстальщик, то есть основной смысл шаблонизатора исчезает. Если у тебя есть время полностью перелопачивать скинутую тебе нарезку - флаг в руки, а я лучше жене время уделю, а шаблон сделаю понятным для верстальщика и свою работу на него перекладывать не буду. Даже если иногда придется делать <span style="display:{CAT_TYPE1}>А</span> <span style="display:{CAT_TYPE2}>Пр</span> и обрабатывать условия отображения в коде. Тем более что в часто это условие задает какой запрос и бОльшая часть нагрузки должна работать, не надо отрабатывать все варианты. $tpl->setVariable("CAT_TYPE",func($cattype)); где func - функция с другим шаблоном.
Как ты поступишь ситуации, применяя пассивные шаблоны, когда допустим надо вывести строки таблицы поочерёдно меняя цвет их фона?
Тоже спорное утверждение, (если уж моё мнение для тебя не авторитетно что вполне логично, оно даже для меня не авторитетно) почитай phpclub там много авторитетных мнений на эту тему Само собой не значит, а где я так сказал ?
PHP: $tpl->setCurrentBlock("row") ; $tpl->setVariable("BGCOLOR", getImpColor($с_imp_id)) ; if($с_result_id != 0) { $tpl->setVariable("BGCOLOR", "#E8E8E8") ; } $tpl->parseCurrentBlock("row") ; подавляющее большинство таких задач решается пассивными шаблонами. Как вынести этот функционал поудобнее - стоит обсудить.
armadillo и где же здесь отделение кода от разметки? Код (Text): #E8E8E8 Это по твоему не относится к HTML?