Кто пользовался, на что следует обратить внимание, внедряя Smarty в свои проекты? А то после прочтения его описания все как-то слишком уж хорошо и гладко получается.. О чем же дипломатично умолчал мануал?) Smarty соответственно последней версии.
К примеру о том, что порой что бы добраться до переменных каких либо приходиться писать вот так: PHP: {$smarty.somethinginternal.foreach.froeachname.someparam.value} на деле у меня порой получалось и длинее. а Ифы вообще выглядели ужастно, особенно если с && или || --- я выбрал plain php в качестве шаблонизатора.
Psih если не секрет, это в каком именно случае и на сколько часто такие случаи наступают?) и что за plain php, если не секрет?)
Да при построении любой более-менее сложной таблицы почти 100% придётся таким геммороем заниматься, эт факт. Plain PHP - HTML с PHP вставками. На мой вкус выглядет куда изащьнее и опрятнее чем Smarty + 100% гибкость в отличии от smarty.
Psih аа.. такой шаблонизатор - здорово, если программист, верстальщик и дизайнер - одно и то же лицо..) а в общем, практика и выявит недостатки smarty. всем спасибо.
Ты знаешь, свершенно разные люди вобще-то Ему то какая разница PHP вставки или Smarty вставки - для него это ахинея так или иначе PHP: {$foo} // или <?=$foo?> // или такая конструкция {foreach from=$array key=somekey item=someitem} <tr> <td>{$key} = {$someitem.somekey}</td> </tr> {/foreach} // и <? foreach ($array as $key => $value){?> <tr> <td><?=$key.' = '.$value['somekey']?></td> </tr> <?}?> // а такая конструкция в Smarty вообще не существует <? for ($i = 0, $cnt = count($array); $i < $cnt; $i++){?> <td><?=$array[$i]['something']?></td> <? if ($i % 4 == 0){ echo '</tr><tr>'; } }?> PHP даже понятнее, темболее верстальшики обычно всё же немного знакомы с азами PHP или тем языком, с которым они работают. PHP куда гибче, и быстрее. А for цикл куда быстрее чем foreach, и калькуляции можно делать любые, я уже не говорю о том, что можно вызвать ЛЮБУЮ функцию которую надо - никаких плагинов не нужно даже писать...
svk phpBB - зло! надо написать собственный форум! Psih что мешает сделать тот же шаблон для оформления например 1 ссылки? напрм, такой: Код (Text): <a class='{$href.class}' href='{$href.href}' title='{$href.title}' onclick='{$href.onclick}' onmouseover='{$href.onmouseover}' onmouseout='{$href.onmouseout}' > {$href.body} </a> и далее PHP: <? ... $smarty->assign('href',$href); $smarty->display('link.tpl'); ... ?>
для решения такой супер задачи просто необходимо пристегнуть ~350Кб либу, генерить в templates_c (0777) из шаблона smarty-php-бредокод (он сам сгенериться, но для его последующего применения все-равно каждый раз будет запускаться php), держать все в как минимум 2 файлах (php и tpl), и все это лишь для удовольствия заявить "я использую smarty!"... Что тут сказать? - каждому свое...
avm мм, удивлен, что оказывается собираюсь использовать smarty только для этого вышеприведенный фрагмент - это ответ на неудобность использования foreach в smarty, и не более того. а ну и что собственно, что на каталоге права 777? ничто не мешает поставить на него же апач-авторизацию и жестко обломать героя, решившего туда шелл залить
Smarty может не каждый раз компилироваться, при его вызове. Т.е. один раз скомпилировался, получился php-код и потом уже вызывается непосредственно этот код, без разбора шаблона. Так же есть возможность кеширования.
Никогда автоматически генерированный код не превзойдёт акуратно и оптимизировано написанный руками код. Создание самого экземпляра smarty который весит немеренно уже не лёгкая работа для РHP + вам надо ещё кучу места под компилированные шаблоны. А вы что, будете держать проверку модификации шаблонов всё время включённой что бы при смене он их скомпилировал? Вот вам уже одно неудобство, надо при смене шаблонов включать и потом отключать проверку. Лана, я откапаю какой-нить шаблон средней сложности, которые вполне часто встречаються, завтра запостим и посмотрим
естественно, иначе это было бы вообще ненужным этапом. Но вот каковы преимущества того кода что генерит смарти? он громоздок, и неэффективен. И зачастую даже шаблонизация "на лету" (не посредством смарти) может оказаться быстрее чем тот скомпилированный код. И при чем тут кеширование? оно ж не только в смарти используется... мало того, некоторые вообще делают так что если на странице нет персонификации - создается статическая страница на которую травится mod_rewrite (в этом случае php вообще не дергается при отдаче страницы, да и клиенское кеширование не симулированное). DarkElf, я говорил о том что есть вещи, которые следует делать без смарти-анд-компани. Например - какой-нибудь download.php с докачкой и антиличем, или страница с одной ссылкой как вы и говорили...
На одном форуме (ныне, к сожалению, практически мертвом) я как-то высказывался на тему Smarty. Не обессудьте - я просто скопирую свою мессагу оттуда.
Mavir вот тебе шаблон средней сложности, с JavaScript кодом и не маленьким циклом. Сделай мне его на Smarty коде и посмотрим, что будет выглядеть красивее (а уж мой шаблон будет работать 100% быстрее и есть НАМНОГО меньше оперативки) PHP: <script> function build_sort_menu(selected){ var selection = new Array(4); var cancel_button = ''; for (i = 1; i < selection.length; i++){ if (i == selected){ selection[i] = 'style="color: red"'; cancel_button = '<tr>'+ '<td colspan="2" bgcolor="#E6E6E6" height="1" style="padding: 0px"></td>'+ '</tr>'+ '<tr>'+ '<td align="center" colspan="2">'+ '<button onfocus="this.blur();" onclick="document.location.href = \'/video/<?=$parser->get('current_folder')?>/0.html\'" style="width: 90px"><?=_("Отменить")?></button>'+ '</td>'+ '</tr>'; }else{ selection[i] = ''; } } menu = '<table border="1" cellspacing="0" cellpadding="0" style="border-collapse: collapse" bordercolor="#DDDDDD">'+ '<tr>'+ '<td>'+ '<table border="0" width="100%" cellspacing="0" cellpadding="0">'+ '<tr>'+ '<td bgcolor="#FBF9FA"><table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td style="padding: 7px 11px 7px 11px"><?=_("У Вас есть возможность сортировать<br>видеоролики по следующим признакам:")?></td><td valign="top"><img src="/images/menu/close.gif" style="margin-top: 3px; margin-right: 3px;" onclick="overdiv=0; close_context_menu(); return false;"></td><tr></table></td>'+ '</tr>'+ '<tr>'+ '<td bgcolor="#E6E6E6" height="1"></td>'+ '</tr>'+ '<tr>'+ '<td bgcolor="#FFFFFF" height="1"></td>'+ '</tr>'+ '<tr>'+ '<td>'+ '<table border="0" width="100%" bgcolor="#FFFFFF" cellspacing="4" style="filter:alpha(opacity=95); -moz-opacity:0.95;">'+ '<tr>'+ '<td align="right" width="10"><img src="/images/mnu_item.gif" width="3" height="5"></td>'+ '<td style="padding-left: 4px"><a href="/video/<?=$parser->get('current_folder')?>/1.html" '+ selection[1] +'><?=_("по рейтингу")?></a></td>'+ '</tr>'+ '<tr>'+ '<td align="right" width="10"><img src="/images/mnu_item.gif" width="3" height="5"></td>'+ '<td style="padding-left: 4px"><a href="/video/<?=$parser->get('current_folder')?>/2.html" '+ selection[2] +'><?=_("по количеству комментариев")?></a></td>'+ '</tr>'+ cancel_button + '</table>'+ '</td>'+ '</tr>'+ '</table>'+ '</td>'+ '</tr>'+ '</table>'; if(navigator.family =="nn4"){ document.object1.document.write(menu); document.object1.document.close(); document.object1.left = x + 15; document.object1.top = y - 5; }else if(navigator.family =="ie4" || navigator.family == "opera"){ obj = document.getElementById("object1"); obj.innerHTML = menu; obj.style.pixelLeft = x + 15; obj.style.pixelTop = y - 5; }else if(navigator.family == "gecko"){ document.getElementById("object1").innerHTML = menu; document.getElementById("object1").style.left = x - 40; document.getElementById("object1").style.top = y + 15; } showdiv = 1; overdiv = 1; } </script> <table width="100%" cellspacing="0" cellpadding="0" border="0"> <tr> <td align="left" nowrap="nowrap" style="padding-left: 4px; padding-top: 5px;"><button onfocus="this.blur();" type="button" onclick="build_sort_menu('<?=$parser->get('current_sort')?>'); return false;"><?=$parser->get('current_sort') ? '<img src="/images/settings_bullet.gif"> ' : ''?><?=_("Настройки")?></button></td> </tr> <? if (!$parser->is_set('video_list')){ ?> <tr> <td align="center" height="130"> <?=_("В Видеогалерее ещё нет видеороликов")?>.<br> </td> </tr> <?}else{?> <tr> <td align="center" style="height: 14px;"><?=$parser->get('paging_video')?></td> </tr> <tr> <td align="center" colspan="2" style="padding: 0px 0px 14px 0px;"> <table width="100%" cellspacing="0" border="0" cellpadding="0"> <tr> <? $nl = 0; foreach ($parser->get('video_list') as $row) { ?> <td align="center" valign="top"> <table cellpadding="0" cellspacing="0" border="0" width="132"> <tr> <td align="center" valign="top" style="padding-top: 14px;"> <table cellpadding="0" cellspacing="0" border="0" width="128"> <tr> <td> <table cellpadding="0" cellspacing="0" border="0" width="124" height="9"> <tr> <? if ($row['vid_votes'] > 0){ ?> <td align="center" style="font-size: 9px"><img src="/images/votes.gif" width="15" height="9" title="<?=_("Количество оценок")?>"></td> <td align="center" style="padding-left: 6px; font-size: 9px" title="<?=_("Количество оценок")?>"><?=$row['vid_votes']?></td> <td align="right" style="padding-right: 6px;" width="100%"><? for($i = 0; $i < 5; $i++){ if ($i + 1 > $row['vid_mark'] && $i < $row['vid_mark']) echo '<img src="/images/vote_half.gif" width="9" height="9" title="'._("Средний балл").'">'; else if ($i < $row['vid_mark']) echo '<img src="/images/vote.gif" width="9" height="9" title="'._("Средний балл").'">'; else if ($i >= $row['vid_mark']) echo '<img src="/images/vote_empty.gif" width="9" height="9" title="'._("Средний балл").'">'; } ?> </td> <td align="center" style="font-size: 9px" title="<?=_("Средний балл")?>"><?=$row['vid_mark']?></td> <?}else{?> <td height="9"> </td> <?}?> </tr> </table> </td> </tr> <tr> <td align="center"><div class="profile_box_outline" style="position: relative"><a href="/video/play/<?=$row['vid_id']?>/video.html"><img src="<?=$row['vid_video_preview']?>" width="124" height="93" hspace="1" vspace="1" border="0"></a></div></td> </tr> </table> </td> </tr> <tr> <td align="center" class="text_gray"><?=$row['vid_creation_date']?></td> </tr> <tr> <td align="center"><?=$row['vid_descr']?></td> </tr> </table> </td> <? if (++$nl == 4){ echo '</tr><tr>'; $nl = 0; }}?> </tr> </table> </td> </tr> <tr> <td><?=$parser->get('paging_video')?></td> </tr> <?}?> <tr> <td> <table width="100%" cellpadding="0" cellspacing="0" border="0"> <tr> <td class="shdr_bg" height="20"> </td> </tr> </table> <table width="100%" cellpadding="0" cellspacing="0" border="0" class="shdr_background"> <tr> <? $nl = 0; foreach($parser->get('video_folders_list') as $row){?> <td align="center" valign="top" style="padding-top: 10px; padding-bottom: 10px;" width="20%"> <table cellpadding="0" cellspacing="0" border="0"> <tr> <td align="center"><a href="/video/<?=$row['vdf_id']?>.html"><img src="/images/gallery_folder_public_<?=$parser->get('current_folder') == $row['vdf_id'] ? 'on' : 'off'?>.gif"></a></td> </tr> <tr> <td align="center"><?=$row['vdf_name']?></td> </tr> </table> </td> <? if (++$nl == 4) {echo '</tr><tr>'; $nl = 0;} }?> </tr> <tr> <td height="10"></td> </tr> </table> </td> </tr> </table> P.S. Да, кстати, один момент сводящий не то что Smarty но и любой на него похожий шаблонизатор - gettext - попробуйте подружить их вместе, о результатах скажете P.S.S. Вообщем то избавлю вас от этого, скажу сразу - полная и 100% не совместимость. Gettext понимает только конструкцию _("text here") - никакие плагины не помогут, gettext не может принимать как параметр функции переменные, т.к. иначе вы не пропарсите его, что бы потом сделать переводы. Остаёться только единственный вариант, маленький лёгкий шаблонизатор + шаблоны с PHP вставками.
Это про меня? Я не перевариваю такие большие куски кода. Строк 10-20 еще бы посмотрел, а этот код только прокрутил. Наверное, вообще бы и маленький код не смотрел - оно мне не надо.
>>Дико неудобно сделаны спецтеги по умолчанию, любая открывающая >>фигурная скобка считается началом Смарти-тега, поэтому без танцев с >>бубном не напишешь ни таблицу стилей, ни джава-скрипт; о да, $smarty->left_delimiter = '<smarty>'; $smarty->right_delimiter = '</smarty>'; это неподъемно.
мм, в общем и целом, тема перешла из разряда "на что обратить внимание при использовании smarty" в "а нах он нужен". в общем и целом, всем спасибо.