Новый шаблонизатор. Прошу КРИТИКУ синтаксиса

Статус
В этой теме нельзя размещать новые ответы.
Надеюсь что на нулледе не будет как на серче оффтопа на тему а нужен ли шаблонизатор
Если честно, как раз на эту тему и хотелось бы поговорить :D Ибо моё мнение, писать свой шаблонизатор- можно только под конкретные нужды (напр. оптимизированная под конкретный тип сайта или дизайнерской студии). Могу назвать Массу причин, хотя думаю, вы здесь не за этим.
Первое хочу сказать- тестировать скрипт на предмет скорости- если не будет хотя бы середнячком, то опустят сразу.
2- Про синтаксис вы не здесь спрашиваете. Для кого вы делаете шаблонизатор? Для прогеров или сеошникв? Нужно спрашивать более-менее профессиональных верстальщико, которые знают что хотят. И заставить их написать сочинение на тему "Каким я вижу идеальный шаблонизатор". И от этого отталкиваться.
 
Незнаю. У меня шаблонизатор на базе которого писался этот (80% кода осталось без изменений) был написан в 2003-м, и ни одного бага не было (этапы отладки при изменении API я не считаю - баги это то что попало в релиз). Так что как в том анекдоте - "Вас что не учили мыть руки после туалета? Нет нас учили не писать на руки". :) Конечно ошибки есть у всех, и наверняка во всем движке частью которого является этот шаблонизатор будут баги. Куда ж без них то :) Я к тому, что если проект не слишком сложный то "фиксятся баги" никак не может быть его достоинством - это все равно что сказать "его преимущество в том что он работает" :)
Раз уж "фиксятся баги" попало в достоинства то это говорит как раз о том что он СЛИШКОМ сложный... неоправданно сложный.
Огромный возможности, легко расширяется
90% из которых нафиг никому не нужны и используются единицами.
Это тоже идет в минус Смарти.
Главное в шаблонизаторе - возможность его расширения.
Главное в шаблонизаторе - простота. Вторым идет функциональность. Расширяемость это минус.
К примеру, поддержка виджетов, поддержка мультиязычности (вставка фраз на разных языках).
Виджеты это у нас кто? Если я правильно вас понял то для этого есть хуки. Все остальное от лукавого.
Мультиязычность - во вьюве (класс наследующий шаблонизатору) у меня есть метод "ланг" который читает файл со строковыми переменными (в основном для языковых файлов, отсюда и название) и добавляет их в массив переменых. Дальше они используются как обычные переменные в шаблоне.
Использование "бакса" {$var} в переменных визуально отделяет их от тегов. К примеру, можно объявить переменную {$doit} а можно объявить вызов ф-ции {doit} или {doit}xxx{/doit}. Доллар решает эту проблему.
Раньше я использовал более простой шаблонизатор и каждый раз в контроллерах приходилось делать кучу assign'ов, + надо было заботиться об экранировании переменных.
Часто в шаблонах менялась логика и в 90% случаях можно было обойтись правкой шаблона, но приходилось дополнительно делать изменение и в контроллере. Smarty решил эти проблемы, теперь в контроллер залезаю намного реже. Приведу даже пример:
PHP:
$user = new User();
$view->assign( 'user', $user );
шаблон
Код:
Привет, {$user->getName()|escape}
так бы пришлось передать юзернейм отдельно и заэкранировать его.
Это не есть задача верстальщика парится о ваших экранированиях. Программисту вообще нечего делать в шаблоне. В принципе нечего.
Я даже метод сейчас думаю написать автоматической генерации шаблонов при их отсутствии... чтобы уже верстальщик парился с их оформлением а для примера и автогенериного сойдет. Но пока руки не доходят, хоть и ничего сложного.
Или в интернет-магазине передаётся объект продукта и в шаблоне иногда нужно использовать цену в raw формате 1500.10 (для подстановки в javascript), а в остальных случаях в отформатированом виде: 1 500 руб. 10 коп.
незнаю. Помоему не так сложно передать рубли отдельно а копейки отдельно и выводить их или {rub} рублей {kop} копеек
или {rub}.{kop} :)
немного сложнее но зато не надо задумываться о синтаксисе...
(даже задумываться не буду как это усложнить.. в смысле упростить... все равно усложню)
Ещё пример: поддержка форм в шаблонах что-то вроде
Код:
{form name="myform"}
{input name="x"}
{select name="y"}
{/form}
Сами формы создаются в контроллере и при ошибках валидации подсвечиваются, автозаполняются и т.п.
Если при каждом нестандартном случае Вам придётся править код шаблонизатора - это неправильно.
Перемудрено. Создал себе форму ручками и не морочишь себе голову.
Я дико извиняюсь, но не мог бы ли ты дать ссылочку на ветку на серче, где рассказывают как избавиться от шаблонизатора.
Да нет там ничего разумного. Но все равно Для просмотра ссылки Войди или Зарегистрируйся.
ТС просил привести примеры.
Многомерный массив.
Допустим если некий массив
Код:
array('vasa','street','country','state','actions'=>'delete','edit','block','unblock')
Дальше там другие васи,пети,вани и тп.
Задача - показать список и вывести список доступных действий,учитывая что действия могут быть разные и список их создается еще до передачи парсеру.
В вашей системе это нереализуемо ?!
Спасибо за пример.
Не совсем понял ваш синтаксис. Но думаю вы имели ввиду чтото вроде:
PHP:
$people=arrray();
$people[]=array('name'=>'Вася','age'=>29,'actions'=>array(
         'delete','edit','block','unblock','view'
         ),'comment'=>'Свой клиент');
$people[]=array('name'=>'Петя','age'=>29,'actions'=>array(
         'view'
         ),'comment'=>'Чужой клиент');
Действительно такой синтаксис удобнее чем if-ами делать для каждого потенциального поля.
И тут еще вопрос переменных массива без индексов, т.е. когда в массиве только одна переменная можно синтаксис упростить. Подумаю над этим, это думаю реализую спасибо.
Что касается обьектов, это можно заменить системой плагинов,но у вас плагинов нету,как я понял? А разрабатывать шаблон в таких "зажатых" условиях даже врагу не пожелаешь.
Есть хуки, что вам еще надобно? :)
Ну а в ядре система плагинов да, предусмотрена...
хуки в шаблонизаторе сделаны именно для плагинов :)
тестировать скрипт на предмет скорости- если не будет хотя бы середнячком, то опустят сразу.
Таки выделил полчаса на тесты.
Технология теста:
Код:
грузим модуль
забиваем данные в модуль
засекаем время
в цикле тысячу раз выполняем шаблон
выводим время деленное на тысячу
такой подход показывает только время парсинга и не учитывает время подключения файла шаблонизатора (один файл), время выполнения методов передачи данных в шаблон, не учитывает время на собственно вывод данных в браузер и т.п.
Считаю что методы вида:
PHP:
	public function set($name,$data)
		{
		// Если имя переменной не body то добавим ее в массив
		if($name<>'body') $this->var_array[$name]=$data;
		}
не стоят оптимизации и оценки скорости их выполнения.
Результаты теста:
Шаблон "сферический конь в вакууме" из двух файлов общим размером в 380 байт с одним массивом внутри, парочкой if и переменных выполнялся 0,001сек
Реальный шаблон, довольно кривой (верстка таблицами, куча мусора) количество файлов - 9 шт (инклюды, вложенные инклюды, хуки и тп) - все выводятся на странице. общий размер файлов 10кб. два хука, два массива, несколько if пару переменных. Не самый сложный шаблон, но и не самый простой. В общем "типичный" так сказать.
Результат - 0.0043сек

Смотрел я в код - там куча мест для оптимизации - уверен что можно раза в два скорость поднять
свободно, но я не буду этого делать в ближайшем времени. Глупо заниматься нанооптимизацией - сильно нагруженный шаблон явно будет парсится быстрее чем у большинства пользователей будет до него пинг :)
Про синтаксис вы не здесь спрашиваете. Для кого вы делаете шаблонизатор? Для прогеров или сеошникв? Нужно спрашивать более-менее профессиональных верстальщико, которые знают что хотят. И заставить их написать сочинение на тему "Каким я вижу идеальный шаблонизатор". И от этого отталкиваться.
Где живут идеальные верстальщики? :) в разделе Дизайнеризма?
 
Раз уж "фиксятся баги" попало в достоинства то это говорит как раз о том что он СЛИШКОМ сложный... неоправданно сложный.
90% из которых нафиг никому не нужны и используются единицами.
Это тоже идет в минус Смарти.
Никак нет, если проект развивается, в нём обязательно появляются баги. Достоинство в том, что проект постоянно развивается и баги, если они находятся - своевременно фиксятся.

Главное в шаблонизаторе - простота. Вторым идет функциональность. Расширяемость это минус.
Виджеты это у нас кто? Если я правильно вас понял то для этого есть хуки. Все остальное от лукавого.
Погодите, функциональность получается за счёт расширяемости. По этому расширяемость - это незаменимая часть шаблонизатора.

Виджеты - это маленькие компоненты, у них есть свой мини-контроллер и шаблон. Можно назвать их блоками. Блок меню, блок логина, блок корзина магазина, блок баннер, и т.д.

Хуки - это "ловушки". Реализация паттерна Observer. Ничего общего с виджетами.

Помоему не так сложно передать рубли отдельно а копейки отдельно и выводить их или {rub} рублей {kop} копеек
или {rub}.{kop} :)
Пожалуйста, сделайте так, но когда кроме рублей появится другая валюта евро, доллар - будете кусать локти и править все шаблоны. Либо изменится формат форматирования цифр: был 1000 стало 1 000 или 1`000.

Повторюсь, шаблонизатор проверяется в бою, т.е. на реальных проектах. Он так же должен быть универсальным.

Перемудрено. Создал себе форму ручками и не морочишь себе голову.
Поверьте, так уже ни кто не делает. Если мне надо выделить инпут красным цветом, если он не был заполнен или вывести список select - одной строкой, а не целым циклом.

В целом мне понятна Ваша позиция, дальнейшее обсуждение не имеет смысла.

Советую всё же подумать над моими словами, у меня > 10 летний опыт в веб разработке, я знаю о чём говорю.
 
Виджеты - это маленькие компоненты, у них есть свой мини-контроллер и шаблон. Можно назвать их блоками. Блок меню, блок логина, блок корзина магазина, блок баннер, и т.д.
Хуки - это "ловушки". Реализация паттерна Observer. Ничего общего с виджетами.
Мы говорим об одном и том же. см. в моем описании понятие хуков.
Возможно термин "виджет" более удачный, я подумаю над этим. Но в той же булке используется термин хук.
Пожалуйста, сделайте так, но когда кроме рублей появится другая валюта евро, доллар - будете кусать локти и править все шаблоны. Либо изменится формат форматирования цифр: был 1000 стало 1 000 или 1`000.
Это личные проблемы программиста, и перекладывать их на верстальщика неправильно.
Если вы часто используете различные представления денег, то сделайте функцию преобразования форматов и вызывайте ее перед передачей в шаблон.
Повторюсь, шаблонизатор проверяется в бою, т.е. на реальных проектах. Он так же должен быть универсальным.
Шаблонизатор в первую очередь должен быть ПОНЯТНЫМ. Во вторую - универсальным.
Поверьте, так уже ни кто не делает. Если мне надо выделить инпут красным цветом, если он не был заполнен или вывести список select - одной строкой, а не целым циклом.
В целом мне понятна Ваша позиция, дальнейшее обсуждение не имеет смысла.
Советую всё же подумать над моими словами, у меня > 10 летний опыт в веб разработке, я знаю о чём говорю.
Никак нет, если проект развивается, в нём обязательно появляются баги. Достоинство в том, что проект постоянно развивается и баги, если они находятся - своевременно фиксятся.
Погодите, функциональность получается за счёт расширяемости. По этому расширяемость - это незаменимая часть шаблонизатора.
Да поймите же Вы наконец простую вещь - среднему верстальщику освоить даже мой синтаксис уже не просто, а Вы хотите его еще усложнить. Да, все что Вы пишете это прекрасно и удобно... для программиста. И программиста как-бэ не волнует что это увеличивает профессиональные требования к верстальщику. Меня волнует.
venetu очень правильно сказал:
Любые обсуждения в стиле "как сделать его лучше" приводят к тому, что шаблонизатор наполняется и наполняется разными фишками, и рано или поздно распухает до полноценного "скрипта в скрипте", в котором дизайнеру уже не легче разбираться, чем в самом php.
Смарти как раз классический пример жертвы подобного улучшения.
 
Mendel, большое спасибо за ссылку, я много почитал и теперь просветлился. Готов вставить свои 50 центов.

Начну, как водится, с очевидного: Чем стандартнее синтаксис, тем лучше. Потому что людей можно не учить, а набирать уже знакомых с ним. Поэтому, например, Smarty с этой точки зрения однозначно лучше всяких там там QFT, Savant, fTemplate..

Второе: Скорость работы шаблонизатора не так важна, как об этом любят писать во всяких сравнительных тестах. Потому что львиная доля времени выполнения скрипта приходится на model & controller, а вовсе не на view. Конечно, если 10 000 итераций blitz выполняет за 0.14 секунд, а Smarty - за 1.08 - то на первый взгляд разница колоссальная, почти в 10 раз! Но в действительности у вас этих итераций будет одна, редко две - а значит выбор "медленного" шаблонизатора добавит лишних 0.000094 секунды ко времени генерации страницы. Которые, конечно, "потом выльются в года", но можно посчитать за какое количество хитов - столько не живут.

Третье: Любой разговор о шаблонизаторах рано или поздно упирается в XSLT. Разумеется, синтаксис XSLT - не единственно возможный синтаксис шаблонизатора. Но XSLT - единый кроссплатформенный стандарт. Рекомендованный W3C и поддерживаемый всеми от Zend до Microsoft. Который будет одинаково выглядеть с точки зрения верстальщика что на Java, что на PHP, что на .NET. И синтаксис которого, кстати, намного больше подходит верстальщику, т.к. похож на css, а это то с чем верстальщик всю жизнь привык работать. И на который опять же намного проще найти человека. Грамотного, с опытом, с собственными наработками. А не учить его вашему синтаксису.

Ну и в заключении: Сам я пересел на php когда вышла 3-я версия, тогда еще у файлов появились расширения *.php3. И на тот момент php - это было что-то типа "динамического html", т.е. по сути ты пишешь "шаблон", который потом "парсится" такой спец. штукой, плагином к http-серверу, написанным на C - и на выходе получается готовый html.

Конечно, php с тех пор ушло далеко вперед, теперь это уже полноценный язык программирования, но свою первоначальную идею оно по-прежнему не выбросило. Его по-прежнему можно использовать как "штуку, которая парсит темплейты *.php и генерит из них html". Что в принципе многие и делают.

Ну и еще как критерий "хорошести" шаблонизатора хочу предложить возможность поддерживать set-конструкции, т.е. возможно ли в самом шаблоне создавать новые переменные. Или иными словами, возможно ли на языке шаблонизатора написать свой шаблонизатор со своим синтаксисом, т.е. уже "скрипт в скрипте в скрипте". Если да - значит шаблонизатор хороший, значит любой его сможет приспособить под свои нужды. )

PS: Сорри за простыню. Но я сам прочитал в 100 раз больше, перед тем как это тут сформулировать. ))

Добавлено через 31 минуту
Ну а если серьезно и резюмируя, то сделай синтаксис один-в-один как Smarty. У тебя он и так похож, по крайней мере сможешь повесить галочку "совместимо". Это намного важнее, чем "удобно", "ново", "быстро", "хорошо" и т.д.
 
Скорость работы шаблонизатора не так важна, как об этом любят писать во всяких сравнительных тестах.
О чем я и говорю. :)
Но тем не менее скорость является косвенным признаком простоты. А это важно.
Любой разговор о шаблонизаторах рано или поздно упирается в XSLT..... на который опять же намного проще найти человека.
Это конечно вариант хороший, но я не согласен с тем что найти под него специалиста. Этот стандарт пока на уровне ip6 а значит не стоит его вообще трогать. Теоретически у него шансы есть, но практически не стоит ради популяризации хорошего решения жертвовать популярностью своего скрипта.
Ну и еще как критерий "хорошести" шаблонизатора хочу предложить возможность поддерживать set-конструкции, т.е. возможно ли в самом шаблоне создавать новые переменные.
:) Мои конструкции {$переменная=значения} изначально звучали как {set=переменная=значение} но в одной из итераций по упрощению синтаксиса они стали тем чем стали.
Или иными словами, возможно ли на языке шаблонизатора написать свой шаблонизатор со своим синтаксисом, т.е. уже "скрипт в скрипте в скрипте". Если да - значит шаблонизатор хороший, значит любой его сможет приспособить под свои нужды. )
Возможности из области "а вдруг понадобится" я считаю минусом а не плюсом.
Хороший программист легко обходится минимумом синтаксиса. Расширения полезны, но не должны быть иконой.
Я помню как я в свое время портировал динамичесую игрушку с движущимися горами с компилируемого языка на 286-м на интерперетируемый бейсик ZX-Spectrum`а. Оригинал тормозил, а у меня задержки пришлось ставить (кто не помнит - мощности машин отличались примерно в сто раз).
Моя стратегия - все что нужно на практике должно быть в движке. Если оно используется в редких случаях - этого не должно быть.
Практика покажет что реально надо добавить. Ну а вот удалить потом уже будет нельзя по большому счету. К примеру я на практике увидел что для виджетов нужен свой минискин. Сделаю сейчас новую версию хуков. А что делать с тем, когда через полгода поймешь что та или иная функция была не нужна? Удалить? А вдруг кто-то ее использует? Депрекейтет это неприятный ход...
Ну а если серьезно и резюмируя, то сделай синтаксис один-в-один как Smarty. У тебя он и так похож, по крайней мере сможешь повесить галочку "совместимо". Это намного важнее, чем "удобно", "ново", "быстро", "хорошо" и т.д.
Чем удобно - нет. чем ново и быстро - да :)
Просто 100% совместимости не будет потому что я принципиально против большей части функционала смарти. Ну а на счет частичной совместимости я подумаю как лучше сделать.
 
Блин, нашел еще одну замечательную фразу:

Любое обсуждение шаблонизаторов скатывается в 3 ветки: Smarty / XSLT / Native PHP.

Потом перечитал прошлый свой пост: единственно нормальным вариантом считаю XSLT, сам при этом все делаю на Native PHP (с разнесением дизайна и кода, но все же, никаких движков), а для тебя, твоего шаблонизатора, раз уж ты его все равно написал, рекомендирую стать Smarty.

Мда, такие вот дела.. Сорри, но видишь, не я один. Правда жизни.. :(
 
то, что XSLT крут и кроссплатформенный - истинная правда. А вот то, что по нему "опять же намного проще найти человека" - ерунда (из собственного опыта), проще найти со знанием смарти. Да и кроссплатформенность далеко не всегда необходима.
Теоретически у него шансы есть, но практически...
Практически он уделает все шаблонизаторы, "когда большая тройка" научится его обрабатывать одинаково. Судя по всему, так оно и будет, вопрос когда. А пока - на вкус и цвет...

По сабжу дельного сказать ничего не могу, последний раз с шаблонизаторами (кроме xslt) имел дело лет 5 назад :ah:
 
smarty, smarty.... надоели ;)
в общем немного покурил я маны и код смарти.
нашел много интересного. ))))))
в том числе парочку уязвимостей, одна уйдет в паблик как дойдут ручки расковырять их код и написать заплатку. уязвимость небольшая, но показательная. к сожалению опубликую только недельки через две.
Ну и кое-что у смарти я таки возьму. в частности я определился нужны ли шаблоновые комментарии - нужны.
 
Если дело в простоте, почему бы не использовать сам PHP?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху