За последние 24 часа нас посетили 23514 программистов и 1559 роботов. Сейчас ищут 886 программистов ...

Посоветуйте шаблонизатор

Тема в разделе "PHP для новичков", создана пользователем Freakmeister, 5 дек 2013.

  1. Freakmeister

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

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Немного подзадолбался городить такую чушь. Думаю, пора уже заняться выпрямлением своих рук и облагораживанием кода, дабы не слыть быдлокодером. Хочу отделения логики от верстки с максимально кратким синтаксисом в шаблоне и ничтожными затратами производительности. Посмотрел Smarty - чот не особо впечатлило, по-моему он мало чем отличается от простого PHP внутри HTML. Тут какой-то Mustache нарисовался - кто-нибудь пробовал? В общем, прошу посоветовать самый удобный шаблонизатор на ваш взгляд.))
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    php сам по себе тоже неплохой шаблонизатор
     
  3. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Вообще, шаблонизатор прежде всего отличается отсутствием логики в конечном представлении. Т.е. где-то у нас произведены все запросы/расчеты, а тут чисто вывод уже, подстановка значений в переменные. Тут php действительно и сам по себе неплох, если не городить мешанину, но блин:
    Код (Text):
    1.  
    2. {foreach $array as $key => $row}
    3.   {if $row@first}тут начало массива{/if}
    4.   {$key} - {$row}
    5.   {if $row@last}тут конец массива{/if}
    6. {foreachelse}
    7.   пусто же
    8. {/foreach}
    удобно же )
     
  4. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Код (PHP):
    1. if (!empty($array)) {
    2.     тут начало массива
    3.     foreach($array as $key=>$val){ 
    4.       {$key} - {$val}
    5.     }
    6.     тут конец массива
    7. } else {
    8.   пусто же
    9. } 
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Есть системы поддержки шаблонов, а есть язык разметки шаблонов. Можно писать "нативные" шаблоны на PHP, но при этом пользоваться неким классом, облегчающим типичные для Представления операции.

    Например в составе Symfony 2 есть Symfony Templating Component и в нём, как вариант шаблонного движка, присутствует класс PhpEngine. Это как раз шаблонизатор без собственного языка разметки.

    Советую также обратить внимание на Plates.
     
  6. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Короче, надо брать что приглянется. Главное не выводить хтмлку через echo вперемешку с обращениями к бд и прочей обработкой одной большой простыней, а какой для этого использовать инструмент - дело вкуса и привычки. Ну и предполагаемой нагрузки: всё же нативный пхп как не крути, но быстрее )
     
  7. d1gi

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

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    twig

    Добавлено спустя 2 минуты 2 секунды:
    в симфоническом компоненте синтаксис корявый :( но это еще мелочи, а вот то, что нету механизма наследования блоков - это уже совсем не дело...
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну и отдели. меньше кода ты не станешь писать с шаблонизатором. только станет менее понятно.
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    d1gi, не собираюсь никого агитировать, но очевидно ты не в теме. Синтаксис там не корявее самого PHP :) потому что это и есть PHP. Наследование и блоки присутствуют.

    Сейчас модно хвалить Twig. Я тоже присоединяюсь: синтаксис очень симпатичный, ведь это копия django templates. Если бы не чудовищный тормозной код в который он транслируется, я бы других и не искал.
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Откуда вообще берется тяга к шаблонизаторам?
     
  11. d1gi

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

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    artoodetoo, о благодарствую! :) странно, что в своё время просмотрел наследования и забил на пхп енджин ;)

    а на счет "тормознутости", у вас прям проект упирается в твиг?

    еще вспомнил момент, в симфоническом шаблонизаторе есть метод аналогичный твиговскому {{ parent() }} ? т.е. отобразить родительский блок.

    igordata, потому что лаконично и удобно ;) особенно наследования и блоки.
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    d1gi, не упирается. и не в twig ))) инструмент подбирается под задачу по совокупности параметров, а не за "красивые глазки".

    пример:
    форум fluxbb во многом хорош, но в нем представление не выделено из кода, шаблоны в зачаточном состоянии — я бы хотел это исправить.
    весь движок fluxbb это 150 файлов и 32тыс строк. а twig порядка 200 файлов и 9тыс строк кода.
    сравни цифры и ты поймешь, что twig просто несоразмерен этой задаче.
    [​IMG]

    с другой стороны, типичное приложение на symfony 2 со всеми бандлами (включая twig) начинается от 4тыс файлов и 250тыс строк кода (цифры из "Symfony Standard Edition"). тут уже можно потерпеть, правда?
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    жесть какая

    а можно примеры, когда шаблонизатор хорош, наследования когда нужны и прочая?
     
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Хорош:
    Код (Text):
    1. {% extends sonata_block.templates.block_base %}
    2.  
    3. {% block block %}
    4.     <div style="text-align: right; margin-bottom: 10px;">
    5.         {% if user %}
    6.             <a href="{{ path('sonata_user_profile_show') }}">{{ user.username }}</a> |
    7.             <a href="{{ path('fos_user_security_logout') }}">{{ 'link_logout' | trans({}, "SonataUserBundle") }}</a>
    8.         {% else %}
    9.             <a href="{{ path('fos_user_security_login') }}">{{ 'link_login'|trans({}, 'SonataUserBundle') }}</a> |
    10.             <a href="{{ path('fos_user_registration_register') }}">{{ 'link_register'|trans({}, 'SonataUserBundle') }}</a>
    11.         {% endif %}
    12.     </div>
    13. {% endblock %}
     
  15. Freakmeister

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

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    PHP - шикарный шаблонизатор.)) Сейчас я вывожу всё в шаблон таким образом (точнее, я ввожу шаблон в PHP-код):

    Код (PHP):
    1. $content = file_get_contents($_P['root'].'portal/templates/template.html');
    2. foreach ($_P as $key => $value) {
    3.      $content = str_replace('{P_'.strtoupper($key).'}', $value, $content);
    4. }
    5. echo $content; 
    Это позволяет мне использовать в шаблоне template.html любые строковые переменные из массива $_P в виде {P_ROOT} например. В общем, со строковыми переменными всё гуд, но в PHP меня огорчает вывод циклов в шаблон - тут либо кусочек логики приходится вставлять в шаблон, либо кусочек шаблона в логику. Это единственная причина, по которой я хочу попробовать шаблонизаторы. В идеале, в шаблоне должно быть написано что-то мега-краткое вроде:
    Код (Text):
    1. <ul id="#content">
    2. {P_CYCLE_THIS_SHIT}<li><a href="{P_LINK}">{P_TEXT}</a></li>
    3. </ul>
    Мне скоро в офис устраиваться кодером, а значит буду работать в паре с верстальщиком. А значит нужно прекратить говнокодить и научиться отделять логику от верстки.
     
  16. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Я один такой странный, завожу для каждого компонента сопровождающий класс view (несколько, если есть разные варианты отображения), после чего просто опосля инициализации компонента вызываю new view($this), а вьюха уже сама разбирается, что от нее хотят, вставляет нужные данные в html и отдает клиенту? И не парюсь ни со смарти, ни с хренарти, ни с макаронными изделиями в коде.

    Логика при этом полностью отделена от представления. По крайней мере настолько, насколько это возможно. И все это на чистом пыхе и удобно для чтения/правок.
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    жесть какая.
    Есть обстарт, есть инклуд с ретурном...
     
  18. Freakmeister

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

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
  19. d1gi

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

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    artoodetoo, а про твиговский метод {{ parent() }} в симфоническом шаблонизаторе что-нить скажешь? аналог есть?

    про "файлы и строчки" всё понятно :) правда! :)
     
  20. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    ты спроси Фабьена Потенсье. мне parent в шаблоне не нужен.
    кстати, я считаю, что реализация перекрытия блоков в "унаследованных" шаблонах у твига сделана по говняцки. я бы объяснил, но кому это нужно?!
     
  21. d1gi

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

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    объясни конечно :) для общего развития очень даже нужно.
     
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    мне. я бы послушал и за и против
     
  23. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Код внутри родительского блока будет выполнен в любом случае — хоть он перекрыт в "наследнике", хоть нет. Если он переопределен наследником, то его результат будет перезаписан поверх и мы его не увидим. Но бесполезная работа полюбому была выполнена.

    EDITED 26.01.2014: не знаю откуда я взял это дерьмо, но я был неправ. может быть в какой-то старой версии так было или в оригинальном django templates… правда до сих пор никто меня не поправил. это говорит об уровне обсуждения )))
    Сейчас у покопал нутро твига получше и мне по прежнему не нравится бессмысленная избыточность и тормознутость скомпилированного кода. Когда Фабьен говорит о "быстром" твиге, он козыряет скоростью компиляции, а это малоебучий фактор. По скорости исполнения готового кода он проигрывает даже Smarty.
     
  24. d1gi

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

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    хм... а как проверить это можно?
     
  25. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    эту задачку я оставлю тебе. программист ты или кто ;)