UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: 31rus от 02 Ноября 2016, 06:38:35

Название: Вызов result с конкретный ID
Отправлено: 31rus от 02 Ноября 2016, 06:38:35
Есть ли возможность вызвать шаблон <xsl:apply-templates select="result" /> для страницы с определенным ID

Мне часто требуется делать лендинги, сейчас я использую несколько вариантов выборок.
Меню, Usel и дальше choose и далее по типу данных или по его имени я вывожу страницы по нужным шаблонам.

Но меня не покидает идея, а реально ли на страницы layouts/default перебором получить все ID страниц и просто применить для каждой из них вывод result, что бы система сама дальше определяла какой передней тип данных и вызывала шаблоны в которых уже были бы уточнения.

Для Заголовков в Демодизи есть такой шаблон:
   <xsl:template match="result[@pageId]" mode="header">
      <h2 umi:element-id="{@pageId}" umi:field-name="h1" umi:empty="&empty-page-name;">
         <xsl:value-of select="@header" />
      </h2>
   </xsl:template>
Его назначение мне не совсем понятно, так как есть:
   <xsl:template match="result" mode="header">
      <h2 umi:element-id="{@pageId}" umi:field-name="h1" umi:empty="&empty-page-name;">
         <xsl:value-of select="@header" />
      </h2>
   </xsl:template>
Название: Re: Вызов result с конкретный ID
Отправлено: aghigay от 02 Ноября 2016, 12:28:28
<xsl:apply-templates select="result" /> - это вызов шаблона result
<xsl:apply-templates select="result[page/@id=12]" /> - это вызов шаблона result для страницы с ID= 12
<xsl:template match="result"> - это ОБРАБОТКА тега result (шаблон для тега result)
<xsl:template match="result[page/@id=12]"> - это ОБРАБОТКА тега result для страницы с ID= 12 (шаблон для тега result для страницы с ID= 12)

Подробнее об этом по запросу XPATH. Пример статьи выдачи https://habrahabr.ru/post/114772/
Название: Re: Вызов result с конкретный ID
Отправлено: 31rus от 12 Ноября 2016, 08:56:35
Вызовы и уточнения шаблонов я умею делать, вопрос как обработать уточняющий шаблон когда id страницы заранее не известен.

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

Например в секции Item в меню делаем разбор по типам данных
 <xsl:choose>
        <xsl:when test="$type_name = 'Промо видео'">
            <xsl:apply-templates
                    select="document(concat('udata://photoalbum/album/(', $upage/@id,')'))"
                    mode="bg-video"/>
        </xsl:when>
        <xsl:when test="$upage/basetype/@module = 'photoalbum'">
            <xsl:apply-templates
                    select="document(concat('udata://photoalbum/album/(', $upage/@id,')'))"
                    mode="content"/>
        </xsl:when>
        <xsl:when test="$type_name = 'Отзывы'">
            <xsl:apply-templates
                    select="document(concat('udata://news/lastlist/(', $upage/@id,')/notemplate/10/0'))/udata"
                    mode="testimonials"/>
        </xsl:when>
        <xsl:when test="$upage/basetype/@module = 'webforms'">
           
        </xsl:when>
        <xsl:when test="$type_name = 'Страница с описанием'">
            <xsl:call-template name="content-inner">
                <xsl:with-param name="upage" select="$upage"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:call-template name="content">
                <xsl:with-param name="upage" select="$upage"/>
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>

Но такой вариант не удобен и лишает гибкости, поэтому если можно было бы, передать системе просто вызов result с указанием Id нужной страницы, а далее система сама решала бы, какой перед ней тип данных и вызывала бы уже стандартные шаблоны для него.

То тогда в layots\default.xsl мы бы просто написали  запись типа
<xsl:for-each select="document(concat('usel://menu/', 1))/udata/page">
<xsl:apply-templates select="result[page/@id= id текущей страницы]" />
</xsl:for-each>
Название: Re: Вызов result с конкретный ID
Отправлено: aghigay от 12 Ноября 2016, 16:23:10
Так как id типа обычно не меняется, то вы можете делать проверку через атрибут типа: @type-id вместо @id
<xsl:template match="result[page/@type-id=12]">