Здравствуйте, конечно не хочется делать холивар, так как тема шаблонизаторов всеми "любима" я смотрел форум и на эту тему идут большие дискусии, но я как начинающий хотел бы задать несколько вопросов мастерам, дабы те обьяснили мне как работает шаблонизатор, возможно я не так мыслю Суть темы: Как я понимаю шаблонизатор класс который должен заменять спец теги в шаблоне(файле) на какуето информацию, но я видер реализации в которых сначала искались спец теги а уже потом искалась информация которая подходит к ним тоесть, два масива один цисленный со спец тегами, второй асоциативный с информацией, в интоге обход и заменя информации, вывод шаблона. Еще несовсем понятно выражение компиляция шаблона, насколько я знаю компиляция это транслюция языка програмирования к машинному, как же htm файл перекомпилировать в html ??? Как реалзовывается вывод новостей в шаблонах? В большенстве реализаций делается обход массива, и в шаблоне пишется чтото вроде {foreach $a as $d => $c} код шаблона повторения{/foreach} и получается минимум 2 таких выражения(обхода), ИМХО мне это не очень нравится, ведь возможно зделать что такой же многомерный массивбудет отдаваться шаблонизатору, а тот в свое время будет делать обход и вставлять 10 новостей соответсвую массиву, в шаблон Почему так не делают ? геморойно ? или овчинка выделки не стоит ? Вот в принцепе и все, что меня пока интересует Конечно чтото можно было выложить в коде, но я только новичок, не хочется позориться =)) Буду благодарен за люые ответы, только сильно не бейте Спасибо с уважением toxin....
Отркытие файла, замена тегов переменными и вывод на экран - уже шаблонизатор. Класс - не обязательно =) Под компиляцией шаблонов подразумевают замену спецтегов нужными данными и сохранением на диск для дальнейшего вывод на экран (чтобы каждый раз не обрабатывать шаблон заново). Или еще - замену спецтегов на куски php-кода, чтобы получвшийся файл просто includ'ить в скрипт (так намного быстрее). Вот пример.
почему написал что шаблонизатор класс ИМХО я думаю так удобнее Что такое шаблонизатор понял ! Спасибо С компиляцией получается что это шаблонизатор + кеширование шаблонов ? если не прав, поправте =( Отается вопрос, -как должна выглядеть структура самого шаблонизатора, как правильнее, или как "экономнее" написать шаблонизатор что бы он ел как можно меньше ресурсов сервера ? -вывод новостей шаблонизатором ?
Не писать его вовсе, а использовать просто PHP Важно при этом уметь отделять код представления от логики приложения.
1)Грузим шаблон newslist.tpl Код (Text): <table> <tr><td>{TITLE}</td></tr> <tr><td>{TEXT}</td></tr> <tr><td>{LINK}</td></tr> </table> 2)В цикле собираем в переменную $buffer таблицу отпарсеный шаблон для каждой новости PHP: foreach ($news as $new) { $buffer .= tpl_parser(... 3)Заменяем в основном шаблоне тег {NEWS} переменной $buffer. Вообще вариантов много. Логика в шаблонах (циклы, условия) не есть гуд (ИМХО). Примерно это кстати и происходит при компиляции шаблона в php-скрипт. Если переменные фиксированы, можно написать такие шаблоны вручную, и никаких лишних трат системных ресурсов.
Может он и стоит иначе Но поставили вы его именно так Это только в том случае если есть отдельный слой логики представления. В противном случае, пусть лучше оно будет в шаблонах, чем вперемешку с логикой приложения.
Simpliest, я спросил как правильнее, а не писать мне его или нет =) По сути я беру шаблон block.tpl заменяю в нем спецтеги на информацию, и сохраняю его на диске, потом при заходе на сайт проверяю старый ли шаблон или нет, если нет подгружаю если да компилирую новый, вот по сути и все кеширование ? Соглашусь что логика в шаблонах не есть хорошо
Правильнее - это отделять логику от представления. А заморачиваться вопросом о производительности шаблонизатора - не правильно. Это не кеширование. это транслирование в native-PHP. Кешированием это будет если ты получишь статические страницы, без PHP вовсе.
шаблонизатор http://www.php.ru/forum/viewtopic.php?p=183191#183191 кеширование, это загрузка шаблончика с уже подставленными макросами
Кешировать можно БД. Кешировать можно код. Кешировать можно информацию получаемую из БД (храним результаты выборок в памяти) Кешировать можно информацию получаемую в результате расчетов (какие-то блоки данных) Кешировать можно отдельные части страниц (html с уже вставленными данными) Кешировать можно страницы целиком (статичные html которые могут просто отдаваться пользователю) При этом сам кеш может находится в памяти или файлах. Да и кешей может быть много (твой кеш приложения, кеш сервера, кеш прокси, кеш браузера) Поэтому любую оптимизацию начинают с выяснения узкого места. В супер-пупер нагруженных проектах, когда выжимаются последние капли, могут применяться все кеши сразу.
Кстати да, если нужно простое решение - этого более чем достаточно. Если недостаточно, то долго куришь MVC. А потом так же долго пытаешься его оптимизировать. Потому что любая дополнительная абстракция - это накладные расходы.
я не могу понять если сохронение копии файла block.tpl с уже подставленными значениями, а затем их вывод, это трансляция то чем отличается Выходит разница в том что в кешировании я перехватываю весь вывод на экран функцией ob_start(); если я правильно понял, а в транслировании я просто делаю копию кода так ? Речь идет про шаблонизатор, причем здесь mvc ? Что такое mvc знаю, но у каждого своя реализация данного шаблона
да. генерация native-php шаблона из самописанного шаблона согласен с мнением Simpliest, что нафиг оно вообще не спёрлось, если грамотно разделять логику от представления в любом случае шаблон это V из mvc.. MC между собой можете скрещивать как угодно, если вам хочется ;-)
Нет. Я возможно некорректно выразился. А сейчас ты совсем запутаешься. Вот смотри. Когда ты псевдо-логику шаблона переводишь в php - это трансляция. Обработка такой хрени Код (Text): <span>{somevar}</span> Это трансляция А это Код (Text): <span><=$somevar?></span> просто вывод. Сохранение же в памяти конечного варианта для обоих случаев HTML: <span>Привет</span> Это кеширование. Ты код, который там, внимательно смотрел? Там тоже шаблонизатор. Я вел речь о том - если тебе не хватает этого решения и ты начинаешь придумывать или То стоит начать думать о переходе к полноценному MVC где шаблон лишь часть View.
понял так Трансляция - замена спец тегов в шаблоне Кеширование - сохранение готового куска кода(html кода, без php) для {test} html -> трансляция -> проверка кеша -> вывод для <?=test?> html -> вывод -> проверка кеша -> вывод НО Непонятно без php, ты имеешь в веду, без php кода в готовом html файле, тогда понял, если чтото другое, тогда не понял.... Тоесть все обходы масивов вся логика в шаблонах, от недостатка контроллера ? поэтому в шаблонизаторах делают поддержку логики ?
Трансляция это перевод одного синтаксиса в другой. В твоем случае синтаксиса тегов в синтаксис PHP. Да. Нет. Есть два типа логики - логика представления и логика приложения. Логика приложения находится в контроллере и отвечает за то "ЧТО выводить" (условно говоря, ты получил массив записей обработал его и тебе дальше плевать как они выведутся) Логика представления находится где кому взбредет и отвечает за то "КАК выводить" (в таблицу ли, в список ли, или деревом) В простых случаях логики представления очень немного. Поэтому где она находится - плевать. Но по мере усложнения ее становится весьма много и она начинает мешать и в контроллере, и в шаблонах.
В моем случае перевод синтаксиса тегов в синтаксис php ? Как так если я в место {tetle} вывожу просто "хороший сайт" Получается просто транслирование спец тегов, и никакова php Вот если в место {title} я вывожу чтото вроде Код (Text): <?php echo "Текст"; ?> Тогда получается я транслирую спец теги на синтаксис php Разве нет ? Про mvc Выходит что логика приложения по сути в контроллере а логика представления в представлении тоесть в View Спасибо за обьяснения С уважением toxin...
Mr.M.I.T., спасибо конешно за совет но мозг давно засран шаболнами проектирования типа mvc или фабрик =)
На мой взгляд их проще понимать когда сталкиваешься с практической необходимостью. Т.е. работая с крупными и сложными проектами. (не обязательно highload, а именно структурно сложными) Я, откровенно говоря, больше половины патернов даже не придумаю куда можно притулить - ну не нужны они пока мне Singleton, Registry, Factory, Delegation, Dependency Injection, Observer, Service Locator, Data Table Gateway, отчасти Builder И вроде бы все про остальные читать - читал, а сказать чтобы понял полностью.... вряд ли
Ну хочу сказать большое спасибо за обьяснения Simpliest, Mr.M.I.T., SDR, [vs] и остальным если каво вдруг забыл ! Всем большое спасибо С уважением toxin...