Формирование прайс листа на основе каталога XSLT

Материал из Umicms
Версия от 14:37, 31 октября 2013; PilipenkAV (обсуждение | вклад) (Новая страница: «== Задача == Необходимо сформировать прайс лист на основе имеющегося каталога и выводить е…»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

Задача

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

Решение

Для решения данной задачи сформируем шаблон основанный на макросе content menu. Для этого первым делом необходимо убедиться, что у всех разделов и товаров стоят галочки Отображать в меню и Показывать подменю. После этого необходимо добавить в главном шаблоне вывод прайс листа строкой:

<xsl:if test=" $document-page-id = 202">
	<xsl:apply-templates select="document('udata://content/menu/(null)/5/36')" mode="price_list" />
</xsl:if>

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

Далее создаем в папке \templates\demodizzy\xslt\modules\catalog файл price-list.xsl и помещаем туда следующий код:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet SYSTEM	"ulang://i18n/constants.dtd:file">
<xsl:stylesheet	version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:umi="http://www.umi-cms.ru/TR/umi">

<!-- price-list -->
	<!-- level_0 -->
	<xsl:template match="udata[@module = 'content'][@method = 'menu']" mode="price_list">

		<table class="price_list">
					<!--textarea><xsl:apply-templates select="items" mode="price_list1"/></textarea-->
					<xsl:apply-templates select="items" mode="price_list1"/>
		</table>

	</xsl:template>
		
	<xsl:template match="udata[@module = 'content' and @method = 'menu']//items" mode="price_list1">	
		<xsl:apply-templates select="item" mode="price_list2"/>
	</xsl:template>

	<xsl:template match="udata[@module = 'content' and @method = 'menu']//item" mode="price_list2">
		<textarea><xsl:value-of select="$method" /></textarea>
		<xsl:choose>
			<xsl:when test=" $method = 'object' ">
				<tr class="price_list_catalog_lvl2_name">
					<!--td colspan="2">
						<a href="{@link}" class="include_price_list2">
							<span>
								<xsl:value-of select="@name" />
								<textarea><xsl:copy-of select="@xlink"/></textarea>
							</span>
						</a>
					</td-->
					<td class="include_catalog_price_list2">
						<a href="{@link}" class="include_catalog_price_list2">
							<span>
								<xsl:value-of select="@name" />
							</span>
						</a>
					</td>
					<td class="include_catalog_price_list2">
						<p>
							<xsl:value-of select="$item_price"/>
						</p>
					</td>
				</tr>
			</xsl:when>
			<xsl:otherwise>
				<tr class="price_list_catalog_name">
					<td colspan="2">
						<a href="{@link}" class="price_list2">
							<span>
								<xsl:value-of select="@name" />
							</span>
						</a>
					</td>
				</tr>
				<tr>
					<td>
						<p>Наименование</p>
					</td>
					<td>
						<p>Цена</p>
					</td>
				</tr>
			</xsl:otherwise>
		</xsl:choose>
		<xsl:apply-templates select="items" mode="include_price_list"/>
				
	</xsl:template>

	<!-- level_1 -->
	<xsl:template match="udata[@module = 'content' and @method = 'menu']//items" mode="include_price_list">
		<xsl:apply-templates select="item" mode="include_price_list2"/>
	</xsl:template>

	<xsl:template match="udata[@module = 'content' and @method = 'menu']//item" mode="include_price_list2">
		<tr class="price_list_catalog_lvl2_name">
			<!--td colspan="2">
				<a href="{@link}" class="include_price_list2">
					<span>
						<xsl:value-of select="@name" />
						<textarea><xsl:copy-of select="@xlink"/></textarea>
					</span>
				</a>
			</td-->
			<td class="include_catalog_price_list2">
				<a href="{@link}" class="include_catalog_price_list2">
					<span>
						<xsl:value-of select="@name" />
					</span>
				</a>
			</td>
			<td class="include_catalog_price_list2">
				<p>
					<xsl:value-of select="$item_price"/>
				</p>
			</td>
		</tr>
		<xsl:apply-templates select="items" mode="include_catalog_price_list"/>
	</xsl:template>

	<!-- level_2 -->
	<xsl:template match="udata[@module = 'content' and @method = 'menu']//items" mode="include_catalog_price_list">
		<tr class="include_catalog_price_list">
			<xsl:apply-templates select="item" mode="include_catalog_price_list2"/>
		</tr>
	</xsl:template>

	<xsl:template match="udata[@module = 'content' and @method = 'menu']//item" mode="include_catalog_price_list2">

		<tr>
		<td class="include_catalog_price_list2">
			<a href="{@link}" class="include_catalog_price_list2">
				<span>
					<xsl:value-of select="@name" />
				</span>
			</a>
		</td>
		<td class="include_catalog_price_list2">
			<p>
				<xsl:value-of select="$item_price"/>
			</p>
		</td>
		</tr>
		<xsl:apply-templates select="items" mode="item_price"/>
	</xsl:template>

	<!-- level_3 -->
	<xsl:template match="upage" mode="item_price">
		<xsl:apply-templates select="item" mode="inc_cat_price_list2"/>
	</xsl:template>

	<xsl:template match="udata[@module = 'content' and @method = 'menu']//item" mode="inc_cat_price_list2">
		<tr>
		<td colspan="2">
		<li>
			<a href="{@link}" umi:element-id="{@id}" umi:region="row" umi:field-name="name" umi:empty="&empty-section-name;" umi:delete="delete">
				<span>
					<xsl:value-of select="@name" />
				</span>
			</a>
			<xsl:text> (</xsl:text>
				<xsl:value-of select="document(concat('udata://catalog/getObjectsList//', @id))/udata/total" />
			<xsl:text>)</xsl:text>
		</li>
		</td>
		</tr>
	</xsl:template>
	<!-- custom catalog menu end-->

</xsl:stylesheet>