За последние 24 часа нас посетили 29618 программистов и 1817 роботов. Сейчас ищут 777 программистов ...

Smarty: подводные камни, о которых умолчал мануал:)

Тема в разделе "Прочие вопросы по PHP", создана пользователем DarkElf, 29 янв 2007.

  1. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Кто пользовался, на что следует обратить внимание, внедряя Smarty в свои проекты?

    А то после прочтения его описания все как-то слишком уж хорошо и гладко получается..

    О чем же дипломатично умолчал мануал?)

    Smarty соответственно последней версии.
     
  2. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    К примеру о том, что порой что бы добраться до переменных каких либо приходиться писать вот так:
    PHP:
    1.  
    2. {$smarty.somethinginternal.foreach.froeachname.someparam.value}
    3.  
    на деле у меня порой получалось и длинее. а Ифы вообще выглядели ужастно, особенно если с && или || --- я выбрал plain php в качестве шаблонизатора.
     
  3. Anonymous

    Anonymous Guest

    Ага — {literal} - спасение всех любителей inline-JavaScript.... тот еще гемор.
     
  4. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Psih

    если не секрет, это в каком именно случае и на сколько часто такие случаи наступают?)

    и что за plain php, если не секрет?)
     
  5. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Да при построении любой более-менее сложной таблицы почти 100% придётся таким геммороем заниматься, эт факт.

    Plain PHP - HTML с PHP вставками. На мой вкус выглядет куда изащьнее и опрятнее чем Smarty + 100% гибкость в отличии от smarty.
     
  6. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Psih

    аа.. такой шаблонизатор - здорово, если программист, верстальщик и дизайнер - одно и то же лицо..)

    а в общем, практика и выявит недостатки smarty.

    всем спасибо.
     
  7. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Ты знаешь, свершенно разные люди вобще-то :) Ему то какая разница PHP вставки или Smarty вставки - для него это ахинея так или иначе :D
    PHP:
    1. {$foo}
    2. // или
    3. <?=$foo?>
    4.  
    5. // или такая конструкция
    6. {foreach from=$array key=somekey item=someitem}
    7. <tr>
    8.     <td>{$key} = {$someitem.somekey}</td>
    9. </tr>
    10. {/foreach}
    11. // и
    12. <? foreach ($array as $key => $value){?>
    13. <tr>
    14.     <td><?=$key.' = '.$value['somekey']?></td>
    15. </tr>
    16. <?}?>
    17.  
    18. // а такая конструкция в Smarty вообще не существует
    19. <? for ($i = 0, $cnt = count($array); $i < $cnt; $i++){?>
    20.     <td><?=$array[$i]['something']?></td>
    21.    <? if ($i % 4 == 0){
    22.         echo '</tr><tr>';
    23.     }
    24. }?>
    25.  
    PHP даже понятнее, темболее верстальшики обычно всё же немного знакомы с азами PHP или тем языком, с которым они работают. PHP куда гибче, и быстрее. А for цикл куда быстрее чем foreach, и калькуляции можно делать любые, я уже не говорю о том, что можно вызвать ЛЮБУЮ функцию которую надо - никаких плагинов не нужно даже писать...
     
  8. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    полностью согласен с Psih.
     
  9. svk

    svk Активный пользователь

    С нами с:
    7 авг 2006
    Сообщения:
    506
    Симпатии:
    0
    Адрес:
    NetByNet
    я согласен с тем что смарти - зло и надо написать собственный шаблонизатор
     
  10. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    svk

    phpBB - зло! надо написать собственный форум!

    Psih

    что мешает сделать тот же шаблон для оформления например 1 ссылки?
    напрм, такой:
    Код (Text):
    1.  
    2. <a
    3.     class='{$href.class}'
    4.     href='{$href.href}'
    5.     title='{$href.title}'
    6.     onclick='{$href.onclick}'
    7.     onmouseover='{$href.onmouseover}'
    8.     onmouseout='{$href.onmouseout}'
    9. >
    10.     {$href.body}
    11. </a>
    и далее
    PHP:
    1. <?
    2. ...
    3. $smarty->assign('href',$href);
    4. $smarty->display('link.tpl');
    5. ...
    6. ?>
     
  11. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    для решения такой супер задачи просто необходимо пристегнуть ~350Кб либу, генерить в templates_c (0777) из шаблона smarty-php-бредокод (он сам сгенериться, но для его последующего применения все-равно каждый раз будет запускаться php), держать все в как минимум 2 файлах (php и tpl), и все это лишь для удовольствия заявить "я использую smarty!"...
    Что тут сказать? - каждому свое...
     
  12. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    avm

    мм, удивлен, что оказывается собираюсь использовать smarty только для этого:)
    вышеприведенный фрагмент - это ответ на неудобность использования foreach в smarty, и не более того.

    а ну и что собственно, что на каталоге права 777? ничто не мешает поставить на него же апач-авторизацию и жестко обломать героя, решившего туда шелл залить:)
     
  13. Mavir

    Mavir Guest

    Smarty может не каждый раз компилироваться, при его вызове. Т.е. один раз скомпилировался, получился php-код и потом уже вызывается непосредственно этот код, без разбора шаблона. Так же есть возможность кеширования.
     
  14. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Никогда автоматически генерированный код не превзойдёт акуратно и оптимизировано написанный руками код. Создание самого экземпляра smarty который весит немеренно уже не лёгкая работа для РHP + вам надо ещё кучу места под компилированные шаблоны. А вы что, будете держать проверку модификации шаблонов всё время включённой что бы при смене он их скомпилировал? Вот вам уже одно неудобство, надо при смене шаблонов включать и потом отключать проверку.
    Лана, я откапаю какой-нить шаблон средней сложности, которые вполне часто встречаються, завтра запостим и посмотрим :)
     
  15. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    естественно, иначе это было бы вообще ненужным этапом. Но вот каковы преимущества того кода что генерит смарти? он громоздок, и неэффективен. И зачастую даже шаблонизация "на лету" (не посредством смарти) может оказаться быстрее чем тот скомпилированный код.
    И при чем тут кеширование? оно ж не только в смарти используется... мало того, некоторые вообще делают так что если на странице нет персонификации - создается статическая страница на которую травится mod_rewrite (в этом случае php вообще не дергается при отдаче страницы, да и клиенское кеширование не симулированное).

    DarkElf, я говорил о том что есть вещи, которые следует делать без смарти-анд-компани. Например - какой-нибудь download.php с докачкой и антиличем, или страница с одной ссылкой как вы и говорили... ;)
     
  16. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    На одном форуме (ныне, к сожалению, практически мертвом) я как-то высказывался на тему Smarty.
    Не обессудьте - я просто скопирую свою мессагу оттуда.

     
  17. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Mavir вот тебе шаблон средней сложности, с JavaScript кодом и не маленьким циклом. Сделай мне его на Smarty коде и посмотрим, что будет выглядеть красивее (а уж мой шаблон будет работать 100% быстрее и есть НАМНОГО меньше оперативки)
    PHP:
    1. <script>
    2. function build_sort_menu(selected){
    3.     var selection = new Array(4);
    4.     var cancel_button = '';
    5.    
    6.     for (i = 1; i < selection.length; i++){
    7.         if (i == selected){
    8.             selection[i] = 'style="color: red"';
    9.             cancel_button = '<tr>'+                                        
    10.                     '<td colspan="2" bgcolor="#E6E6E6" height="1" style="padding: 0px"></td>'+
    11.                 '</tr>'+
    12.                 '<tr>'+
    13.                     '<td align="center" colspan="2">'+
    14.                         '<button onfocus="this.blur();" onclick="document.location.href = \'/video/<?=$parser->get('current_folder')?>/0.html\'" style="width: 90px"><?=_("Отменить")?></button>'+
    15.                     '</td>'+
    16.                 '</tr>';
    17.         }else{
    18.             selection[i] = '';
    19.         }
    20.     }
    21.    
    22.     menu = '<table border="1" cellspacing="0" cellpadding="0" style="border-collapse: collapse" bordercolor="#DDDDDD">'+
    23.         '<tr>'+
    24.             '<td>'+
    25.                 '<table border="0" width="100%" cellspacing="0" cellpadding="0">'+
    26.                     '<tr>'+
    27.                         '<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>'+
    28.                     '</tr>'+
    29.                     '<tr>'+
    30.                         '<td bgcolor="#E6E6E6" height="1"></td>'+
    31.                     '</tr>'+
    32.                     '<tr>'+
    33.                         '<td bgcolor="#FFFFFF" height="1"></td>'+
    34.                     '</tr>'+
    35.                     '<tr>'+
    36.                         '<td>'+
    37.                             '<table border="0" width="100%" bgcolor="#FFFFFF" cellspacing="4" style="filter:alpha(opacity=95); -moz-opacity:0.95;">'+
    38.                                 '<tr>'+
    39.                                     '<td align="right" width="10"><img src="/images/mnu_item.gif" width="3" height="5"></td>'+
    40.                                     '<td style="padding-left: 4px"><a href="/video/<?=$parser->get('current_folder')?>/1.html" '+ selection[1] +'><?=_("по рейтингу")?></a></td>'+
    41.                                 '</tr>'+
    42.                                 '<tr>'+
    43.                                     '<td align="right" width="10"><img src="/images/mnu_item.gif" width="3" height="5"></td>'+
    44.                                     '<td style="padding-left: 4px"><a href="/video/<?=$parser->get('current_folder')?>/2.html" '+ selection[2] +'><?=_("по количеству комментариев")?></a></td>'+
    45.                                 '</tr>'+ cancel_button +
    46.                             '</table>'+
    47.                         '</td>'+
    48.                     '</tr>'+
    49.                 '</table>'+
    50.             '</td>'+
    51.         '</tr>'+
    52.     '</table>';
    53.  
    54.     if(navigator.family =="nn4"){
    55.         document.object1.document.write(menu);
    56.         document.object1.document.close();
    57.         document.object1.left = x + 15;
    58.         document.object1.top = y - 5;
    59.        
    60.     }else if(navigator.family =="ie4" || navigator.family == "opera"){
    61.    
    62.         obj = document.getElementById("object1");
    63.         obj.innerHTML = menu;
    64.         obj.style.pixelLeft = x + 15;
    65.         obj.style.pixelTop = y - 5;
    66.        
    67.     }else if(navigator.family == "gecko"){
    68.         document.getElementById("object1").innerHTML = menu;
    69.         document.getElementById("object1").style.left = x - 40;
    70.         document.getElementById("object1").style.top = y + 15;
    71.     }
    72.     showdiv = 1;
    73.     overdiv = 1;    
    74. }
    75. </script>
    76.  
    77. <table width="100%" cellspacing="0" cellpadding="0" border="0">
    78.     <tr>
    79.         <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">&nbsp;&nbsp;' : ''?><?=_("Настройки")?></button></td>
    80.     </tr>
    81.     <? if (!$parser->is_set('video_list')){ ?>
    82.     <tr>
    83.         <td align="center" height="130">
    84.             <?=_("В Видеогалерее ещё нет видеороликов")?>.<br>
    85.         </td>
    86.     </tr>
    87.     <?}else{?>
    88.     <tr>
    89.         <td align="center" style="height: 14px;"><?=$parser->get('paging_video')?></td>
    90.     </tr>
    91.     <tr>
    92.         <td align="center" colspan="2" style="padding: 0px 0px 14px 0px;">
    93.             <table width="100%" cellspacing="0" border="0" cellpadding="0">
    94.                 <tr>
    95.                     <? $nl = 0;
    96.                     foreach ($parser->get('video_list') as $row) { ?>
    97.                     <td align="center" valign="top">
    98.                         <table cellpadding="0" cellspacing="0" border="0" width="132">
    99.                             <tr>
    100.                                 <td align="center" valign="top" style="padding-top: 14px;">
    101.                                     <table cellpadding="0" cellspacing="0" border="0" width="128">
    102.                                         <tr>
    103.                                             <td>
    104.                                                 <table cellpadding="0" cellspacing="0" border="0" width="124" height="9">
    105.                                                     <tr>
    106.                                                     <? if ($row['vid_votes'] > 0){ ?>
    107.                                                         <td align="center" style="font-size: 9px"><img src="/images/votes.gif" width="15" height="9" title="<?=_("Количество оценок")?>"></td>
    108.                                                         <td align="center" style="padding-left: 6px; font-size: 9px" title="<?=_("Количество оценок")?>"><?=$row['vid_votes']?></td>
    109.                                                         <td align="right" style="padding-right: 6px;" width="100%"><?
    110.                                                             for($i = 0; $i < 5; $i++){
    111.                                                                 if ($i + 1 > $row['vid_mark'] &&  $i < $row['vid_mark']) echo '<img src="/images/vote_half.gif" width="9" height="9" title="'._("Средний балл").'">';
    112.                                                                 else if ($i < $row['vid_mark']) echo '<img src="/images/vote.gif" width="9" height="9" title="'._("Средний балл").'">';
    113.                                                                 else if ($i >= $row['vid_mark']) echo '<img src="/images/vote_empty.gif" width="9" height="9" title="'._("Средний балл").'">';
    114.                                                             }
    115.                                                         ?>
    116.                                                         </td>
    117.                                                         <td align="center" style="font-size: 9px" title="<?=_("Средний балл")?>"><?=$row['vid_mark']?></td>
    118.                                                         <?}else{?>
    119.                                                         <td height="9">&nbsp;</td>
    120.                                                         <?}?>
    121.                                                     </tr>
    122.                                                 </table>
    123.                                             </td>
    124.                                         </tr>
    125.                                         <tr>
    126.                                             <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>
    127.                                         </tr>
    128.                                     </table>
    129.                                 </td>
    130.                             </tr>
    131.                             <tr>
    132.                                 <td align="center" class="text_gray"><?=$row['vid_creation_date']?></td>
    133.                             </tr>
    134.                             <tr>
    135.                                 <td align="center"><?=$row['vid_descr']?></td>
    136.                             </tr>
    137.                         </table>
    138.                     </td>
    139.                     <? if (++$nl == 4){
    140.                         echo '</tr><tr>'; $nl = 0;
    141.                     }}?>
    142.                 </tr>
    143.             </table>
    144.         </td>
    145.     </tr>
    146.     <tr>
    147.         <td><?=$parser->get('paging_video')?></td>
    148.     </tr>
    149.     <?}?>
    150.    
    151.     <tr>
    152.         <td>
    153.             <table width="100%" cellpadding="0" cellspacing="0" border="0">
    154.                 <tr>
    155.                     <td class="shdr_bg" height="20">&nbsp;</td>
    156.                 </tr>
    157.             </table>
    158.             <table width="100%" cellpadding="0" cellspacing="0" border="0" class="shdr_background">
    159.                 <tr>
    160.                     <? $nl = 0;
    161.                     foreach($parser->get('video_folders_list') as $row){?>
    162.                     <td align="center" valign="top" style="padding-top: 10px; padding-bottom: 10px;" width="20%">
    163.                         <table cellpadding="0" cellspacing="0" border="0">
    164.                             <tr>
    165.                                 <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>
    166.                             </tr>
    167.                             <tr>
    168.                                 <td align="center"><?=$row['vdf_name']?></td>
    169.                             </tr>
    170.                         </table>
    171.                     </td>
    172.                     <?
    173.                     if (++$nl == 4) {echo '</tr><tr>'; $nl = 0;}
    174.                     }?>
    175.                 </tr>
    176.                 <tr>
    177.                     <td height="10"></td>
    178.                 </tr>
    179.             </table>
    180.         </td>
    181.     </tr>    
    182. </table>
    P.S. Да, кстати, один момент сводящий не то что Smarty но и любой на него похожий шаблонизатор - gettext - попробуйте подружить их вместе, о результатах скажете :D

    P.S.S. Вообщем то избавлю вас от этого, скажу сразу - полная и 100% не совместимость. Gettext понимает только конструкцию _("text here") - никакие плагины не помогут, gettext не может принимать как параметр функции переменные, т.к. иначе вы не пропарсите его, что бы потом сделать переводы. Остаёться только единственный вариант, маленький лёгкий шаблонизатор + шаблоны с PHP вставками.
     
  18. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Он так долго думает или испугался? :D
     
  19. Mavir

    Mavir Guest

    Это про меня? Я не перевариваю такие большие куски кода. Строк 10-20 еще бы посмотрел, а этот код только прокрутил.
    Наверное, вообще бы и маленький код не смотрел - оно мне не надо.
     
  20. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    >>Дико неудобно сделаны спецтеги по умолчанию, любая открывающая >>фигурная скобка считается началом Смарти-тега, поэтому без танцев с >>бубном не напишешь ни таблицу стилей, ни джава-скрипт;

    о да,
    $smarty->left_delimiter = '<smarty>';
    $smarty->right_delimiter = '</smarty>';

    это неподъемно.
     
  21. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    DarkElf
    А как в таком случае будет выглядеть вывод переменной в шаблоне?
     
  22. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    <smarty>peremennaja</smarty>
    :lol:
    *делает укатайку под столом*
     
  23. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Dagdamor

    <tpl>
    $show_content.title
    </tpl>
     
  24. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Проще уж
    PHP:
    1. <?=$content['title']?>
    PHP, никаких лишних там мега смарти и понятно до безобразия :)
     
  25. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    мм, в общем и целом, тема перешла из разряда "на что обратить внимание при использовании smarty" в "а нах он нужен".

    в общем и целом, всем спасибо.