Корректировка handler1.php
Qualis, вы меня прямо-таки провоцируете сделать это самому, чтобы убедиться 

Заказов не беру. Консультирую редко.
Ну что же, Qualis, все-таки неправда ваша. Работает все отлично!
обработчик (на основе типового обработчика для оплаты наличными с демо сайта)
и пример шаблона, использующего получившийся xml:
Версия 5.9.2, хотя вряд-ли это имеет значение.
обработчик (на основе типового обработчика для оплаты наличными с демо сайта)
<?php
/* Оплата наличными */
class system_of_pay_handler
{
/**
* Метод, запускающий выполнение обработчика
*
*/
function Execute()
{
/* Обработчик формы оплаты "Оплата при получении" */
$shop_id = to_int($GLOBALS['shop_id']);
/* ID платежной системы берем из сессии */
$system_of_pay_id = to_int($_SESSION['system_of_pay_id']);
if (class_exists('SiteUsers')) {
/* Получаем id текущего пользователя сайта */
$SiteUsers = &singleton('SiteUsers');
$site_users_id = $SiteUsers->GetCurrentSiteUser();
} else {
$site_users_id = false;
}
// статус платежа, по умолчанию 0
$order_row['status_of_pay'] = 0;
// дата платежа, по умолчанию пустая строка
$order_row['date_of_pay'] = '';
$order_row['description'] = to_str($_SESSION['description']);
// описание и системная информация, по умолчанию пустая строка
if (to_str($_SESSION['shop_coupon_text']) != '') {
$order_row['description'] .= "Купон на скидку: " . to_str($_SESSION['shop_coupon_text']) .
"\n";
}
$shop = &singleton('shop');
if (!isset($_SESSION['last_order_id'])) {
$_SESSION['last_order_id'] = 0;
}
// Если заказ еще не был оформлен
if ($_SESSION['last_order_id'] == 0) {
/* Оформляем заказ */
$order_id = $shop->ProcessOrder($shop_id, $site_users_id, $system_of_pay_id, $order_row);
} else {
$order_id = $_SESSION['last_order_id'];
}
if ($order_id > 0) {
if (!class_exists('SiteUsers')) {
/* Класс пользователей сайта не существует, дописываем информацию о заказчике
в поле shop_order_description из текущей сессии */
if ($order_row) {
/* Описание заказчика */
$order_row['description'] .= "Информация о заказчике:\n" . "Имя: " . to_str($_SESSION['site_users_name']) .
"\n" . "Фамилия: " . to_str($_SESSION['site_users_surname']) . "\n" .
"Отчество: " . to_str($_SESSION['site_users_patronymic']) . "\n" . "E-Mail: " .
to_str($_SESSION['site_users_email']) . "\n" . "Телефон: " . to_str($_SESSION['site_users_phone']) .
"\n" . "Факс: " . to_str($_SESSION['site_users_fax']) . "\n" . "Адрес: " .
to_str($_SESSION['full_address']) . "\n";
/* Дополнительная информация о заказе */
$order_row['system_information'] = to_str($_SESSION['system_information']);
/* Обязательно добавляем идентификатор! */
$order_row['id'] = $order_id;
// Обновляем данные о заказе, добавляя в описание данные о заказчике
$shop->InsertOrder($order_row);
}
}
$order_row = $shop->GetOrder($order_id);
/* Формируем XML */
$xmlData = '<?xml version="1.0" encoding="' . SITE_CODING . '"?>' . "\n";
$xmlData .= '<document_list>' . "\n";
/* Ссылка на версию для печати */
$shop_row = $shop->GetShop($shop_id);
if ($shop_row) {
/* Получаем путь к магазину */
$Structure = &singleton('Structure');
$shop_path = "/" . $Structure->GetStructurePath($shop_row['structure_id'], 0);
$shop_path .= "cart/print/{$order_row['shop_order_guid']}/";
$xmlData .= "<print_link>" . $shop_path . "</print_link>";
}
$xmlData .= $shop->GetXmlForOrder($order_id, false, true);
$xmlData .= $shop->GetXmlForItemsOrder($order_id);
$parametres['parent_group_id'] = 0;
$xmlData .= $shop->GetGroupsXmlTree($shop_id, $parametres);
$xmlData .= '</document_list>' . "\n";
//раскомментируйте следующую строку для отладки
//echo nl2br(htmlspecialchars($xmlData));
$xsl = new xsl();
echo $xsl->build($xmlData, 'ОплатаПриПолучении');
if ($_SESSION['last_order_id'] == 0) {
$structure = &singleton('Structure');
$structure_row = $structure->GetStructureItem(to_int($shop_row['structure_id']));
$lib = new lib();
$LA = $lib->LoadLibPropertiesValue(to_int($structure_row['lib_id']), to_int($structure_row['structure_id']));
$date_str = date("d.m.Y H:i:s");
if (trim(to_str($order_row['shop_order_account_number'])) != '') {
$shop_order_account_number = trim(to_str($order_row['shop_order_account_number']));
} else {
$shop_order_account_number = $order_id;
}
/* Отправляем письмо заказчику */
$shop->SendMailAboutOrder($shop_id, $order_id, $site_users_id, to_str($LA['xsl_letter_to_admin']),
to_str($LA['xsl_letter_to_user']), $order_row['shop_order_users_email'], array('admin-content-type' =>
'html', 'user-content-type' => 'html', 'admin-subject' => sprintf($GLOBALS['MSG_shops']['shop_order_admin_subject'],
$shop_order_account_number, $shop_row['shop_shops_name'], $date_str),
'user-subject' => sprintf($GLOBALS['MSG_shops']['shop_order_user_subject'], $shop_order_account_number,
$shop_row['shop_shops_name'], $date_str), 'attach_eitem_file' => 0,
'email_from_admin' => $order_row['shop_order_users_email']));
}
// Сохраняем ID последнего оформленного заказа ТОЛЬКО ПОСЛЕ ОТПРАВКИ ПИСЬМА
$_SESSION['last_order_id'] = $order_id;
} else {
switch ($order_id) {
case - 1:
{
echo "Ошибка вставки заказа в базу данных. Обратитесь к администратору.";
break;
}
case - 2:
{
echo "Ошибка - не найден магазин. Обратитесь к администратору.";
break;
}
}
}
}
/**
* Метод для отображения формы заказа для печати.
*
* @param int $order_id идентификатор заказа
*/
function PrintOrder($order_id)
{
?>
<h1>Оплата наличными</h1>
<p>Платежная система "Оплата наличными" не имеет формы для печати.</p>
<?php
}
/**
* Изменение статуса заказа. Позволяет пользователю внедрять собственные
* обработчики при изменении статуса.
*
* @param array $param массив атрибутов
* - $param['shop_order_id'] идентификатор заказа
* - $param['action'] выполняемое действие над заказом, может принимать значения:
* edit (редактирование заказа),
* cancel (отмена заказ),
* status (изменение статуса заказа),
* delete (удаление заказа),
* edit_item (редактирование товара в заказе),
* delete_item (удаление товара)
*/
function ChangeStatus($param = array())
{
// Если произошло изменение статуса или
if (isset($param['action']) && in_array($param['action'], array('status', 'edit'))) {
$shop_order_id = to_int($param['shop_order_id']);
$shop = &singleton('shop');
$order_row = $shop->GetOrder($shop_order_id);
// Получаем информацию о магазине
$shop_id = to_int($order_row['shop_shops_id']);
$shop_row = $shop->GetShop($shop_id);
$structure = &singleton('Structure');
$structure_row = $structure->GetStructureItem(to_int($shop_row['structure_id']));
$lib = new lib();
$LA = $lib->LoadLibPropertiesValue(to_int($structure_row['lib_id']), to_int($structure_row['structure_id']));
if ($order_row) {
$DateClass = new DateClass();
$date_str = $DateClass->datetime_format($order_row['shop_order_date_time']);
} else {
$date_str = '';
}
// Если предыдущий статус заказа был 1, то меняем тему на подтверждение
if (to_int($order_row['shop_order_status_of_pay']) == 1) {
$admin_subject = $GLOBALS['MSG_shops']['shop_order_confirm_admin_subject'];
$user_subject = $GLOBALS['MSG_shops']['shop_order_confirm_user_subject'];
} else {
$admin_subject = $GLOBALS['MSG_shops']['shop_order_admin_subject'];
$user_subject = $GLOBALS['MSG_shops']['shop_order_user_subject'];
}
// Письмо отправляем только при установке статуса активности для заказа
if (to_int($order_row['shop_order_status_of_pay']) == 1) {
if (trim(to_str($order_row['shop_order_account_number'])) != '') {
$shop_order_account_number = trim(to_str($order_row['shop_order_account_number']));
} else {
$shop_order_account_number = $shop_order_id;
}
/* Отправляем письмо заказчику */
$shop->SendMailAboutOrder($shop_id, $shop_order_id, $order_row['site_users_id'],
to_str($LA['xsl_letter_to_admin']), to_str($LA['xsl_letter_to_user']), $order_row['shop_order_users_email'],
array('admin-content-type' => 'html', 'user-content-type' => 'html',
'admin-subject' => sprintf($admin_subject, $shop_order_account_number, $shop_row['shop_shops_name'],
$date_str), 'user-subject' => sprintf($user_subject, $shop_order_account_number,
$shop_row['shop_shops_name'], $date_str), 'email_from_admin' => $order_row['shop_order_users_email']));
}
}
}
}
?>
/* Оплата наличными */
class system_of_pay_handler
{
/**
* Метод, запускающий выполнение обработчика
*
*/
function Execute()
{
/* Обработчик формы оплаты "Оплата при получении" */
$shop_id = to_int($GLOBALS['shop_id']);
/* ID платежной системы берем из сессии */
$system_of_pay_id = to_int($_SESSION['system_of_pay_id']);
if (class_exists('SiteUsers')) {
/* Получаем id текущего пользователя сайта */
$SiteUsers = &singleton('SiteUsers');
$site_users_id = $SiteUsers->GetCurrentSiteUser();
} else {
$site_users_id = false;
}
// статус платежа, по умолчанию 0
$order_row['status_of_pay'] = 0;
// дата платежа, по умолчанию пустая строка
$order_row['date_of_pay'] = '';
$order_row['description'] = to_str($_SESSION['description']);
// описание и системная информация, по умолчанию пустая строка
if (to_str($_SESSION['shop_coupon_text']) != '') {
$order_row['description'] .= "Купон на скидку: " . to_str($_SESSION['shop_coupon_text']) .
"\n";
}
$shop = &singleton('shop');
if (!isset($_SESSION['last_order_id'])) {
$_SESSION['last_order_id'] = 0;
}
// Если заказ еще не был оформлен
if ($_SESSION['last_order_id'] == 0) {
/* Оформляем заказ */
$order_id = $shop->ProcessOrder($shop_id, $site_users_id, $system_of_pay_id, $order_row);
} else {
$order_id = $_SESSION['last_order_id'];
}
if ($order_id > 0) {
if (!class_exists('SiteUsers')) {
/* Класс пользователей сайта не существует, дописываем информацию о заказчике
в поле shop_order_description из текущей сессии */
if ($order_row) {
/* Описание заказчика */
$order_row['description'] .= "Информация о заказчике:\n" . "Имя: " . to_str($_SESSION['site_users_name']) .
"\n" . "Фамилия: " . to_str($_SESSION['site_users_surname']) . "\n" .
"Отчество: " . to_str($_SESSION['site_users_patronymic']) . "\n" . "E-Mail: " .
to_str($_SESSION['site_users_email']) . "\n" . "Телефон: " . to_str($_SESSION['site_users_phone']) .
"\n" . "Факс: " . to_str($_SESSION['site_users_fax']) . "\n" . "Адрес: " .
to_str($_SESSION['full_address']) . "\n";
/* Дополнительная информация о заказе */
$order_row['system_information'] = to_str($_SESSION['system_information']);
/* Обязательно добавляем идентификатор! */
$order_row['id'] = $order_id;
// Обновляем данные о заказе, добавляя в описание данные о заказчике
$shop->InsertOrder($order_row);
}
}
$order_row = $shop->GetOrder($order_id);
/* Формируем XML */
$xmlData = '<?xml version="1.0" encoding="' . SITE_CODING . '"?>' . "\n";
$xmlData .= '<document_list>' . "\n";
/* Ссылка на версию для печати */
$shop_row = $shop->GetShop($shop_id);
if ($shop_row) {
/* Получаем путь к магазину */
$Structure = &singleton('Structure');
$shop_path = "/" . $Structure->GetStructurePath($shop_row['structure_id'], 0);
$shop_path .= "cart/print/{$order_row['shop_order_guid']}/";
$xmlData .= "<print_link>" . $shop_path . "</print_link>";
}
$xmlData .= $shop->GetXmlForOrder($order_id, false, true);
$xmlData .= $shop->GetXmlForItemsOrder($order_id);
$parametres['parent_group_id'] = 0;
$xmlData .= $shop->GetGroupsXmlTree($shop_id, $parametres);
$xmlData .= '</document_list>' . "\n";
//раскомментируйте следующую строку для отладки
//echo nl2br(htmlspecialchars($xmlData));
$xsl = new xsl();
echo $xsl->build($xmlData, 'ОплатаПриПолучении');
if ($_SESSION['last_order_id'] == 0) {
$structure = &singleton('Structure');
$structure_row = $structure->GetStructureItem(to_int($shop_row['structure_id']));
$lib = new lib();
$LA = $lib->LoadLibPropertiesValue(to_int($structure_row['lib_id']), to_int($structure_row['structure_id']));
$date_str = date("d.m.Y H:i:s");
if (trim(to_str($order_row['shop_order_account_number'])) != '') {
$shop_order_account_number = trim(to_str($order_row['shop_order_account_number']));
} else {
$shop_order_account_number = $order_id;
}
/* Отправляем письмо заказчику */
$shop->SendMailAboutOrder($shop_id, $order_id, $site_users_id, to_str($LA['xsl_letter_to_admin']),
to_str($LA['xsl_letter_to_user']), $order_row['shop_order_users_email'], array('admin-content-type' =>
'html', 'user-content-type' => 'html', 'admin-subject' => sprintf($GLOBALS['MSG_shops']['shop_order_admin_subject'],
$shop_order_account_number, $shop_row['shop_shops_name'], $date_str),
'user-subject' => sprintf($GLOBALS['MSG_shops']['shop_order_user_subject'], $shop_order_account_number,
$shop_row['shop_shops_name'], $date_str), 'attach_eitem_file' => 0,
'email_from_admin' => $order_row['shop_order_users_email']));
}
// Сохраняем ID последнего оформленного заказа ТОЛЬКО ПОСЛЕ ОТПРАВКИ ПИСЬМА
$_SESSION['last_order_id'] = $order_id;
} else {
switch ($order_id) {
case - 1:
{
echo "Ошибка вставки заказа в базу данных. Обратитесь к администратору.";
break;
}
case - 2:
{
echo "Ошибка - не найден магазин. Обратитесь к администратору.";
break;
}
}
}
}
/**
* Метод для отображения формы заказа для печати.
*
* @param int $order_id идентификатор заказа
*/
function PrintOrder($order_id)
{
?>
<h1>Оплата наличными</h1>
<p>Платежная система "Оплата наличными" не имеет формы для печати.</p>
<?php
}
/**
* Изменение статуса заказа. Позволяет пользователю внедрять собственные
* обработчики при изменении статуса.
*
* @param array $param массив атрибутов
* - $param['shop_order_id'] идентификатор заказа
* - $param['action'] выполняемое действие над заказом, может принимать значения:
* edit (редактирование заказа),
* cancel (отмена заказ),
* status (изменение статуса заказа),
* delete (удаление заказа),
* edit_item (редактирование товара в заказе),
* delete_item (удаление товара)
*/
function ChangeStatus($param = array())
{
// Если произошло изменение статуса или
if (isset($param['action']) && in_array($param['action'], array('status', 'edit'))) {
$shop_order_id = to_int($param['shop_order_id']);
$shop = &singleton('shop');
$order_row = $shop->GetOrder($shop_order_id);
// Получаем информацию о магазине
$shop_id = to_int($order_row['shop_shops_id']);
$shop_row = $shop->GetShop($shop_id);
$structure = &singleton('Structure');
$structure_row = $structure->GetStructureItem(to_int($shop_row['structure_id']));
$lib = new lib();
$LA = $lib->LoadLibPropertiesValue(to_int($structure_row['lib_id']), to_int($structure_row['structure_id']));
if ($order_row) {
$DateClass = new DateClass();
$date_str = $DateClass->datetime_format($order_row['shop_order_date_time']);
} else {
$date_str = '';
}
// Если предыдущий статус заказа был 1, то меняем тему на подтверждение
if (to_int($order_row['shop_order_status_of_pay']) == 1) {
$admin_subject = $GLOBALS['MSG_shops']['shop_order_confirm_admin_subject'];
$user_subject = $GLOBALS['MSG_shops']['shop_order_confirm_user_subject'];
} else {
$admin_subject = $GLOBALS['MSG_shops']['shop_order_admin_subject'];
$user_subject = $GLOBALS['MSG_shops']['shop_order_user_subject'];
}
// Письмо отправляем только при установке статуса активности для заказа
if (to_int($order_row['shop_order_status_of_pay']) == 1) {
if (trim(to_str($order_row['shop_order_account_number'])) != '') {
$shop_order_account_number = trim(to_str($order_row['shop_order_account_number']));
} else {
$shop_order_account_number = $shop_order_id;
}
/* Отправляем письмо заказчику */
$shop->SendMailAboutOrder($shop_id, $shop_order_id, $order_row['site_users_id'],
to_str($LA['xsl_letter_to_admin']), to_str($LA['xsl_letter_to_user']), $order_row['shop_order_users_email'],
array('admin-content-type' => 'html', 'user-content-type' => 'html',
'admin-subject' => sprintf($admin_subject, $shop_order_account_number, $shop_row['shop_shops_name'],
$date_str), 'user-subject' => sprintf($user_subject, $shop_order_account_number,
$shop_row['shop_shops_name'], $date_str), 'email_from_admin' => $order_row['shop_order_users_email']));
}
}
}
}
?>
и пример шаблона, использующего получившийся xml:
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<xsl:decimal-format name="my" decimal-separator="," grouping-separator=" "/>
<!-- ПисьмоАдминистратору -->
<xsl:template match="/document_list">
<html>
<head>
<style type="text/css">html, body, td
{
font-family: Arial, Verdana, Tahoma, sans-serif;
font-size: 10pt;
background-color: #FFFFFF;
color: #000000;
}
.td_main
{
border-top: black 1px solid;
border-left: black 1px solid;
}
.td_header
{
border-left: black 1px solid;
border-top: black 1px solid;
border-bottom: black 1px solid;
text-align: center;
font-weight: bold;
}
.td_main_2
{
border-left: black 1px solid;
border-bottom: black 1px solid;
}
.tr_footer td
{
font-size: 11pt;
font-weight: bold;
white-space: nowrap;
}
table, td
{
empty-cells: show;
}</style>
</head>
<body bgcolor="#FFFFFF" color="#000000">
<p>В магазине "<xsl:value-of select="order_list/shop/shop_name"/>" был оформлен <b>заказ № <xsl:value-of select="order_list/order_account_number"/></b>.</p>
<xsl:apply-templates select="order_list"/>
<br/>
<xsl:choose>
<xsl:when test="count(items_order) > 0">
<table cellpadding="3" cellspacing="0" width="100%">
<tr>
<td class="td_header">Номер</td>
<td class="td_header">Артикул</td>
<td class="td_header">Наименование</td>
<td class="td_header">Группа</td>
<td class="td_header">Кол-во</td>
<td class="td_header">Цена</td>
<td class="td_header" style="border-right: black 1px solid;">Сумма</td>
</tr>
<xsl:apply-templates select="items_order"/>
<tr class="tr_footer">
<td colspan="5" align="right">
<b>Итого:</b>
</td>
<td style="white-space: nowrap">
<xsl:value-of select="format-number(order_list/sum, '### ###,00', 'my')"/> <xsl:value-of select="order_list/currency/currency_name" disable-output-escaping="yes"/></td>
</tr>
</table>
</xsl:when>
<xsl:otherwise>
<p>
<b>Заказанных товаров нет</b>
</p>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="count(shop_eitems/shop_eitem) > 0">
<br/>
<br/>
<b>Данные об электронных товарах:</b>
<br/>
<div style="background-color: #eee; padding: 10px;">
<xsl:apply-templates select="shop_eitems/shop_eitem"/>
</div>
</xsl:if>
<p>
<hr/>Система управления сайтом HostCMS
<br/>
<a href="http://www.hostcms.ru">http://www.hostcms.ru</a>
</p>
</body>
</html>
</xsl:template>
<!-- Шаблон вывода данных о заказе -->
<xsl:template match="order_list">
<p>
<xsl:if test="site_users_company != ''">Компания: <xsl:value-of select="site_users_company"/><br/></xsl:if>ФИО: <xsl:value-of select="site_user_fio"/><br/>
E-mail: <xsl:value-of select="site_users_email"/><br/>
<xsl:if test="site_users_phone != ''">Телефон: <xsl:value-of select="site_users_phone"/><br/></xsl:if>
<xsl:if test="site_users_fax != ''">Факс: <xsl:value-of select="site_users_fax"/><br/></xsl:if>Адрес:
<xsl:if test="index != ''">
<xsl:value-of select="index"/>
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:if test="country_name != ''">
<xsl:value-of select="country_name"/>
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:if test="location_name != ''">
<xsl:value-of select="location_name"/>
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:if test="city_name != ''">
<xsl:value-of select="city_name"/>
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:if test="city_area_name != ''">
<xsl:value-of select="city_area_name"/>
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:if test="address != ''">
<xsl:value-of select="address"/>
</xsl:if>
<br/>
<xsl:if test="delivery_type/type_of_delivery_description != ''">Тип доставки: <xsl:value-of select="delivery_type/type_of_delivery_description"/><br/></xsl:if>
<xsl:if test="system_of_pay_description != ''">Способ оплаты: <xsl:value-of select="system_of_pay_name"/><br/></xsl:if>Статус оплаты: <b><xsl:choose>
<xsl:when test="status_of_pay = '1'">оплачено</xsl:when>
<xsl:otherwise>не оплачено</xsl:otherwise></xsl:choose></b>
<br/>
<xsl:if test="shop_order_description != ''">Описание заказа: <xsl:value-of select="shop_order_description" disable-output-escaping="yes"/><br/></xsl:if>
<xsl:if test="shop_order_system_information != ''">Системная информация: <xsl:value-of select="shop_order_system_information" disable-output-escaping="yes"/><br/></xsl:if>
</p>
</xsl:template>
<!-- Данные о товарах -->
<xsl:template match="items_order">
<tr>
<td class="td_main_2">
<xsl:value-of select="position()"/>
</td>
<td class="td_main_2">
<xsl:choose>
<xsl:when test="order_items_marking != ''">
<xsl:value-of select="order_items_marking"/>
</xsl:when>
<xsl:otherwise>—</xsl:otherwise>
</xsl:choose>
</td>
<td class="td_main_2">
<xsl:value-of select="order_items_name"/>
</td>
<td class="td_main_2">
<xsl:choose>
<xsl:when test="item/node()">
<xsl:variable name="parent_group_id" select="item/@group"/>
<xsl:value-of select="//group[@id = $parent_group_id]/name"/>
</xsl:when>
<xsl:otherwise>
<xsl:text disable-output-escaping="yes"> </xsl:text>
</xsl:otherwise>
</xsl:choose>
</td>
<td class="td_main_2" style="white-space: nowrap">
<xsl:value-of select="order_items_quantity"/>
<xsl:text> </xsl:text>
<xsl:value-of select="item/mesure"/>
</td>
<td class="td_main_2" style="white-space: nowrap">
<xsl:value-of select="format-number(order_items_price, '### ###,00', 'my')"/> <xsl:value-of select="/document_list/order_list/currency/currency_name" disable-output-escaping="yes"/></td>
<td class="td_main_2" style="border-right: black 1px solid; white-space: nowrap">
<xsl:value-of select="format-number(order_items_quantity * order_items_price, '### ###,00', 'my')"/> <xsl:value-of select="/document_list/order_list/currency/currency_name" disable-output-escaping="yes"/></td>
</tr>
</xsl:template>
<!-- Данные о товарах -->
<xsl:template match="shop_eitem">
<b>
<i>
<xsl:value-of select="shop_eitem_name"/>
</i>
</b>
<br/>
<xsl:if test="shop_eitem_value != '' and /document_list/order_list/shop/shop_shops_attach_eitem = 1">
<i>Текст электронного товара:</i>
<br/>
<xsl:value-of select="shop_eitem_value"/>
<br/>
</xsl:if>
<!-- Отображать ли ссылку на файл электронного товара-->
<xsl:if test="/document_list/order_list/shop/shop_shops_attach_eitem = 0 and shop_eitem_resource != ''">
<a href="http://{/document_list/order_list/shop/site_alias_name}{/document_list/order_list/shop/shop_path}?download_file={shop_eitem_resource}">
<i>Скачать файл</i>
</a>
<br/>
</xsl:if>
<xsl:if test="shop_eitem_filename != ''">
<i>Файл электронного товара:</i>
<br/>
<xsl:value-of select="shop_eitem_filename"/>
<br/>
</xsl:if>
<br/>
</xsl:template>
</xsl:stylesheet>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<xsl:decimal-format name="my" decimal-separator="," grouping-separator=" "/>
<!-- ПисьмоАдминистратору -->
<xsl:template match="/document_list">
<html>
<head>
<style type="text/css">html, body, td
{
font-family: Arial, Verdana, Tahoma, sans-serif;
font-size: 10pt;
background-color: #FFFFFF;
color: #000000;
}
.td_main
{
border-top: black 1px solid;
border-left: black 1px solid;
}
.td_header
{
border-left: black 1px solid;
border-top: black 1px solid;
border-bottom: black 1px solid;
text-align: center;
font-weight: bold;
}
.td_main_2
{
border-left: black 1px solid;
border-bottom: black 1px solid;
}
.tr_footer td
{
font-size: 11pt;
font-weight: bold;
white-space: nowrap;
}
table, td
{
empty-cells: show;
}</style>
</head>
<body bgcolor="#FFFFFF" color="#000000">
<p>В магазине "<xsl:value-of select="order_list/shop/shop_name"/>" был оформлен <b>заказ № <xsl:value-of select="order_list/order_account_number"/></b>.</p>
<xsl:apply-templates select="order_list"/>
<br/>
<xsl:choose>
<xsl:when test="count(items_order) > 0">
<table cellpadding="3" cellspacing="0" width="100%">
<tr>
<td class="td_header">Номер</td>
<td class="td_header">Артикул</td>
<td class="td_header">Наименование</td>
<td class="td_header">Группа</td>
<td class="td_header">Кол-во</td>
<td class="td_header">Цена</td>
<td class="td_header" style="border-right: black 1px solid;">Сумма</td>
</tr>
<xsl:apply-templates select="items_order"/>
<tr class="tr_footer">
<td colspan="5" align="right">
<b>Итого:</b>
</td>
<td style="white-space: nowrap">
<xsl:value-of select="format-number(order_list/sum, '### ###,00', 'my')"/> <xsl:value-of select="order_list/currency/currency_name" disable-output-escaping="yes"/></td>
</tr>
</table>
</xsl:when>
<xsl:otherwise>
<p>
<b>Заказанных товаров нет</b>
</p>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="count(shop_eitems/shop_eitem) > 0">
<br/>
<br/>
<b>Данные об электронных товарах:</b>
<br/>
<div style="background-color: #eee; padding: 10px;">
<xsl:apply-templates select="shop_eitems/shop_eitem"/>
</div>
</xsl:if>
<p>
<hr/>Система управления сайтом HostCMS
<br/>
<a href="http://www.hostcms.ru">http://www.hostcms.ru</a>
</p>
</body>
</html>
</xsl:template>
<!-- Шаблон вывода данных о заказе -->
<xsl:template match="order_list">
<p>
<xsl:if test="site_users_company != ''">Компания: <xsl:value-of select="site_users_company"/><br/></xsl:if>ФИО: <xsl:value-of select="site_user_fio"/><br/>
E-mail: <xsl:value-of select="site_users_email"/><br/>
<xsl:if test="site_users_phone != ''">Телефон: <xsl:value-of select="site_users_phone"/><br/></xsl:if>
<xsl:if test="site_users_fax != ''">Факс: <xsl:value-of select="site_users_fax"/><br/></xsl:if>Адрес:
<xsl:if test="index != ''">
<xsl:value-of select="index"/>
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:if test="country_name != ''">
<xsl:value-of select="country_name"/>
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:if test="location_name != ''">
<xsl:value-of select="location_name"/>
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:if test="city_name != ''">
<xsl:value-of select="city_name"/>
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:if test="city_area_name != ''">
<xsl:value-of select="city_area_name"/>
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:if test="address != ''">
<xsl:value-of select="address"/>
</xsl:if>
<br/>
<xsl:if test="delivery_type/type_of_delivery_description != ''">Тип доставки: <xsl:value-of select="delivery_type/type_of_delivery_description"/><br/></xsl:if>
<xsl:if test="system_of_pay_description != ''">Способ оплаты: <xsl:value-of select="system_of_pay_name"/><br/></xsl:if>Статус оплаты: <b><xsl:choose>
<xsl:when test="status_of_pay = '1'">оплачено</xsl:when>
<xsl:otherwise>не оплачено</xsl:otherwise></xsl:choose></b>
<br/>
<xsl:if test="shop_order_description != ''">Описание заказа: <xsl:value-of select="shop_order_description" disable-output-escaping="yes"/><br/></xsl:if>
<xsl:if test="shop_order_system_information != ''">Системная информация: <xsl:value-of select="shop_order_system_information" disable-output-escaping="yes"/><br/></xsl:if>
</p>
</xsl:template>
<!-- Данные о товарах -->
<xsl:template match="items_order">
<tr>
<td class="td_main_2">
<xsl:value-of select="position()"/>
</td>
<td class="td_main_2">
<xsl:choose>
<xsl:when test="order_items_marking != ''">
<xsl:value-of select="order_items_marking"/>
</xsl:when>
<xsl:otherwise>—</xsl:otherwise>
</xsl:choose>
</td>
<td class="td_main_2">
<xsl:value-of select="order_items_name"/>
</td>
<td class="td_main_2">
<xsl:choose>
<xsl:when test="item/node()">
<xsl:variable name="parent_group_id" select="item/@group"/>
<xsl:value-of select="//group[@id = $parent_group_id]/name"/>
</xsl:when>
<xsl:otherwise>
<xsl:text disable-output-escaping="yes"> </xsl:text>
</xsl:otherwise>
</xsl:choose>
</td>
<td class="td_main_2" style="white-space: nowrap">
<xsl:value-of select="order_items_quantity"/>
<xsl:text> </xsl:text>
<xsl:value-of select="item/mesure"/>
</td>
<td class="td_main_2" style="white-space: nowrap">
<xsl:value-of select="format-number(order_items_price, '### ###,00', 'my')"/> <xsl:value-of select="/document_list/order_list/currency/currency_name" disable-output-escaping="yes"/></td>
<td class="td_main_2" style="border-right: black 1px solid; white-space: nowrap">
<xsl:value-of select="format-number(order_items_quantity * order_items_price, '### ###,00', 'my')"/> <xsl:value-of select="/document_list/order_list/currency/currency_name" disable-output-escaping="yes"/></td>
</tr>
</xsl:template>
<!-- Данные о товарах -->
<xsl:template match="shop_eitem">
<b>
<i>
<xsl:value-of select="shop_eitem_name"/>
</i>
</b>
<br/>
<xsl:if test="shop_eitem_value != '' and /document_list/order_list/shop/shop_shops_attach_eitem = 1">
<i>Текст электронного товара:</i>
<br/>
<xsl:value-of select="shop_eitem_value"/>
<br/>
</xsl:if>
<!-- Отображать ли ссылку на файл электронного товара-->
<xsl:if test="/document_list/order_list/shop/shop_shops_attach_eitem = 0 and shop_eitem_resource != ''">
<a href="http://{/document_list/order_list/shop/site_alias_name}{/document_list/order_list/shop/shop_path}?download_file={shop_eitem_resource}">
<i>Скачать файл</i>
</a>
<br/>
</xsl:if>
<xsl:if test="shop_eitem_filename != ''">
<i>Файл электронного товара:</i>
<br/>
<xsl:value-of select="shop_eitem_filename"/>
<br/>
</xsl:if>
<br/>
</xsl:template>
</xsl:stylesheet>
Версия 5.9.2, хотя вряд-ли это имеет значение.
Заказов не беру. Консультирую редко.
Ну и парочка картинок для пруфинга:
- отладочный вывод XML для писем администратору и клиенту на тестовой площадке. По характерным признакам можно определить, что группы в этом XML таки есть - специально выложил скриншот именно с концом xml-документа
- результат обработки генерируемого xml с помощью выложенного здесь XSL-шаблона в Stylus Studio. Тут видно и что группы в xml есть (см. правую часть скриншота), и что в письме присутствует название группы товара (внизу слева).
P.S. На тестовую площадку шаблон не выкладывал - у меня оттуда почта на чужие домены не ходит, а создать ящик на самом домене мне все как-то недосуг, да и ненадо.
- отладочный вывод XML для писем администратору и клиенту на тестовой площадке. По характерным признакам можно определить, что группы в этом XML таки есть - специально выложил скриншот именно с концом xml-документа

- результат обработки генерируемого xml с помощью выложенного здесь XSL-шаблона в Stylus Studio. Тут видно и что группы в xml есть (см. правую часть скриншота), и что в письме присутствует название группы товара (внизу слева).
P.S. На тестовую площадку шаблон не выкладывал - у меня оттуда почта на чужие домены не ходит, а создать ящик на самом домене мне все как-то недосуг, да и ненадо.
Заказов не беру. Консультирую редко.
Вы знаете, коллега, но у меня не работает.
Вероятно потому что у меня поцесс оформления заказа состоит из одного шага, т.е. Корзина > Уведомление.
Как руки доберутся буду копать, что где пропустил в типовой.
Вероятно потому что у меня поцесс оформления заказа состоит из одного шага, т.е. Корзина > Уведомление.
Как руки доберутся буду копать, что где пропустил в типовой.
Авторизация

