Преобразования данных, логика отображения. XSLT, template engines, альтернативы.

fixxxer

К.О.
Партнер клуба
Преобразования данных, логика отображения. XSLT, template engines, альтернативы.

Вопрос во многом теоретический. ;)

Постановка задачи такая. Предположим, у нас есть:

1. Набор данных в некотором структурированном сериализованном виде (XML, JSON, YAML - не суть важно), полученный из внешнего источника. Источнику можно сказать, в каком формате выводить данные (считаем, что он уже поддерживает любой непротиворечивый формат данных, какой нам придет в голову), но не более.

2. Текстовый шаблон, представляющий собой HTML с некоторой разметкой (валидный XHTML, обычный HTML с разметкой псевдокомментариями, еще что-то - не важно).

3. Некий набор инструкций, позволяющий задавать правила, по которым данные размещаются в шаблоне, по сути язык трансформации.

Задача - выбрать наиболее подходящие инструменты и разработать реализацию п.2 и п.3, то есть, по сути, "изолированный template engine".

Варианты реализации, перечисляю навскидку:

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

2. Любой шаблонный движок + интерпретатор языка, на котором (или экстеншеном для которого ;) ) он написан. Здесь два совершенно разных подхода:

2.1. Smarty или ему подобный движок. PHP-скрипт парсит полученный набор данных(1), делает ему assign, не вникая в структуру (т.е. для любого набора данных и любого шаблона код один и тот же); вся логика отображения размещается непосредственно в шаблоне. Преимущества и недостатки такого подхода уже были неоднократно озвучены; дополнительно лишь отмечу, что синтаксис Smarty все же ограничен, и, если все assign-ы у нас автоматические и делаются только исходя из структуры полученных данных, не всегда можно (по крайней мере, легко) получить необходимый результат.

2.2. Blitz, php-templates или ему подобный движок; каждый view состоит из 2-х частей - простого шаблона с блочной разметкой и php-скрипта, отвечающего за логику отображения. Вьюхи здесь разрабатывают два человека, находящиеся в прямом контакте - php-программист и верстальщик (ну либо один в двух лицах). Возможности, по сути, неограничены, но необходимо знание PHP.

2.3. Pure <language>, по сути разновидность п.2.1 (хотя можно сделать и по типу 2.2), с очевидным недостатком - легко отстрелить себе ногу.

В обоих случаях недостатком является использование полноценного интерпретатора универсального языка программирования для решения, в общем-то, узкой задачи.

3. Какой-то не перечисленный здесь подход, о котором вы мне расскажете, а я скажу вам спасибо ;). Может быть сколь угодно теоретическим и гипотетическим ;)
 

Alexandre

PHPПенсионер
некоторые замечания (сугубо теоретические)
п.1
требуется обучение верстальщика, и не факт, что хватит мозгов).
практика показывает, что
- XSLT шаблоны строются простые, нет сложной логики преобразований.
- в данную логику шаблонов, как правило верстальщик въезжает, не хуже чем в логику смарти.
- шаблоны с более сложной логикой, как впрочем и шаблоны смарти - делает разработчик. верстальщик только "натягивает" дизайн.
PS. или мне так повезло с верстальщиками, или у нас любят занижать интеллект верстальщиков.

2.1.
вся логика отображения размещается непосредственно в шаблоне.
хочу заметить, что все-же часть логики отображения...
хотя можно и во всю мощь используя плагины, кэллбэки и прочие приблуды. Тогда, роль верстальщика в разработке шаблона действительно ограничится. По сути - шаблон будут делать два человека - программист - рамочный вариант, а верстальщик окончательный. почти как в варианте 2.2

надо определить рамки логики отображения.

2.3. я работал с одним проектом, где был Pure <language>.
вполне приемлемо было все организованно. вот пример http://www.massassi.com/php/articles/template_engines/

вариант 3. шаблонный движок http://ctpp.havoc.ru/algorithm.html
хотя он от варианта 2.2 мало отличается
 

fixxxer

К.О.
Партнер клуба
интеллект верстальщика в постановке задачи занижен умышленно, я не буду распространяться о причинах, хорошо? :) останемся в рамках теории.

по сути, можно было бы сформулировать вопрос как "если бы вы были ведущим инженером в яндексе, что бы вы использовали если не xslt", но без пояснений и презентаций яндекса это не совсем понятно. яндекс взят как пример, где как раз куча сеpвисов по принципу п.1 в постановке.

и, да, по поводу XSLT основным недостатком я считаю низкую производительность, с остальным жить можно.

и прошу обратить особое внимание на п.1 в постановке задачи.

-~{}~ 22.01.08 20:03:

ах да.
важное уточнение: те, кто работает здесь с view, не доверенные люди ;) т.е. вопрос безопасности также важен.
 

dark-demon

d(^-^)b
не понятно, чем не угодили другие холиварные темы :) ну да ладно...


> XSLT - нетривиальный синтаксис, требующий перестройки мышления

в xslt заложены те же принцыпы, что и в css. если верстальщик не может понять css - гони его в три шэи.


из остальных подходов - самый вменяемый - это 2.2, ибо почти не мешает логику с частями выводимого документа (шаблоном)

-~{}~ 22.01.08 20:17:

> 3. Какой-то не перечисленный здесь подход, о котором вы мне расскажете, а я скажу вам спасибо

я тут где-то уже описывал... верстальщик подготавливает шаблон со всем фаршем и размечает отдельные его части классами и идентификаторами, а программист с помощью xpath вытягивает из шаблона маленькие кусочки, которые и натягивает на данные.
но это совсем фиговый для программиста подход :) хотя верстальщику - лахва :)
 

fixxxer

К.О.
Партнер клуба
охх, я старался минимализировать холиварность в формулировках. :)

пожалуй, нужны еще важные уточнения.

вьюхи разрабатывают в т.ч. и сторонние люди

т.е. хочется, чтобы тривиальные шаблоны выглядели просто. в xslt все же даже самые простые вещи требуют минимального понимания происходящего, просто {{ $name }} написать не получится.

но это все решаемо примерами.

главный вопрос, все же, производительность. вот, например, возможно ли реализовать в xslt кэширование, чтобы один и тот же stylesheet парсился только 1 раз, пока не изменится?

-~{}~ 22.01.08 20:25:

о чем-то схожем с п.3 я и размышлял, кстати. но тут опять же - производительность.
 

korchasa

LIMB infected
Re: Преобразования данных, логика отображения. XSLT, template engines, альтернативы.

Автор оригинала: fixxxer
Вопрос во многом теоретический. ;)
...
В обоих случаях недостатком является использование полноценного интерпретатора универсального языка программирования для решения, в общем-то, узкой задачи.
...
А может от обратного: чего в предложенных вариантах не хватает?
 

Alexandre

PHPПенсионер
главный вопрос, все же, производительность. вот, например, возможно ли реализовать в xslt кэширование, чтобы один и тот же stylesheet парсился только 1 раз, пока не изменится?
в пхп есть экстеншен xsltcache, но честно говоря я не понял его принципа. может слишком поверхностно изучил исходники.
в libxml есть возможность сохранить бинарное дерево (как - я пока точно не знаю, но это возможно через использование XML буфера http://xmlsoft.org/html/libxml-xmlIO.html, http://xmlsoft.org/html/libxml-parserInternals.html ), а следовательно и организовать xslt кеширование. все это - большая исследовательская работа.
Микрософты вопрос с сохранинием / загрузкой бинарного XMLля решили.

лично я против использования XSLT в качестве шаблонизатора, т.к. производительность XSLT недостаточная.

Почему использует яндекс XSLT, наверно у них много денег... а вот опытных XSLT программеров они найти не могут. Зато они могут выделить несколько серверов только на кеширование данных. мы - себе этого позволить не можем.
 

korchasa

LIMB infected
Автор оригинала: fixxxer
...вот, например, возможно ли реализовать в xslt кэширование, чтобы один и тот же stylesheet парсился только 1 раз, пока не изменится?
...
А в чем сложность построения скомпилированных версий? Если в только в том, что при наследовании теряется связь между шаблонами, то на это забить проще. Не так же часто они изменяются? А при желании можно и связь сохранять где-то отдельно и удалять только то, что нужно.
 

Фанат

oncle terrible
Команда форума
korchasa
Сложность в том, что скомпилированная версия XSLT - это HTML.
Поможет тебе компилирование при отображении этой страницы форума?
 

fixxxer

К.О.
Партнер клуба
о, спасибо. там, оказывается, все серьезно. :)
вопрос производительности xslt тогда откладывается до разработки кэширующего xsltproc и проведения бенчей.

Подытог: xslt принимается как возможный вариант решения, вопрос производительности будет рассмотрен. Рассматриваются альтернативы ;)
 

korchasa

LIMB infected
Автор оригинала: *****
korchasa
Сложность в том, что скомпилированная версия XSLT - это HTML.
Поможет тебе компилирование при отображении этой страницы форума?
Нда, растекся я мыслями по древу...извиняюсь...думал в это время о компилировании шаблонов blitz.
 

Alexandre

PHPПенсионер
вопрос производительности xslt тогда откладывается до разработки кэширующего xsltproc и проведения бенчей.
кто будет разрабатывать кеширующую xsltproc ? хотя - это чертовски полезная штука.
у меня - чесс слово нет времени, занят еще одним ненужным шаблонизатором (в качестве модуля на сервере)
это вариант 3.1

-~{}~ 22.01.08 21:03:

fixxxer а почему бы не попробовать xsltcache в качестве модуля. заоодно и поделишься впечатлениями?

-~{}~ 22.01.08 21:09:

так вот об XSLT,
хоть я и написал, что я против XSLT-шаблонизации
но я активно использую ее в бэкэнде.
например - есть некая партнерка, которая предоставляет XML в формате Яндекс-Маркет.
я тяну wget-ом свой XML с партнерского сайта, запускаю xsltproc и получаю свой HTML-блок.

есть погода/курсы валют - представленные в XML? технология таже.
 

fixxxer

К.О.
Партнер клуба
fixxxer а почему бы не попробовать xsltcache в качестве модуля. заоодно и поделишься впечатлениями?
меня в этом вопросе вообще не интересует php ;) примеры в стартовом посте приведены как наиболее понятные иллюстрации имеющихся принципов. хотя его (xsltcache) исходники посмотреть конечно не лишнее ;)
 

Alexandre

PHPПенсионер
хотя его исходники посмотреть конечно не лишнее
слушай, ты как человек с большим опытом потом поделишься - в чем там фишка. я, чесслово не понял.

-~{}~ 22.01.08 21:26:

важное уточнение: те, кто работает здесь с view, не доверенные люди т.е. вопрос безопасности также важен.
в си подобных шаблонизаторах, где процесс осуществляет: парсинг/замена - вопрос безопастности отпадает.
если есть реализация callbak - то, верстальщику внедрить в сишный модуль свою callbak - крайне маловероятно.

-~{}~ 22.01.08 21:29:

меня в этом вопросе вообще не интересует php примеры в стартовом посте приведены как наиболее понятные иллюстрации имеющихся принципов.
тогда стоит поглядеть:
вариант 3. шаблонный движок http://ctpp.havoc.ru/algorithm.html
хотя он от варианта 2.2 мало отличается
мне лично синтаксис не очень нравится, ну привык я к смарти...
а настройки в первых версиях не было.
хотя, какая разница... привыкнем и к новому синтаксису.
 

fixxxer

К.О.
Партнер клуба
а ctpp я уже смотрел.

по производительности оказалось заметно хуже смарти. пробовал, правда, в качестве php extension, но вероятность того, что тормозит extension а сама либа мега-замечательно-шустрая, весьма мала.

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

AmdY

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

tony2001

TeaM PHPClub
>в пхп есть экстеншен xsltcache, но честно говоря я не понял его принципа

на persistent ресурсах.
 

С.

Продвинутый новичок
Re: Преобразования данных, логика отображения. XSLT, template engines, альтернативы.

Автор оригинала: fixxxer
2.1. ...отмечу, что синтаксис Smarty все же ограничен...

2.3. Pure <language> ... с очевидным недостатком - легко отстрелить себе ногу.
Когда-то все же придется сделать выбор: или шашечки, или ехать.
 
Сверху