§ 32. Структура шаблонов

Содержание

Большинство сложностей внесения изменений в существующий дизайн ресурса связаны как правило с неправильной организацией шаблонов. Ровно как и с кривой структурой CSS сложно бывает поменять цвет заголовков сразу по всему сайту.

Часто сталкиваюсь с такими конструкциями в шаблоне:

импорт 'шапка'
импорт 'подвал'

шапка
заголовки
основная часть страницы
подвал

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

Шаблон конечной страницы должен:

  • быть наследником другого шаблона;
  • описывать только уникальную часть страницы.

Хороший шаблон должен выглядеть так:

импорт 'страница типа Х'
основная часть страницы

Тип Х подразумевает следующее: чаще всего страницы делятся на главную и внутренние, то есть два типа. Типов может быть больше: тип статья, тип таблица, тип картинка и пр.

Пример из XSLT — структура вызываемых шаблонов для страницы сервиса:

Шаблон конкретного сервиса:

<xsl:stylesheet>
    <xsl:include href="service.xsl" />

    <xsl:template match="page" mode="service-content">

    Вывод самого сервиса

    </xsl:template>
</xsl:stylesheet>

Шаблон страницы типа «сервис» (service.xsl):

<xsl:stylesheet>
    <xsl:import href="layout.xsl" />

    <xsl:template match="/page" mode="content">
        <xsl:call-template name="switch-menu" />
        <xsl:call-template name="title" />

        <xsl:apply-templates select="." mode="service-content" />

        <xsl:call-template name="result-links" />
    </xsl:template>

    <xsl:template name="switch-menu">
        ...
    </xsl:template>

    <xsl:template name="title">
        ...
    </xsl:template>

    <xsl:template name="result-links">
        ...
    </xsl:template>
</xsl:stylesheet>

Общий шаблон для всех страниц (layout.xsl):

<xsl:stylesheet>
    <xsl:template match="/">
        <html>
            <head>
                <xsl:call-template name="html-head" />
            </head>
            <body>
                <xsl:call-template name="html-body" />
            </body>
        </html>
    </xsl:template>

    <xsl:template name="html-head">
        ...
    </xsl:template>

    <xsl:template name="html-body">
        <xsl:call-template name="header" />
        <xsl:call-template name="ads" />
        <xsl:apply-templates select="/page" mode="content" />
        <xsl:call-template name="footer" />
    </xsl:template>

    <xsl:template name="header">
        ...
    </xsl:template>

    <xsl:template name="footer">
        ...
    </xsl:template>

    <xsl:template name="ads">
        ...
    </xsl:template>
</xsl:stylesheet>

Таким образом, шаблоны находятся в отношении обратного включения, хотя логически верхним является layout.xsl, который включает в себя service.xsl, который включает в себя шаблон конкретного сервиса.

Такое отношение между шаблонами позволяет в каждом конкретном случае перегружать любой из родительских блоков в шабоне конкретного сервиса, поскольку именно он включает в себя все остальное. К примеру, убрать дополнительные блоки под сервисов или не выводить заголовок. В то же время, для всех сервисов можно добавить какой-нибудь счетчик или шарилку, внеся изменения лишь в шаблон service.xsl.

На живом примере — страница конвертера величин, шаблон которой выводит лишь незатемненную часть:

Скриншот WhoYougle
Скриншот WhoYougle



26 февраля 2011 г.
Данила Ковчий
http://kovchiy.livejournal.com/22328.html