За последние 24 часа нас посетили 17463 программиста и 1686 роботов. Сейчас ищут 975 программистов ...

шаблонизатор и его использование

Тема в разделе "PHP для новичков", создана пользователем toxin, 20 окт 2009.

  1. toxin

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

    С нами с:
    12 мар 2009
    Сообщения:
    19
    Симпатии:
    0
    Здравствуйте, конечно не хочется делать холивар, так как тема шаблонизаторов всеми "любима" я смотрел форум и на эту тему идут большие дискусии, но я как начинающий хотел бы задать несколько вопросов мастерам, дабы те обьяснили мне как работает шаблонизатор, возможно я не так мыслю
    Суть темы:

    Как я понимаю шаблонизатор класс который должен заменять спец теги в шаблоне(файле) на какуето информацию, но я видер реализации в которых сначала искались спец теги а уже потом искалась информация которая подходит к ним тоесть, два масива один цисленный со спец тегами, второй асоциативный с информацией, в интоге обход и заменя информации, вывод шаблона.

    Еще несовсем понятно выражение компиляция шаблона, насколько я знаю компиляция это транслюция языка програмирования к машинному, как же htm файл перекомпилировать в html ???

    Как реалзовывается вывод новостей в шаблонах?
    В большенстве реализаций делается обход массива, и в шаблоне пишется чтото вроде

    {foreach $a as $d => $c} код шаблона повторения{/foreach}

    и получается минимум 2 таких выражения(обхода), ИМХО мне это не очень нравится, ведь возможно зделать что такой же многомерный массивбудет отдаваться шаблонизатору, а тот в свое время будет делать обход и вставлять 10 новостей соответсвую массиву, в шаблон
    Почему так не делают ? геморойно ? или овчинка выделки не стоит ?


    Вот в принцепе и все, что меня пока интересует
    Конечно чтото можно было выложить в коде, но я только новичок, не хочется позориться =))
    Буду благодарен за люые ответы, только сильно не бейте
    Спасибо с уважением toxin....
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Отркытие файла, замена тегов переменными и вывод на экран - уже шаблонизатор. Класс - не обязательно =)
    Под компиляцией шаблонов подразумевают замену спецтегов нужными данными и сохранением на диск для дальнейшего вывод на экран (чтобы каждый раз не обрабатывать шаблон заново). Или еще - замену спецтегов на куски php-кода, чтобы получвшийся файл просто includ'ить в скрипт (так намного быстрее). Вот пример.
     
  3. toxin

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

    С нами с:
    12 мар 2009
    Сообщения:
    19
    Симпатии:
    0
    почему написал что шаблонизатор класс ИМХО я думаю так удобнее
    Что такое шаблонизатор понял ! Спасибо
    С компиляцией получается что это шаблонизатор + кеширование шаблонов ? если не прав, поправте =(

    Отается вопрос,
    -как должна выглядеть структура самого шаблонизатора, как правильнее, или как "экономнее" написать шаблонизатор что бы он ел как можно меньше ресурсов сервера ?
    -вывод новостей шаблонизатором ?
     
  4. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Не писать его вовсе, а использовать просто PHP
    Важно при этом уметь отделять код представления от логики приложения.
     
  5. toxin

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

    С нами с:
    12 мар 2009
    Сообщения:
    19
    Симпатии:
    0
    вопрос стоит иначе, но спасибо за мнение
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    1)Грузим шаблон newslist.tpl
    Код (Text):
    1. <table>
    2. <tr><td>{TITLE}</td></tr>
    3. <tr><td>{TEXT}</td></tr>
    4. <tr><td>{LINK}</td></tr>
    5. </table>
    2)В цикле собираем в переменную $buffer таблицу отпарсеный шаблон для каждой новости
    PHP:
    1. foreach ($news as $new)
    2. {
    3.      $buffer .= tpl_parser(...
    3)Заменяем в основном шаблоне тег {NEWS} переменной $buffer.
    Вообще вариантов много. Логика в шаблонах (циклы, условия) не есть гуд (ИМХО).
    Примерно это кстати и происходит при компиляции шаблона в php-скрипт. Если переменные фиксированы, можно написать такие шаблоны вручную, и никаких лишних трат системных ресурсов.
     
  7. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Может он и стоит иначе :)

    Но поставили вы его именно так
    Это только в том случае если есть отдельный слой логики представления.
    В противном случае, пусть лучше оно будет в шаблонах, чем вперемешку с логикой приложения.
     
  8. toxin

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

    С нами с:
    12 мар 2009
    Сообщения:
    19
    Симпатии:
    0
    Simpliest, я спросил как правильнее, а не писать мне его или нет =)

    По сути я беру шаблон block.tpl заменяю в нем спецтеги на информацию, и сохраняю его на диске, потом при заходе на сайт проверяю старый ли шаблон или нет, если нет подгружаю если да компилирую новый, вот по сути и все кеширование ?


    Соглашусь что логика в шаблонах не есть хорошо
     
  9. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Правильнее - это отделять логику от представления.
    А заморачиваться вопросом о производительности шаблонизатора - не правильно.

    Это не кеширование. это транслирование в native-PHP.

    Кешированием это будет если ты получишь статические страницы, без PHP вовсе.
     
  10. toxin

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

    С нами с:
    12 мар 2009
    Сообщения:
    19
    Симпатии:
    0
    Может я чтото не понял....
    Simpliest, обьясни как кешировать на php ? Если не сложно....
     
  11. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
  12. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Кешировать можно БД.
    Кешировать можно код.
    Кешировать можно информацию получаемую из БД (храним результаты выборок в памяти)
    Кешировать можно информацию получаемую в результате расчетов (какие-то блоки данных)
    Кешировать можно отдельные части страниц (html с уже вставленными данными)
    Кешировать можно страницы целиком (статичные html которые могут просто отдаваться пользователю)

    При этом сам кеш может находится в памяти или файлах.
    Да и кешей может быть много (твой кеш приложения, кеш сервера, кеш прокси, кеш браузера)

    Поэтому любую оптимизацию начинают с выяснения узкого места.
    В супер-пупер нагруженных проектах, когда выжимаются последние капли, могут применяться все кеши сразу.
     
  13. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Кстати да, если нужно простое решение - этого более чем достаточно.

    Если недостаточно, то долго куришь MVC. А потом так же долго пытаешься его оптимизировать. Потому что любая дополнительная абстракция - это накладные расходы.
     
  14. toxin

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

    С нами с:
    12 мар 2009
    Сообщения:
    19
    Симпатии:
    0
    я не могу понять
    если сохронение копии файла block.tpl с уже подставленными значениями, а затем их вывод, это трансляция
    то чем отличается
    Выходит разница в том что в кешировании я перехватываю весь вывод на экран функцией ob_start(); если я правильно понял, а в транслировании я просто делаю копию кода так ?

    Речь идет про шаблонизатор, причем здесь mvc ?
    Что такое mvc знаю, но у каждого своя реализация данного шаблона
     
  15. SDR

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

    С нами с:
    22 сен 2009
    Сообщения:
    244
    Симпатии:
    0
    да. генерация native-php шаблона из самописанного шаблона
    согласен с мнением Simpliest, что нафиг оно вообще не спёрлось, если грамотно разделять логику от представления

    в любом случае шаблон это V из mvc.. MC между собой можете скрещивать как угодно, если вам хочется ;-)
     
  16. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Нет. Я возможно некорректно выразился. А сейчас ты совсем запутаешься.
    Вот смотри.
    Когда ты псевдо-логику шаблона переводишь в php - это трансляция.

    Обработка такой хрени
    Код (Text):
    1. <span>{somevar}</span>
    Это трансляция

    А это
    Код (Text):
    1. <span><=$somevar?></span>
    просто вывод.

    Сохранение же в памяти конечного варианта для обоих случаев
    HTML:
    1. <span>Привет</span>
    Это кеширование.

    Ты код, который там, внимательно смотрел? Там тоже шаблонизатор.

    Я вел речь о том -
    если тебе не хватает этого решения и ты начинаешь придумывать
    или
    То стоит начать думать о переходе к полноценному MVC где шаблон лишь часть View.
     
  17. toxin

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

    С нами с:
    12 мар 2009
    Сообщения:
    19
    Симпатии:
    0
    понял так

    Трансляция - замена спец тегов в шаблоне
    Кеширование - сохранение готового куска кода(html кода, без php)

    для {test}
    html -> трансляция -> проверка кеша -> вывод
    для <?=test?>
    html -> вывод -> проверка кеша -> вывод

    НО
    Непонятно
    без php, ты имеешь в веду, без php кода в готовом html файле, тогда понял, если чтото другое, тогда не понял....


    Тоесть все обходы масивов вся логика в шаблонах, от недостатка контроллера ?
    поэтому в шаблонизаторах делают поддержку логики ?
     
  18. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Трансляция это перевод одного синтаксиса в другой. В твоем случае синтаксиса тегов в синтаксис PHP.

    Да.

    Нет.

    Есть два типа логики - логика представления и логика приложения.
    Логика приложения находится в контроллере и отвечает за то "ЧТО выводить" (условно говоря, ты получил массив записей обработал его и тебе дальше плевать как они выведутся)

    Логика представления находится где кому взбредет :) и отвечает за то "КАК выводить"
    (в таблицу ли, в список ли, или деревом)

    В простых случаях логики представления очень немного. Поэтому где она находится - плевать.
    Но по мере усложнения ее становится весьма много и она начинает мешать и в контроллере, и в шаблонах.
     
  19. toxin

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

    С нами с:
    12 мар 2009
    Сообщения:
    19
    Симпатии:
    0
    В моем случае перевод синтаксиса тегов в синтаксис php ?
    Как так если я в место {tetle} вывожу просто "хороший сайт"
    Получается просто транслирование спец тегов, и никакова php

    Вот если в место {title} я вывожу чтото вроде
    Код (Text):
    1.  
    2. <?php
    3. echo "Текст";
    4. ?>
    Тогда получается я транслирую спец теги на синтаксис php
    Разве нет ?

    Про mvc
    Выходит что логика приложения по сути в контроллере
    а логика представления в представлении тоесть в View


    Спасибо за обьяснения
    С уважением toxin...
     
  20. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    нифига,
    в ряде случаев ускоряет написание и оптимизирует работу с видом
     
  21. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    забудь, не забивай чистую голову
     
  22. toxin

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

    С нами с:
    12 мар 2009
    Сообщения:
    19
    Симпатии:
    0
    Mr.M.I.T., спасибо конешно за совет но мозг давно засран шаболнами проектирования типа mvc или фабрик =)
     
  23. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    На мой взгляд их проще понимать когда сталкиваешься с практической необходимостью.
    Т.е. работая с крупными и сложными проектами. (не обязательно highload, а именно структурно сложными)

    Я, откровенно говоря, больше половины патернов даже не придумаю куда можно притулить - ну не нужны они пока мне :)

    Singleton, Registry, Factory, Delegation, Dependency Injection, Observer, Service Locator, Data Table Gateway, отчасти Builder
    И вроде бы все :) про остальные читать - читал, а сказать чтобы понял полностью.... вряд ли :)
     
  24. toxin

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

    С нами с:
    12 мар 2009
    Сообщения:
    19
    Симпатии:
    0
    Ну хочу сказать большое спасибо за обьяснения
    Simpliest, Mr.M.I.T., SDR, [vs] и остальным если каво вдруг забыл !


    Всем большое спасибо
    С уважением toxin...