Виды шаблонизации

Discussion in 'PHP' started by Kuzya, 19 Feb 2009.

  1. Kuzya

    Kuzya Elder - Старейшина

    Joined:
    27 Apr 2008
    Messages:
    166
    Likes Received:
    106
    Reputations:
    30
    Недавий спор с одним знакомым толкнул меня на создание этого топика. Вопрос обычный - как вы считаете, что лучше? На данный момент я знаю 4 следующих вида.
    1. Вообще без шаблонизаторов. Вставка PHP-кода в чистый html. На мой взгляд это лучшее. Самый быстрый вариант из всех. Функционал такого подхода и прост в использовании и широк по возможностям. Для того же альтернативного синтаксиса есть самый нужный функционал - короткое отображение переменных и функций - "<?=$var?>" за место "<?php print $var; ?>" и основные конструкции с помощью которых можно осуществить наверное всё что в голову взбредёт (по крайней мере я пока не встречал задач для шаблонов которые не возможно сделать с помощью альтернативного синтаксиса) - if, for, foreach и while. При этом в шаблоне всё отлично воспринимается визуально если в используемом редакторе имеется подсветка кода. Тогда можно чётко видеть где у вас PHP, а где HTML.
    2. Использование отдельных шаблонизаторов. Это Smarty и шаблонизаторы которые встроены во многие CMS. Такой вариант, как мне кажется, хорош только на первый взгляд. Да, есть некоторые удобства у таких отдельных решений но минусов достаточно много - нужно при каждом новом шаблонизаторе учить его синтаксис, редакторов с подсветками кода для конкретных шаблонизаторов нет, приложение тратит время на парсинг текста шаблона. Плюс временные и ресурсные затраты внутренних механизмов шаблонизатора относящиеся не только к парсингу и выводу. Я думаю что это выбор проектов у которых нет столько функционала что бы шаблонизатор начал отжирать огромное кол-во ресурсов. Например depositfiles работает на Smarty.
    3. Использование XML+XSLT в качестве шаблонизатора. Имею в виду не выдачу клиенту этого кода (та же опера не поддерживает XML+XSLT), а обработку его на стороне сервера и выдачу клиенту чистого HTML. Главная проблема - время затраченное на парсинг. С остальным всё нормально - есть и редакторы с подсветкой, и функции типа if и циклов в XSLT. Да и это стандартизированная вещь в отличие от всего остального. Между прочим единственный официально признанный организацией W3C вид шаблонизации ;) Конечно у нас пока к этому относятся отрицательно говоря что время данной связки уже прошло, хотя зарубежные продукты во всю её используют. Хорошие примеры - IPB и vBulletin.
    4. Этот вариант я даже не знаю как назвать. Что-то типа шаблонизации по кускам. Смысл следующий. Шаблон разбивается на несколько частей (в основном используют массив) и в коде приложения по мере надобности загружается шаблон и из его кусков составляется общий вид. Вещь очень редкая поэтому приведу небольшой пример. При отображении таблицы с несколькими строками в шаблон помещают отдельными кусками верх и низ таблицы и код одной строки. А уже в коде приложения загружают сначала верх, потом сколько нужно раз шаблон строки и в конце низ.
    Главный плюс здесь - полное отделение бизнес-логики от кода шаблона. В отличие от всех предыдущих вариантов все циклы, условия и т.д. выполняются в коде. В шаблоне лишь лежит html-код порезаный на куски. Пример такой шаблонизации можно посмотреть в UMI.CMS.

    А как думаете вы? Ответ прошу аргументировать.
     
  2. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Кузьмич, задай себе вопрос - какова цель шаблонизации? Придумал ответ? А ответ то очень прост - разделение представления и функциональности... Как думаешь, когда ты херачишь ПХП вместе с хтмл - разделение есть? Удобно потом будет человеку, который не делал разметку страницы, но которому нужно будет изменить функциональность лазить на N-ному числу страниц и вникать что это за код, откуда и что он берёт? Так что пункт 1 отпадает сразу, если ты, конечно, не пишешь страничку аля "Вася Пупкин". XML+XSLT - это хороший вариант, трудоёмкий в понимании и реализации, но если ты его освоил - он тебя не подведёт. Насчёт скорости парснига - да забейте на это, в наше время подстановка чего-либо в шаблон это не настолько трудоёмкая задача для сервера. Учитесь лучше писать грамотный код и кешировать вывод в нужных местах. 4-ый вариант вообще бред, не пойму, что ты этим хочешь сказать, в UMI.CMS не так сделан шаблонизатор.

    И теперь наступает судьбоносный момент (звук фанфар, барабанная дробь) - готовые шаблонизаторы... Та-да-да! На кой байт изобретать колесо, если оно уже есть? Скажем в составе твоего фреймворка? Или в составе твоей ЦМС... Ты что будешь к этому писать свой шаблонизатор? Это раз... Ни один шаблонизатор ещё не изобрёл ничего такого, чего бы не было в другом, ни в плане функциональности, ни в плане синтаксиса. Или ты считаешь что выучить менее десятка управляющих конструкций, и чуть более десятка функций - это непомерная задача для программиста? Ты говоришь о минусах в готовых шаблонизаторах, о тормозах и т.д. Ты это видел на практике? Или это надуманно говоришь в силу того, что тебе сложно это освоить? Так вот, любой шаблонизатор поддерживает кеширование, очень гибкую работу с результатом шаблонизации, неимоверные возможности в плане расширения функциональности шаблонизатора - плагины, свои функции, свои конструкции и т.д. Где минусы?

    Моё мнение - имхо, лучше чем смарти, для какого-нибудь стартапа, который делаешь ты ничего никто никогда не создавал. Это мнение не только моё. Если тебе по долгу службы пришлось столкнуться уже с готовым шаблонизатором (скажем в ЦМС какой-нибудь) так вот с ним и работай. Если ты работаешь с каким-нибудь Wordpress где нет шаблонизатора, а темплейты представляют из себя месиво PHP + HTML, то работай с этим месивом... Умей комбинировать знания и опыт, не изобретать колёса, грамотно разобраться в узких местах проекта...
     
    2 people like this.
  3. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Когда человек рассуждает на тему "сымый быстрый", то вместо ответа на свой вопрос он хочет услышать "дада, тот вариант, который ты назвал самым быстрым - самый лучший".
     
  4. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Ах да, чуть не забыл, мое мнение.

    ИМХО PHP - лучший шаблонизатор.
     
  5. Kuzya

    Kuzya Elder - Старейшина

    Joined:
    27 Apr 2008
    Messages:
    166
    Likes Received:
    106
    Reputations:
    30
    groundhog, мнение понятно. Я в принципе так и поступаю. Раньше был ярым приверженцем Smarty, но как столкнулся с HTML+PHP начал немного всё переосмысливать. Мне кажется что тут разницы то фактической нет. Или ты пишешь
    Code:
    {foreach from=$articles item=article}
    <p>$article</p>
    {/foreach}
    или
    Code:
    <?foreach($articles as $artice):?>
    <p><?=$article;?></p>
    <?endforeach;?>
    Разумеется я не имел в виду код типа
    Code:
    <div ....>
    <p>
    <?php
     php-code.......
    ?>
    </p>
    </div>
     
  6. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Вот... Ты умеешь понять необходимость использования той или иной технологии в разработке... Но есть и задачи, которые лучше будут смотреться на шаблонизаторе недели чем в кусках PHP-кода...
     
  7. SleepShadowWeb

    Joined:
    2 Feb 2006
    Messages:
    26
    Likes Received:
    15
    Reputations:
    0
    однозначно PHP и никто не докажет обратное..
     
  8. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Иногда проще спорить с голодным тигром, чем с сытым бараном...
     
  9. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    А кто тебе сказал, что PHP - не шаблонизатор? Тебя наебали.
     
  10. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Слова, достойные мембера группы "Резервисты Античата"... Печально... Даже если это в шутку сказано, очень печально, что ты опустился до этого... :) Раз уж на то пошло, тогда и С++ всего лишь шаблонизатор, а то, что придумали идеологию ресурсов - это всё ***ня... Куда проще хуярить CreateWindow в коде, чем разделить логику и представление...
     
  11. Trieg

    Trieg Elder - Старейшина

    Joined:
    26 Oct 2007
    Messages:
    82
    Likes Received:
    9
    Reputations:
    0
    имхо я пока не юзал нечего кроме хтемплате.. конкретно он меня не устраивает так как в нем нет возможности юзать такие конструкции
    PHP:
    {foreach from=$articles item=article}
    <
    p>$article</p>
    {/foreach}
    скоро начну писать свой шаблонизатор (просто ради практики.. делать мне нечего).. суть такая.. на входе имеем шаблон вида (как выше) после обработки получаем шаблон вида
    PHP:
    foreach($articles as $artice) {
        echo 
    '<p>'.$article.'</p>';
    }
    сохраняем результат в другой файл и далее подключаем его вместо оригинального шаблона и все.. получается удобный синтаксис для написания шаблонов и 0 потеря производительности по сравнению с чистым пхп
     
  12. cr0w

    cr0w Elder - Старейшина

    Joined:
    11 Sep 2008
    Messages:
    92
    Likes Received:
    141
    Reputations:
    33
    Я что-то не уловил разницы между 2-м и четвертым видомом. Не знаю как там в Smarty, но в шаблонизаторе Джанго, к примеру, можно и то и другое делать.
    Кстати: любой нормальный шаблонизатор должен отделять бизнес-логику в коде веб-приложения от логики представления в коде шаблона.
    Шаблониазаторы нужны прежде всего для ускорения процесса разработки и сопровождения кода, если вам в этом плане они не помагают - так и не пользуйтесь ими (как nerezus).
    Так же, я бы выделил еще один вид шаблонизаторов (например, breve), позволяющих избавиться от необходимости писать html-код вообще.
     
    #12 cr0w, 19 Feb 2009
    Last edited: 19 Feb 2009
  13. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Нет. Его нельзя встроить в текстовый файл так, чтобы вставки его исполнялись.

    Я предлагаю использовать MVC.
    Да, необходим шаблонизатор.
    В качестве шаблонизатора я юзаю PHP.

    И могу объяснить почему. В скайпе. И ты согласишься со мной, т.к. я разобью твои доводы. Велкам ту скайп?

    Только не надо путать мешанину типа
    PHP:
     foreach($articles as $artice) { 
        echo 
    '<p>'.$article.'</p>'
    и шаблон типа:
    PHP:
    <? foreach ($articles as $article): ?>
    <?=$article?>
    <?endforeach?>
    А работу на публику типа "печально" можно говорить лишь тогда, когда знаешь не только свою точку зрения, но и понимаешь то, что говорит тебе в споре опонент. Иначе будет не круто =)
     
  14. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Еще один.
    Пользуюсь я ими, пользуюсь.
    Пользовался тремя(Smarty, PHP, XSLT), больше всего понравился PHP.

    И никакой логики приложения в шаблонах НЕТУ. Только логика отображения.
     
    1 person likes this.
  15. Zedi

    Zedi Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    316
    Likes Received:
    120
    Reputations:
    13
    Мне кажется что nerezus прав, он ведь не пишет в шаблоне коды большие на пыхе, а ток переменные и конструкции, и тут есть много плюсов:
    1.можно использовать весь пхп, все его функции, а не только что предусмотрели разработчики шаблонизатора
    2.более безопасно, так как в шаблонизаторе могут быть дыры, а ты о них даже знать не будешь
    ну и 3 это легкость восприятия, каждый поймет этот шаблон, ему не надо будет учить синтаксис шаблонизатора
     
    #15 Zedi, 19 Feb 2009
    Last edited: 19 Feb 2009
  16. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Директивы препроцессора.

    Насчёт скайпа - времени нету переливать из пустого в порожнее, PHP-код, есть PHP-код, шаблонизатор - механизм абстракции над PHP-кодом. PHP-не может быть абстракцией над самим собой, следовательно называть его шаблонизатором некорректно. То, что ты называешь шаблонизатором есть "вставки PHP-кода в страницу".

    И кстати:

    PHP:
    foreach($articles as $artice) { 
        echo 
    '<p>'.$article.'</p>'
    }
    и

    PHP:
    <? foreach ($articles as $article): ?>
    <?=$article?>
    <?endforeach?>
    суть одно и то же - код на языке PHP.

    Если опонент путается в элементарнейших терминах, называет например жопу сиськами (только потому что она тоже округлой формы, бугорками и за неё можно подержаться), при этом несёт полную чушь и даже не пытается рассмотреть чужую точку зрения - считаю дальнейшую дискуссию пустой тратой времени. Ты для меня ничего нового не откроешь ни в плане знаний о PHP, ни в плане притянутых за уши "открытий".
     
  17. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Ой, шаблонизаторы бывают только в пхп? А я то и не знал.
    P.S. Тебя снова наебали.
    P.P.S. Посмотри в википедии определение.

    Только во втором случае PHP используется в качестве шаблонизатора.

    Хех, жаль. А то бы я прочитал тебе лекцию о шаблонизаторах или пользе той же википедии.
     
  18. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Нер, ты как дитё, которое до хера глупостей сказало, и чтобы перед другими детьми не потерять авторитет начинает пороть чушь, и чем дальше это заходит, тем большую чушь ты начинаешь пороть. Я что сказал что они только в пхп бывают? Мы просто СЕЙЧАС говорим о php. И поверь, пока ты путаешься в терминах и их осмыслении, тебе рано лекции читать, ну разве только в школе в классах 7-8 (и мне кажется что у тебя такой опыт был), именно там такой уровень знаний.
     
  19. mikhoni

    mikhoni Elder - Старейшина

    Joined:
    20 Aug 2008
    Messages:
    33
    Likes Received:
    6
    Reputations:
    8
    Имея не большой опыт написания сайтиков скажу.
    шаблоны нужны НЕ на пхп по 3-м причинам
    неудобно тем же верстальщикам (думайте о других)
    небезопастно (ведь используется парсер пхп, а следовательно можно получить уязвимостей и пополнить библиотеку эксплойтов)
    неуниверсально (а если проект переедет на ASP или Perl)

    итого использовать пхп шаблончики только для мини-проектов(как кто-то говорил выше).

    вот вопрос в скорости.... например vkontakte какой принцип используют? ведь там производительность очень важный фактор!
     
  20. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Почему?
    Чем <? хуже, чем {?
    Ответь на этот вопрос.
    Моему верстальщику пофигу на эту разницу.

    Верстальщик не делает шаблоны вида eval(@$_GET['xaka']). Чем небезопасней? В смарти тоже можно какашку вставить. и?

    Зачем?