Идеальный шаблонизатор

Статус
В этой теме нельзя размещать новые ответы.

WP

^_^
Bakti9rov
Жжошь. Не проще скомпилировать шаблон в PHP-код и закешировать eAccelerator'ом?
 

Dagdamor

Новичок
WP
Если ты о быстродействии, то разочарую тебя - нативный шаблонизатор все равно уделает такой кеш по скорострельности :)
 

С.

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

Не согласен с таким примером [идеального шаблона дерева]. Не забывайте, что вся структура документа представляет собой дерево, наиболее удачное и гибкое решение предоставляет XSLT
Кто сказал, что наш идеальный шаблон должен быть похожим на XSLT'шный? В данном конкретном случае, когда блок <LI> вынесен за пределы <UL>, это добавяет лишнюю абстракцию или условность, совершенно ненужную для нашего идеального шаблона. В данном случае нахождение <LI> между <UL> (где ему и положено по логике) -- обязательное условие контрольной задачи.

Bakti9rov привёл более правильный список
К этому списку мы как раз должны подойти. Это и будет шаблонизатор с расширенной функциональностью, который мы ищем или создаем. Единственный имеюшийся на данный момент как-то соответствующий ему - XSLT. Но для того и даны были две контрольных задачи, чтобы не уплывать в облака. Соответствовать-то идее он соответствует, но как решает конкретные задачи?

-~{}~ 15.10.07 15:35:

Даю установку: в этой теме забыли про скорости!

-~{}~ 15.10.07 15:40:

Не надо хвастаться, чей шаблон короче и чьи новости новее. Давайте примеры реализации построения дерева и форм.
 

atv

Новичок
atv, плохие примеры ты фактически заменяешь table/tr/td на table/row/cell, что не имеет никакого смысла.
Ты вед не пользовался XSLT ;-)

table/row/cell - это данные во входном XML документе. Фактически table/row/cell можно заменить на что угодно, хоть на plain text.

И как будет происходить отображение? В твоем примере я не вижу даже использования исходных данных.
Отображение будет происходить как раз по тем самым правилам
в) шаблонные правила, которые в зависимости от разметки преобразуют шаблон.
А входными данными является XML документ. который передаётся шаблонизатору.

Ну можно и попонятнее составлять шаблоны. Например так:
Ещё раз повторю, не нужно никаких циклов для отображения XML данных, это ограничивает повторное использование шаблонов.

В данном конкретном случае, когда блок <LI> вынесен за пределы <UL>, это добавяет лишнюю абстракцию или условность, совершенно ненужную для нашего идеального шаблона.
Ага, а как же повторное использование кода?

В данном случае нахождение <LI> между <UL> (где ему и положено по логике) -- обязательное условие контрольной задачи.
"Покупатели имеют возможность купить автомобиль любого цвета, при условии что этот цвет чёрный" (с) Генри Форд.
 

CatManZero

Новичок
Кто сказал, что наш идеальный шаблон должен быть похожим на XSLT'шный? В данном конкретном случае, когда блок <LI> вынесен за пределы <UL>, это добавяет лишнюю абстракцию или условность, совершенно ненужную для нашего идеального шаблона. В данном случае нахождение <LI> между <UL> (где ему и положено по логике) -- обязательное условие контрольной задачи.
Пожалуйста. Шаблон дерева. ul и li в одном флаконе:
PHP:
    <xsl:template name="tree">
        <xsl: param name="nodes"/>

        <xsl:if test="$nodes">
        <ul>
            <xsl:for-each select="$nodes">
<!-- содержание узла -->
            <li><xsl:value-of select="."/>
<!-- рекурсивный вызов -->
                <xsl:call-template name="tree">
                    <xsl:with-param name="nodes" select="node"/>
                </xsl:call-template>
            </li>
            </xsl:for-each>
        </ul>
        </xsl:if>
    </xsl:template>
Вызвать такой шаблон можно так:
PHP:
<xsl:call-template name="tree">
    <xsl:with-param name="nodes" select="/site/tree/node"/>
</xsl:call-template>
 

С.

Продвинутый новичок
Ага, а как же повторное использование кода?
Ты вообще за белых или за красных? Мы здесь за то, чтобы шаблон был очевиден. Про реюзабильность никто пока ничего не говорил и в условие не выставлял.
 

CatManZero

Новичок
Автор оригинала: atv
Ещё раз повторю, не нужно никаких циклов для отображения XML данных, это ограничивает повторное использование шаблонов.
Это почему же не надо? И чем это они ограничивают повторное использование?
 

atv

Новичок
Ты вообще за белых или за красных? Мы здесь за то, чтобы шаблон был очевиден. Про реюзабильность никто пока ничего не говорил и в условие не выставлял.
У очевидности бывают разные границы. Самым очевидным будет PHP код в перемешку с HTML в пределах 100 строчек. Больше этого количества очевидность уже теряется. Приходиться как-то структурировать код, а очевидность уже будет опираться не только на видимое представление, но и на правила структурирования, которые необходимо в этом случае знать.

Для меня приведенный пример на XSLT вполне очевиден, так как я знаю правила, по которым он будет обрабатываться. Точно так же PHP код может быть очевидным или не очевидным, в зависимости от правил по которым он структурируется. Если человек знаком только с функциями и не знаком с классами, то ООП код будет для него неочевидным.

XSLT обработку легко представить на PHP.

Представьте себе класс XSLTProcessor у которого есть управляющие инструкции (методы) apply-templates, value-of, for-each и т.д.

Код:
class XSLTProcessor
{
    function applyTemplates($select) {...}
    function valueOf($select) {...}
    function forEach($select) {...}
    function transform($inputData, $template) {...}
}
Также у него есть метод запуска преобразования transform. На вход этому методу передаётся древовидная структура входных данных и шаблон преобразования.

В структкре данных используются не просто названия переменных а ещё и типы переменных.

Логика преобразования остаётся неизменной. Алгоритм работы метода transform - это и есть:
в) шаблонные правила, которые в зависимости от разметки преобразуют шаблон.
Правила эти очень простые: взять корневой элемент входных данных и найти для него шаблон преобразования, поиск производиться по типу элемента. Если шаблон не найден, то всё, преобразование закончено. Если найден обрабатывается шаблон.

Код:
class XSLTProcessor
{
    function transform($inputData, $template) 
    {
        if ($this->isTemplateExists($inputData->getRoot())) {
            $this->applayTemplates($inputData->getRoot());
        }
    }
}

Далее, если в шаблоне не встречается инструкция apply-templates, то преобразование заканчивается, если инструкция присутствует, то выбирается следующий элемент входных данных в зависимости от параметра select инструкции apply-templates. По умолчанию, параметр select указывает на дочерние элементы текущего обрабатываемого элемента.

Таким образом рекурсивно происходит обработка всех входных данных.

А шаблон в нашей аналогии будет представлять собой класс XSLTTemplate у которого определены методы (шаблоны) для каждого типа входных данных.

Код:
class XSLTTemplate
{
    function rootTemplate($inputData) 
    {
        print '<html>';
        $this->xslt->applyTemplates($inputData->getChildrens());
        print '</html>';
    }

    function selectTemplate($inputData) {...}
    function inputTemplate($inputData) {...}
    // и т.д.
}
Это не рабочий код, а только концепция.

Как видите, ничего сложного в XSLT нет. Для PHP программиста такая аналогия должна быть понятной. И должно быть понятно, почему лучше не использовать циклы, а написать несколько небольших шаблонов.

Использование XML для написания шаблонов плохо только тем, что нет доступной IDE которая имела бы возможность подстановки xslt инструкций, а так, ни чем не страшнее ООП :)
 

Dagdamor

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

У очевидности бывают разные границы. Самым очевидным будет PHP код в перемешку с HTML в пределах 100 строчек. Больше этого количества очевидность уже теряется.
Это не так. Шаблоны на Смарти, даже достаточно сложные, вполне понятны новичку. Я в свое время разбирался со Смарти по примерам, без какой-либо документации. В случае XSLT такой номер не пройдет.
 

atv

Новичок
я не понимаю, как можно собрать таблицу с данными, не используя итератор.
Используя рекурсию. А рекурсия зашита в:
в) шаблонные правила, которые в зависимости от разметки преобразуют шаблон.
См. предыдущий мой пост.

-~{}~ 15.10.07 16:10:

В случае XSLT такой номер не пройдет.
Пройдёт, главное разобраться с правилом обработки шаблона, а оно очень простое.
 

С.

Продвинутый новичок
Dagdamor, в обычных шаблонизаторах шаблон "активен",а данные "пассивны". Принципиальное отличе XSLT в том, что у него данные "активные", а шаблон "пассивен". Итератор включается неявно на основе структуры данных.
 

CatManZero

Новичок
Автор оригинала: atv
Пройдёт, главное разобраться с правилом обработки шаблона, а оно очень простое.
Ага. А затем это нужно объяснить верстальщику, который в лучшем случае знаком с основами php... :cool:
 

atv

Новичок
Ага. А затем это нужно объяснить верстальщику, который в лучшем случае знаком с основами php
Приведенная выше аналогия использовалась для объяснения программистам а не верстальщикам, для верстальщика используются другие объяснения, и PHP ему не нужен.
 

Dagdamor

Новичок
atv
Рекурсию?? Это было неожиданно :)
А как же ограничение PHP на максимальный уровень рекурсии (100 вызовов, кажется)? Что, если на странице отображается более 100 записей?

С.
Имхо, это порочный подход. Шаблонизатор должен быть устроен так, чтобы диктовать правила отображения данных, а не зависеть от их структуры. Другими словами, должна быть система "шаг влево, шаг вправо - стреляю". В противном случае любые ошибки в структуре исходных данных будут приводить к непредсказуемому отображению их в шаблоне, это будет очень сложно отследить и отладить.

Гипотетический пример: выводим таблицу, для каждой строки выводится набор дополнительных полей, которые вычисляются предварительно. Допустим, для одной строки одно из полей вычислено не было, отсутствует. В нормальном шаблонизаторе будет выведена пустая ячейка таблицы + notice о не найденном индексе массива. В XSLT, похоже, ячейка будет попросту пропущена, и таблица разъедется без каких-либо сообщений об ошибках.
 

pachanga

Новичок
Автор оригинала: atv
Приведенная выше аналогия использовалась для объяснения программистам а не верстальщикам, для верстальщика используются другие объяснения, и PHP ему не нужен.
Сегодня нанимать верстальщика без базового знания PHP себе дороже...
 

atv

Новичок
Рекурсию?? Это было неожиданно
В вызове "$this->xslt->applyTemplates($inputData->getChildrens());" присутствует и рекурсия и итерация. Просто вложенной итерации нет, она заменена рекурсией.

Допустим, для одной строки одно из полей вычислено не было, отсутствует. В нормальном шаблонизаторе будет выведена пустая ячейка таблицы + notice о не найденном индексе массива. В XSLT, похоже, ячейка будет попросту пропущена, и таблица разъедется без каких-либо сообщений об ошибках.
Проверки можно разместить на многих уровнях приложения, не только в шаблонизаторе. Вопрос в том, какая проверка на каком уровне уместна. Контроль входных данных, по моему, не совсем уместная задача для шаблонизатора.
 

С.

Продвинутый новичок
Подвожу промежуточные итоги.

1). Идеальный шаблонизатор в качестве "расширения" базовой функциональности должен обладать возможностью задавать шаблонные правила.

Единственным кандидатом пока выступил XSLT. Но рассмотрев XSLT выяснилось, что его концепция несколько иная, чем нам требуется. "Королем" в технологии XSLT явлется программист, предоставляющий входящий XML поток, а дизайнер с XSL его обслуживает. В определении XSLT is used to transform an XML document into another XML document, or another type of document that is recognized by a browser, like HTML and XHTML даже сам шаблон не упоминается, как просто "рабочий" момент.

Мы же рассматриваем вариант, когда программист предоставляет данные, чтобы обслужить дизайнера. Дизайнер - король и его шаблон - отправная точка. Таким образом:

2). Идеальный шаблонизатор предназначен для трансформирования HTML документа в HTML документ.

То есть в "сыром" не трансформированом виде шаблон уже должен являться практически корректным HTML документом. Никаких таких "этот блок должен быть внутри, но мы его помещаем снаружи потому, что мне (программисту) так удобнее".
 

CatManZero

Новичок
Автор оригинала: atv
Приведенная выше аналогия использовалась для объяснения программистам а не верстальщикам, для верстальщика используются другие объяснения, и PHP ему не нужен.
А как верстальщику это объяснить? Вот подготовил верстальщик верстку. Программист превратил их в шаблоны. Завтра говорят верстальщику. Вот мы добавили новую фишку на сайт. Оформи ее. Он открывает шаблон и вместо своей верстки видит мешанину ввиде <apply-templates> и <templates>. Как ему объяснить как они взаимодействуют?
Автор оригинала: Dagdamor
Имхо, это порочный подход. Шаблонизатор должен быть устроен так, чтобы диктовать правила отображения данных, а не зависеть от их структуры. Другими словами, должна быть система "шаг влево, шаг вправо - стреляю".
...
Кстати, именно по этой причине я когда-то отказался от этих apply-templates. Когда шаблоны становятся сложнее, чем "меню справа-по середине текст", apply-templates начинают конфликтовать друг с другом самым наглым образом. А @mode вносят в эту мешанину ещё больше хаоса. И ни как не способствуют "повторному использованию шаблонов".

Автор оригинала: pachanga

Сегодня нанимать верстальщика без базового знания PHP себе дороже...
Дело в том, что у нас в компании такое разделение труда:
1) дизайнер готовит макет
2) верстальщик используя photoshop и html-редактор превращает макет в верстку. Делает так, что б она отображалась правильно во всех популярных броузерах. Соответственно знать php ему не обязательно и обходится такой верстальщик дешевле.
3) программист "натягивает" верстку на движок. Превращает их в шаблоны.
4) затем верстальщик может привлекаться для окончательной доводки сайта до кондиции. А также при добавлении новой функциональности, когда ее нужно оформить.
 

pachanga

Новичок
...
4) затем верстальщик может привлекаться для окончательной доводки сайта до кондиции. А также при добавлении новой функциональности, когда ее нужно оформить.
У нас все точно также, однако вот именно на этом шаге верстальщику обычно требуются базовые знания PHP, чтобы он не отвлекал программистов или банально не накосячил в шаблонах.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху