Вывод перечня заказов на печать для менеджера

Материал из Umicms
Перейти к:навигация, поиск

Задача:
Необходимо вывести в удобной, читабельной форме, все заказы так, что бы их потом можно было распечатать.

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

Допустим, в модуле "Интернет магазин" во вкладке "Заказы" уже есть несколько объектов заказа.Поступим следующим образом - мы выведем содержание этих заказов на странице и оформим так, как нам хотелось бы это видеть на бумаге.

1. Для начала, нам нужно сделать выборку всех заказов. Это делается с помощью стандартного функционала, а именно протокола usel. Его описание Вы можете найти здесь http://help-dev.umi-cms.ru/chapter.XSLTTemplates.usel.html
Если открыть модуль "Шаблоны данных" то Вы увидите, что тип данных "Заказ" имеет id=755. Напишем простой usel и сохраним в папке usels под названием test.xsl:

 <?xml version="1.0" encoding="utf-8"?><br/>
 <selection><br/>
 <target expected-result="objects"><br/>
 <type id="755" /> <br/>
 </target><br/>
 </selection><br/>

Внешне эта выборка может выглядеть примерно так:

 <udata generation-time="0.020353"><br/>
 <item id="27658" name="dummy" type-id="755" ownerId="14" xlink:href="uobject://27658"/><br/>
 <item id="27659" name="Заказ #1" type-id="755" ownerId="14" xlink:href="uobject://27659"/><br/>
 <item id="27663" name="Заказ #2" type-id="755" ownerId="14" xlink:href="uobject://27663"/><br/>
 <item id="27665" name="Заказ #3" type-id="755" ownerId="14" xlink:href="uobject://27665"/><br/>
 <total>4</total><br/>
 </udata><br/>
 <!-- This page generated in 0.187956 secs -->

Теперь мы знаем id всех объектов "Заказ".

2. Добавим в настройках модуля "Структура" новый шаблон. Пусть это будет orders.xsl. Сохраним изменения.
3. Создадим новую страницу и назначим ей шаблон orders.xsl
4. Теперь необходимо добавить сам шаблон. Делать это нужно в папке xsltTpls

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

	<xsl:output encoding="utf-8" method="html" indent="yes"/>
	<xsl:include href="common.xsl" />

	<xsl:template match="/">
		<html class="u-eip">
			<head>
				<link rel="search" type="application/opensearchdescription+xml" href="/xsl/onlineSearch

/description.xml?1287575575&amp;" title="Search on UMI.CMS" />
				<xsl:value-of select="document('udata://system/includeQuickEditJs')/udata"
disable-output-escaping="yes" />

				<title>
					<xsl:value-of select="result/@title" />
				</title>
			</head>
			
			<body>
				<!-- <xsl:value-of select="document('usel://test/')/udata" disable-output-escaping="yes" />-->
				<br/>
				

				<xsl:apply-templates select="document('usel://test/')//item" 
disable-output-escaping="yes" mode="susel"/>
	
			</body>
		</html>
	</xsl:template>

	<xsl:template match="item" mode="susel">
		<!-- <xsl:value-of select="@id"/> <br/> -->
		<xsl:variable name="ord_id" select="@id" />
		<!-- <xsl:value-of select="$ord_id"/> <br/> -->
		<xsl:apply-templates select="document(concat('uobject://',  $ord_id))/udata" />
	</xsl:template>	
	
</xsl:stylesheet>

Нас интересует только запись <xsl:apply-templates select="document('usel://test/')//item" disable-output-escaping="yes" mode="susel"/> и применённый к ней шаблон. Здесь мы делаем выборку по написанному ранее usel-у и поочерёдно применяем ко всем заказам шаблон вывода. Таким образом, можно получить полный список заказов на одной странице.


Обратите внимание!!!
1. Ниже приведённый шаблон просто выведет все данные об объекте заказа. Вы можете написать дополнительный шаблон вывода с оформлением, к примеру, в виде таблицы или списка. Здесь это задача не рассматривается, так как дизайн вывода всегда остаётся на совести зработчика

<xsl:apply-templates select="document(concat('uobject://',  $ord_id))/udata" />

2. Некоторые из полей могут являются сами по себе объектами. К примеру "Адрес доставки". В xml-файле этот фрагмент будет выглядеть так:

 <title>Адрес доставки</title>
 <value>
 <item id="27662" name="Address for customer #14" type-id="803" ownerId="14" xlink:href="uobject://27662"/>
 </value>

Вывести содержание этого объекта можно аналогично тому, как мы выводили содержание заказа uobject://27662. Результат будет примерно таким:

 <udata generation-time="0.000605">
 <object id="27662" name="Address for customer #14" type-id="803" ownerId="14">
 <properties>
 <group id="3338" name="common">
 <title>Основное</title>
 <property id="9160" name="country" type="relation">
 <title>Страна</title>
 <value>
 <item id="26341" GUID="e9aa8c23a339224b25945aa9e99f09f578bdd483" name="Россия" type-id="693" ownerId="14"  xlink:href="uobject://26341"/> 
 </value>
 </property>
 <property id="9161" name="index" type="int">
 <title>Почтовый индекс</title>
 <value>321321</value>
 </property>
 <property id="9162" name="region" type="string">
 <title>Регион</title>
 <value>test</value>
 </property>
 <property id="9163" name="city" type="string">
 <title>Город</title>
 <value>test</value>
 </property>
 <property id="9164" name="street" type="string">
 <title>Улица</title>
 <value>test</value>
 </property>
 <property id="9165" name="house" type="string"> 
 <title>Дом</title>
 <value>test</value>
 </property>
 <property id="9166" name="flat" type="string">
 <title>Квартира</title>
 <value>test</value>
 </property>
 </group>
 </properties>
 </object>
 </udata>

3. Просмотреть результат можно на странице, которую Вы создали ранее, в пункте №3. Функционал шаблона можно расширить. Добавить пейджинг и т.д., но это дело вкуса. О чём действительно стоит позаботиться в первую очередь - это выставить права на страницу так, чтобы её мог просматривать только супервайзер. Если, конечно, не стоит задачи "опубликовать все получаемые Вами заказы" =)
4. Среди прочих объектов заказа, Вы,скорей всего, увидите такой:

<item id="27658" name="dummy" type-id="755" ownerId="14" xlink:href="uobject://27658"/>

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