Использование условий на примере макроса core navibar в шаблоне demodizzy — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
 
(не показаны 43 промежуточные версии этого же участника)
Строка 4: Строка 4:
 
== Вывод постраничной навигации ==  
 
== Вывод постраничной навигации ==  
  
 +
Для вывода постраничной навигации в системе предусмотрен макрос %core navibar()%, см. "Полезные ссылки".
 +
 +
=== Решение  ===
 +
 +
Добавим в файл /templates/demodizzy/xslt/modules/content/common.xsl перед иклюдами (include) следующий код:
 
<source lang="xml">
 
<source lang="xml">
 +
 +
<!-- вывод результатов работы макроса %core navibar()% -->
 +
 +
        <xsl:template match="udata[@method = 'navibar']">
 +
<xsl:apply-templates select="items/item" mode="navibar"/>
 +
</xsl:template>
 +
 +
<!-- вывод пунктов навигации -->
 +
 +
<xsl:template match="item" mode="navibar">
 +
<a href="{@link}"><xsl:value-of select="."/></a>
 +
<xsl:text> » </xsl:text>
 +
</xsl:template>
 +
 +
<!-- вывод последнего пункта -->
 +
 +
<xsl:template match="item[position() = last()]" mode="navibar">
 +
<xsl:value-of select="."/>
 +
</xsl:template>
 
  </source>
 
  </source>
 +
Это шаблон для вывода результатов работы макроса, теперь нужно добавить вызов макрос, для
 +
этого добавим в файл /templates/demodizzy/xslt/layouts/default.xsl после вызова меню
 +
<source lang="xml">
 +
        <xsl:apply-templates select="document('udata://content/menu/(null)/1/')" mode="top_menu" />
 +
</source>
 +
следующий код:
 +
<source lang="xml">
 +
        <xsl:apply-templates select="document('udata://core/navibar')/udata"/>
 +
</source>
 +
 +
=== Результат ===
 +
[[Файл:Navibar1.png]]
  
 +
Как мы видим главной страницы в навигации не, так как она не стоит на одном уровне иерархии со странице "Каталог товаров",
 +
а мы бы хотели, чтобы в навигации она присутствовала, это задача решается версткой,
 +
добавьте в первый <xsl:template> в шаблоне вывода результатов макроса ссылку на главную страницу с текстом,
 +
то есть его окончательный код будет примерно следующим:
 
<source lang="xml">
 
<source lang="xml">
</source>
+
        <xsl:template match="udata[@method = 'navibar']">
 +
<a href="/">Главная</a> »
 +
<xsl:apply-templates select="items/item" mode="navibar"/>
 +
</xsl:template>
 +
</source>
 +
а выглядеть это будет вот так:
 +
 
 +
[[Файл:Navibar3.png]]
 +
== Вывод навигации на всех страницах, кроме главной==
  
== Вывод "псевдо" навигации на главной странице==
+
Допустим, мы не хотим, чтобы на главной странице выводился результат работы макроса, так как это лишено
 +
смысла и портит внешний вид:
 +
[[Файл:Navibar2.png]]
  
 +
Для этого воспользуемся конструкцией <xsl:if>, см. "Полезные ссылки".
 +
=== Решение  ===
 +
Сначала создадим переменную, которая будет отражаться является ли данная страница главной, для
 +
этого поместите в файл /templates/demodizzy/xslt/default.xsl, в нем заданы константы в demodizzy,
 +
следующих код:
 +
<source lang="xml">
 +
        <xsl:variable name="isMain" select=".//page/@is-default" />
 +
</source>
 +
Теперь в файле /templates/demodizzy/xslt/layouts/default.xsl обрамим вызов макроса %core navibar()%
 +
условием, код примет примерно следующий вид:
 
<source lang="xml">
 
<source lang="xml">
</source>
 
  
 +
<!-- если страница не является главной, то вывести результат работы макроса %core navibar()% -->
 +
 +
        <xsl:if test="not($isMain)">
 +
                      <xsl:apply-templates select="document('udata://core/navibar')/udata"/>
 +
        </xsl:if>
 +
</source>
 +
=== Результат ===
 +
Теперь результат работы макроса будет выводится на всех страницах, кроме главной.
 +
== Вывод навигации для системных страниц  ==
 +
Как мы можем заметить на системных страницах, таких как корзина товаров, личный кабинет, регистрация и др.
 +
макрос не выводит текущее название страницы:
 +
 +
[[Файл:Navibar5.png]]
 +
 +
Это из-за того, что макрос работает только с иерархическими страницами, то есть теми, которые Вы можете наблюдать
 +
в модуле "Структура", а системные страницы игнорируются.
 +
=== Решение  ===
 +
 +
В данной ситуации нам понадобиться еще одно условие, если страница является системной, то выводить header страницы,
 +
дополнительное условие мы будем организовывать с помощью конструкции <xsl:choose>, см. "Полезные ссылки".
 +
 +
Сначала добавим новую переменную в файл /templates/demodizzy/xslt/default.xsl, которой будем присваивать значение
 +
header'а страницы:
 +
<source lang="xml">
 +
        <xsl:variable name="document-header" select="/result/@header" />
 +
</source>
 +
после этого добавим в первый <xsl:template> в шаблоне вывода результатов макроса конструкцию <xsl:choose>,
 +
код примет следующий вид:
 
<source lang="xml">
 
<source lang="xml">
</source>
+
<xsl:template match="udata[@method = 'navibar']">
 +
<xsl:choose>
 +
 
 +
<!-- если url страницы не равен '/emarket/cart/' и '/emarket/personal/', то есть страница не является корзиной или личным кабинетом -->
 +
 
 +
<xsl:when test="$request-uri != '/emarket/cart/' and $request-uri != '/emarket/personal/'">
 +
 
 +
<!-- то выводим результат работы макроса %core navibar()% -->
 +
 
 +
<a href="/">Главная</a>
 +
<xsl:text> » </xsl:text>
 +
<xsl:apply-templates select="items/item" mode="navibar"/>
 +
</xsl:when>
 +
 
 +
<!-- иначе, то есть если мы находимся в корзине или личном кабинете, выводить ссылку на главную страницу и header текущей страницы -->
  
== Вывод "псевдо" навигации для системных страниц  ==  
+
<xsl:otherwise>
 +
<a href="/">Главная</a>
 +
<xsl:text> » </xsl:text>
 +
<xsl:value-of select="$document-header"/>
 +
</xsl:otherwise>
 +
</xsl:choose>
 +
</xsl:template>
 +
</source>
 +
=== Результат ===
 +
В результате последних изменений на страницах корзины и личного кабинета будет отображаться ссылка на главную и header страницы, пример:
 +
страница "Корзина товаров":
  
<source lang="xml">
+
[[Файл:Navibar6.png]]
</source>
 
  
 +
Если нужно будет добавить в этом условие другие системные страницы, например users/registrate/, или просто другие страницы, то нужно
 +
будет дописать в условие:
 
<source lang="xml">
 
<source lang="xml">
</source>
+
<xsl:when test="$request-uri != '/emarket/cart/' and $request-uri != '/emarket/personal/'">
 
+
</source>
 +
дополнительный and $request-uri != ' ', а в кавычках указать url страницы.
 
== Полезные ссылки ==
 
== Полезные ссылки ==
 +
*Документация по макросу %core navibar()%[http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/virtualnyj_modul_core/core_navibar/]
 +
*Документация по конструкции <xsl:if> [http://www.w3schools.com/xsl/xsl_if.asp]
 +
*Документация по конструкции <xsl:choose> [http://www.w3schools.com/xsl/el_choose.asp]

Текущая версия на 12:39, 10 сентября 2013

Актуально для версии 2.9.1

Вывод постраничной навигации

Для вывода постраничной навигации в системе предусмотрен макрос %core navibar()%, см. "Полезные ссылки".

Решение

Добавим в файл /templates/demodizzy/xslt/modules/content/common.xsl перед иклюдами (include) следующий код:

<!-- вывод результатов работы макроса %core navibar()% -->

        <xsl:template match="udata[@method = 'navibar']">
			<xsl:apply-templates select="items/item" mode="navibar"/>
	</xsl:template>

<!-- вывод пунктов навигации -->

	<xsl:template match="item" mode="navibar">
			<a href="{@link}"><xsl:value-of select="."/></a>
			<xsl:text> » </xsl:text>
	</xsl:template>

<!-- вывод последнего пункта -->

	<xsl:template match="item[position() = last()]" mode="navibar">
			<xsl:value-of select="."/>
	</xsl:template>

Это шаблон для вывода результатов работы макроса, теперь нужно добавить вызов макрос, для этого добавим в файл /templates/demodizzy/xslt/layouts/default.xsl после вызова меню

        <xsl:apply-templates select="document('udata://content/menu/(null)/1/')" mode="top_menu" />

следующий код:

        <xsl:apply-templates select="document('udata://core/navibar')/udata"/>

Результат

Navibar1.png

Как мы видим главной страницы в навигации не, так как она не стоит на одном уровне иерархии со странице "Каталог товаров", а мы бы хотели, чтобы в навигации она присутствовала, это задача решается версткой, добавьте в первый <xsl:template> в шаблоне вывода результатов макроса ссылку на главную страницу с текстом, то есть его окончательный код будет примерно следующим:

        <xsl:template match="udata[@method = 'navibar']">
			<a href="/">Главная</a> »
			<xsl:apply-templates select="items/item" mode="navibar"/>
	</xsl:template>

а выглядеть это будет вот так:

Navibar3.png

Вывод навигации на всех страницах, кроме главной

Допустим, мы не хотим, чтобы на главной странице выводился результат работы макроса, так как это лишено смысла и портит внешний вид: Navibar2.png

Для этого воспользуемся конструкцией <xsl:if>, см. "Полезные ссылки".

Решение

Сначала создадим переменную, которая будет отражаться является ли данная страница главной, для этого поместите в файл /templates/demodizzy/xslt/default.xsl, в нем заданы константы в demodizzy, следующих код:

        <xsl:variable name="isMain" select=".//page/@is-default" />

Теперь в файле /templates/demodizzy/xslt/layouts/default.xsl обрамим вызов макроса %core navibar()% условием, код примет примерно следующий вид:

<!-- если страница не является главной, то вывести результат работы макроса %core navibar()% -->

        <xsl:if test="not($isMain)">
                       <xsl:apply-templates select="document('udata://core/navibar')/udata"/>
        </xsl:if>

Результат

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

Вывод навигации для системных страниц

Как мы можем заметить на системных страницах, таких как корзина товаров, личный кабинет, регистрация и др. макрос не выводит текущее название страницы:

Navibar5.png

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

Решение

В данной ситуации нам понадобиться еще одно условие, если страница является системной, то выводить header страницы, дополнительное условие мы будем организовывать с помощью конструкции <xsl:choose>, см. "Полезные ссылки".

Сначала добавим новую переменную в файл /templates/demodizzy/xslt/default.xsl, которой будем присваивать значение header'а страницы:

         <xsl:variable name="document-header" select="/result/@header" />

после этого добавим в первый <xsl:template> в шаблоне вывода результатов макроса конструкцию <xsl:choose>, код примет следующий вид:

<xsl:template match="udata[@method = 'navibar']">
		<xsl:choose>

<!-- если url страницы не равен '/emarket/cart/' и '/emarket/personal/', то есть страница не является корзиной или личным кабинетом -->

			<xsl:when test="$request-uri != '/emarket/cart/' and $request-uri != '/emarket/personal/'">

<!-- то выводим результат работы макроса %core navibar()% -->

				<a href="/">Главная</a>
				<xsl:text> » </xsl:text>
				<xsl:apply-templates select="items/item" mode="navibar"/>
			</xsl:when>

<!-- иначе, то есть если мы находимся в корзине или личном кабинете, выводить ссылку на главную страницу и header текущей страницы -->

			<xsl:otherwise>
				<a href="/">Главная</a>
				<xsl:text> » </xsl:text>
				<xsl:value-of select="$document-header"/>
			</xsl:otherwise>
		</xsl:choose>
</xsl:template>

Результат

В результате последних изменений на страницах корзины и личного кабинета будет отображаться ссылка на главную и header страницы, пример: страница "Корзина товаров":

Navibar6.png

Если нужно будет добавить в этом условие другие системные страницы, например users/registrate/, или просто другие страницы, то нужно будет дописать в условие:

<xsl:when test="$request-uri != '/emarket/cart/' and $request-uri != '/emarket/personal/'">

дополнительный and $request-uri != ' ', а в кавычках указать url страницы.

Полезные ссылки

  • Документация по макросу %core navibar()%[1]
  • Документация по конструкции <xsl:if> [2]
  • Документация по конструкции <xsl:choose> [3]