остановилась на пункте:
На системной странице /emarket/cart/, либо какой-либо другой, подобным вызовом: udata://emarket/fast_purchasing_xslt/
разместила вызов:
<xsl:apply-templates select="document('udata://emarket/fast_purchasing_xslt/')" />
на странице /emarket/cart.xsl
дальше не понятно что надо делать.
Мне необходимо все пункты объединить в один <form method="post" action="{$lang-prefix}/emarket/saveinfo/">
получается?
т.е. создать еще один шаблон, на который будет переход со страницы /emarket/cart/ после нажатия "оформить заказ"
Где будет шаблоны для заполнения данных о покупателе, способов доставки, адреса если нужно и способов оплаты.
сделать на radio бутон с самовывозом onclick событие, который скрывает этот блок (предположим форма с адресом имеет класс delivery_block и id варианта доставки "самовывоз" = 12345)
<input type="radio" name="delivery-id" value="{@id}" id="{@id}">
<xsl:apply-templates select="." mode="delivery-choose-first" />
<!--hide adress form for no adress choose-->
<xsl:choose>
<xsl:when test="@id=12345">
<xsl:attribute name="onclick">
<xsl:text>if(this.checked===true); jQuery('.delivery_block').hide();</xsl:text>
</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="onclick">
<xsl:text>if(this.checked===true) jQuery('.delivery_block').show();</xsl:text>
</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</input>
Не знаю. Подумаем вместе.
В ашем макросе из Вики есть строка
$dataModule->saveEditedObject($addressId, true, true);
В методе saveEditedObject зашита проверка на обязательность полей checkRequiredData в __client_reflection.php
Т.о., избавиться от нее можно заменив системный метод сохрания объекта адреса доставки на свой собственный. Для начала, попробовать перетащить saveEditedObject к себе в __custom целиком так, чтобы проверять обязательность только если не выбран самовывоз.
С другой стороны, у объекта заказа поле доставки обязательным буть не должно. Даже если юмисофты его таким сделали, по логике не должно. Значит, можно попробовать, если выбран самовывоз, просто вообще не создавать объекта адреса. В макросе из Вики весь блок кода //сохранение адреса доставки
поместить в условный оператор "если не самовывоз, то..."
По идее, второй вариант должен сработать.
как узнать, что выбран самовывоз? Есть $deliveryId. Не мудрствуя лукаво просто впишите проверку на id, который посмотрите в админке.
<delivery_choose>
<items>
<item id="18979" name="Самовывоз" price="0" xlink:href="uobject://18979"/>
правильным ли будет написать:
//сохранение адреса доставки
if($deliveryId != '18979') {
shoto у вас используется код взятый с wiki.umisoft оформление заказа в один шаг на xslt (http://wiki.umisoft.ru/%D0%9E%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%BA%D0%B0%D0%B7%D0%B0_%D0%B2_%D0%BE%D0%B4%D0%B8%D0%BD_%D1%88%D0%B0%D0%B3_%E2%80%93_xslt_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%82%D0%BE%D1%80)? Если да, то вопрос создания рабочего механизма покупки при выключенном js выглядит следующим образом...
1. изначально все поля необходимые для оформления заказа выводятся на странице (в том числе форма добавления адреса). С этим вроде все ок у вас
2. если посмотреть в код функции public function saveinfo() то там можно найти такие строчки
//сохранение адреса доставки
$addressId = getRequest('delivery-address');
if($addressId == 'new') {
$collection = umiObjectsCollection::getInstance();
$types = umiObjectTypesCollection::getInstance();
$typeId = $types->getBaseType("emarket", "delivery_address");
$customer = customer::get();
$addressId = $collection->addObject("Address for customer #".$customer->id, $typeId);
$dataModule = $cmsController->getModule("data");
if($dataModule) {
$dataModule->saveEditedObject($addressId, true, true);
}
$customer->delivery_addresses = array_merge( $customer->delivery_addresses, array($addressId) );
}
$order->delivery_address = $addressId;
они отвечают за сохранение адреса доставки, загоняем их в if, который проверяет является ли выбранный способ доставки самовывозом (по его id). В итоге, вышеуказанный код станет таким. id пункта самовывоз приведен для примера, в вашем случае его надо посмотреть в админке при редактировании способа доставки (помер в адресной строке браузера). Пусть в нашем примере, id способа доставки Самовывоз будет равен 27255.
if($deliveryId == 27255){
//сохранение адреса доставки
$addressId = getRequest('delivery-address');
if($addressId == 'new') {
$collection = umiObjectsCollection::getInstance();
$types = umiObjectTypesCollection::getInstance();
$typeId = $types->getBaseType("emarket", "delivery_address");
$customer = customer::get();
$addressId = $collection->addObject("Address for customer #".$customer->id, $typeId);
$dataModule = $cmsController->getModule("data");
if($dataModule) {
$dataModule->saveEditedObject($addressId, true, true);
}
$customer->delivery_addresses = array_merge( $customer->delivery_addresses, array($addressId) );
}
$order->delivery_address = $addressId;
}
3. после того, как мы на уровне php обезопасили систему от сохранения лишней информации, займемся визуальной частью. А именно, скроем блок для выбора\ввода адреса доставки. Так как, по совету Владимира, мы заботимся о пользователях с отключенным js (чего я в большинстве случаев не делаю, но это оговаривается с каждым клиентом в частном порядке), то мы скроем форму добавления\выбора адреса теми же средствами js. Чтобы, если js отключен, то ничего и не прячется. И пользователь видит форму добавления\выбора адреса и может, чисто с технической стороны, осуществить заказ.
Для этого мы после вывода блока с выбором\добавлением адреса (пусть весь этот блок лежит внутри <div class="delivery_block">...</div>) напишем js код вида
<script type="text/javascript" language="JavaScript">
var sposob_dostavki_id = jQuery('input[name="delivery-id"]:checked').val();
if(sposob_dostavki_id == 27255 ) jQuery('.delivery_block').hide();
</script>
а как повесить обработку при нажатии на radio input я уже писал в этом сообщении (http://umihelp.ru/forum/index.php/topic,1219.msg4314.html#msg4314)
все верно, надо исправить условие с == на != в итоге в функции public function saveinfo() надо кусок
//сохранение адреса доставки
$addressId = getRequest('delivery-address');
if($addressId == 'new') {
$collection = umiObjectsCollection::getInstance();
$types = umiObjectTypesCollection::getInstance();
$typeId = $types->getBaseType("emarket", "delivery_address");
$customer = customer::get();
$addressId = $collection->addObject("Address for customer #".$customer->id, $typeId);
$dataModule = $cmsController->getModule("data");
if($dataModule) {
$dataModule->saveEditedObject($addressId, true, true);
}
$customer->delivery_addresses = array_merge( $customer->delivery_addresses, array($addressId) );
}
$order->delivery_address = $addressId;
заменить на
if($deliveryId != 27255){
//сохранение адреса доставки
$addressId = getRequest('delivery-address');
if($addressId == 'new') {
$collection = umiObjectsCollection::getInstance();
$types = umiObjectTypesCollection::getInstance();
$typeId = $types->getBaseType("emarket", "delivery_address");
$customer = customer::get();
$addressId = $collection->addObject("Address for customer #".$customer->id, $typeId);
$dataModule = $cmsController->getModule("data");
if($dataModule) {
$dataModule->saveEditedObject($addressId, true, true);
}
$customer->delivery_addresses = array_merge( $customer->delivery_addresses, array($addressId) );
}
$order->delivery_address = $addressId;
}
<xsl:template match="/result[@method = 'fast_purchasing_xslt']">
<xsl:apply-templates select="document('udata://emarket/fast_purchasing_xslt')" mode="onstep"/>
</xsl:template>
<xsl:template match="udata[@module='emarket' and @method = 'fast_purchasing_xslt']" mode="onstep">
<form enctype="multipart/form-data" method="post" action="{$lang-prefix}/emarket/saveinfo/">
<xsl:apply-templates select="document(concat('udata://data/getEditForm/', customer/object/@id))" />
<!-- Выбор способа доставки -->
<h4>
<xsl:text>&delivery-agent;:</xsl:text>
</h4>
<div class="city">
<select class="txt" name="city" id="city-id">
<option value="">--Выберите город--</option>
<option value="5" dm="447,18628,18606,18979">Санкт-Петербург</option>
<option value="6" dm="18627,18979,18607,18633">Пригород Санкт-Петербурга и ЛО</option>
<option value="4" dm="18607,18633">Другой город</option>
</select>
</div>
<div class="sposob_dostavki">
<dl id="delivery-id">
<xsl:apply-templates select="delivery_choose/items" mode="delivery-choose" />
</dl>
<script type="text/javascript">
$(function() {
$("#city-id").change(function() {
$("#delivery-id input").attr("disabled", true);
$("#delivery-id dd").addClass("disabled");
$("#delivery-address").hide();
if (dm = $(":selected", this).attr("dm")) {
var validDeliveries = dm.split(",");
for (x in validDeliveries) {
$("#delivery-" + validDeliveries[x]).attr("disabled", false);
$("#delivery-" + validDeliveries[x] + "-description").removeClass("disabled");
}
}
});
});
</script>
</div>
<!-- /end Выбор способа доставки -->
<!-- Выбор адреса доставки -->
<div class="delivery_block">
<h4>
<xsl:text>&delivery;:</xsl:text>
</h4>
<div class="dostavka">
<xsl:apply-templates select="delivery/items" mode="delivery-address" />
<script>
jQuery('#delivery_address').submit(function(){
var input = jQuery('input:radio:checked', this);
if (typeof input.val() == 'undefined' || input.val() == 'new') {
if (typeof input.val() == 'undefined') {
jQuery('input:radio[value=new]', this).attr('checked','checked');
}
return site.forms.data.check(this);
}
});
</script>
</div>
</div>
<!-- /end Выбор адреса доставки -->
<!-- Способ оплаты-->
<h4>
<xsl:text>&payment-type;:</xsl:text>
</h4>
<div class="oplata">
<xsl:apply-templates select="payment/items/item" mode="payment" />
</div>
<div style="text-align:center;">
<input type="submit" class="button" value="&kupit;" />
</div>
<!-- /end Способ оплаты-->
</form>
</xsl:template>
кастом функции:
public function fast_purchasing_xslt(){
$order = $this->getBasketOrder();
$orderId = $order->id;
$customer = selector::get('object')->id($order->customer_id);
$result = array(
'attribute:id' => ($orderId),
'xlink:href' => ('uobject://' . $orderId));
if(!permissionsCollection::getInstance()->isAuth()){
$result['customer'] = array('full:object' => $customer);
}
$result['delivery'] = $this->customerDeliveryList('notemplate');
$result['delivery_choose'] = $this->renderDeliveryList($order, 'notemplate');
$result['payment'] = $this->renderPaymentsList_custom($order, 'notemplate');
return $result;
}
public function renderPaymentsList_custom(order $order, $template) {
list($tpl_block, $tpl_item) = def_module::loadTemplates("./tpls/emarket/payment/{$template}.tpl", 'payment_block', 'payment_item');
$payementIds = payment::getList(); $items_arr = array();
$currentPaymentId = $order->getValue('payment_id');
foreach($payementIds as $paymentId) {
$payment = payment::get($paymentId);
if($payment->validate($order) == false) continue;
$paymentObject = $payment->getObject();
$paymentTypeId = $paymentObject->getValue('payment_type_id');
$paymentTypeName = umiObjectsCollection::getInstance()->getObject($paymentTypeId)->getValue('class_name');
if( $paymentTypeName == 'social') continue;
$item_arr = array(
'attribute:id' => $paymentObject->id,
'attribute:name' => $paymentObject->name,
'attribute:type-name' => $paymentTypeName,
'xlink:href' => $paymentObject->xlink
);
if($paymentId == $currentPaymentId) {
$item_arr['attribute:active'] = 'active';
}
$items_arr[] = def_module::parseTemplate($tpl_item, $item_arr, false, $paymentObject->id);
}
return array('items' => array('nodes:item' => $items_arr));
}
public function saveinfo(){
$order = $this->getBasketOrder(false);
//сохранение регистрационных данных
$cmsController = cmsController::getInstance();
$data = $cmsController->getModule('data');
$data->saveEditedObject(customer::get()->id, false, true);
//сохранение способа доставки
$deliveryId = getRequest('delivery-id');
if($deliveryId){
$delivery = delivery::get($deliveryId);
$deliveryPrice = (float) $delivery->getDeliveryPrice($order);
$order->setValue('delivery_id', $deliveryId);
$order->setValue('delivery_price', $deliveryPrice);
}
//сохранение адреса доставки
if($deliveryId != 18979) {
$addressId = getRequest('delivery-address');
if($addressId == 'new') {
$collection = umiObjectsCollection::getInstance();
$types = umiObjectTypesCollection::getInstance();
$typeId = $types->getBaseType("emarket", "delivery_address");
$customer = customer::get();
$addressId = $collection->addObject("Address for customer #".$customer->id, $typeId);
$dataModule = $cmsController->getModule("data");
if($dataModule) {
$dataModule->saveEditedObject($addressId, true, true);
}
$customer->delivery_addresses = array_merge( $customer->delivery_addresses, array($addressId) );
}
$order->delivery_address = $addressId;
}
//сохранение способа оплаты и редирект на итоговую страницу, либо страницу подтверждения оплаты.
$order->setValue('payment_id', getRequest('payment-id'));
$order->refresh();
$paymentId = getRequest('payment-id');
if(!$paymentId) {
$this->errorNewMessage(getLabel('error-emarket-choose-payment'));
$this->errorPanic();
}
$payment = payment::get($paymentId);
if($payment instanceof payment) {
$paymentName = $payment->getCodeName();
$url = "{$this->pre_lang}/".cmsController::getInstance()->getUrlPrefix()."emarket/purchase/payment/{$paymentName}/";
} else {
$url = "{$this->pre_lang}/".cmsController::getInstance()->getUrlPrefix()."emarket/cart/";
}
$this->redirect($url);
}
Хэлп! что же не так с моим скриптом что у меня создается адрес с пустыми полями?!
На первый взгляд у админа в примере я вижу строчку
if($deliveryId != 27255){
а в вашем коде я такого условия не вижу. Может, потому и создается пустой адрес?
//сохранение адреса доставки
if($deliveryId != 18979) {
есть, просто у меня ID другой у этого значения.
у вас какие-то способы оплаты в админке?
Курьеру наличными и безнал для юр. лиц - оба имеют тип оплаты "Курьеру при получении".
Большое спасибо за отклик! Устранила проблему, хотя причину её так и не поняла)))
А где происходит отправка письма пользователю, о том что он сделал заказ? Пробую сделать это своими силами в функции saveinfo, но почему-то не получается вытащить email из только что сохранённого адреса доставки:
$addressId = $collection->addObject("Address for customer #".$customer->id, $typeId);
$address = umiObjectsCollection::getInstance()->getObject($addressId);
$em = $address->getValue( 'email' );
$em пуст. Что неправильно делаю?
Возвращаемся к старым баранам:(
1)Персональные данные - если не заполняешь какое то поле, если оно обязательное, автоматически выделяется поле и пишется "поле должно быть заполнено"
Но если идти дальше заполнять и не заполнить например поле в следующем блоке Контакты, куда выводятся е-маил и телефон, то почему то подсказка не появляется, но после нажатия "Отправить заказ" форма очищается, а адрес страницы имеет вид:
http://my_site.ru/emarket/fast_purchasing_xslt/?_err=1348046537
Тоже сейчас бьюсь с тем, что при ошибочном заполнении поля формы очищаются. Теоретически вот:
http://wiki.umisoft.ru/Использование_GET_и_POST_параметров_в_XSLT-шаблонах
Но дело в том, что происходит редирект и страницу с ошибкой пользователь запрашивает уже не по методу POST. Может уже есть какой-то готовый способ? Пока единственное, что пришло в голову - сохранять данные REQUEST в сессию в ф-ции saveinfo до строчки
if($dataModule) {
$dataModule->saveEditedObject($addressId, true, true);
}
И затем в шаблоне запрашивать их уже из сессии. Подскажите плз, правильное ли направление мысли?
Для тех у кого не отправляются письма и все зависает на этапе
"emarket/purchase/payment/{$paymentName}"
Не забываем про вот этот шаг в шаблоне:
<xsl:template match="result[@method = 'purchase']">
<div id="cart">
<xsl:apply-templates select="document('udata://emarket/purchase')/udata" />
</div>
</xsl:template>
<xsl:template match="purchasing[@stage = 'result'][@step = 'successful']">
<h1>Спасибо за Ваш заказ!</h1>
</xsl:template>
Там свой сайт со своими шаблонами, от стандартных ничего не осталось.
Изначально сделано оформление заказа в несколько шагов. попросили сделать в 1 шаг, взял вот эту статью
http://wiki.umisoft.ru/Оформление_заказа_в_один_шаг_–_xslt_шаблонизатор
и прикрутил шаблон вот отсюда:
http://umihelp.ru/forum/index.php?topic=1366.0
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:umi="http://www.umi-cms.ru/TR/umi">
<!-- СТРАНИЦА CART -->
<xsl:template match="result[@module='emarket' and @method='cart']">
<div class=" no-aside container frame clearfix">
<div class="section">
<ul class="breadcrumbs">
<li><a href="#">Главная</a></li>
<li>Корзина</li>
</ul>
<h1>Ваша корзина</h1>
<!-- Вывод корзины товаров -->
<div class="cart-f">
<ul class="cart">
<li class="title-heading">
<div class="col1"><strong>Товар</strong></div>
<div class="col2"><strong>Количество</strong></div>
<div class="col3"><strong>Стоимость</strong></div>
<div class="col4"><strong>Удалить</strong></div>
</li>
<!-- Вывод товаров в корзине items -->
<xsl:apply-templates select="udata/items/item" mode="cart_items" />
<li class="clearfix total title-heading">
<div class="total-box">
<strong class="label">ИТОГО:</strong>
<strong class="value"><xsl:value-of select="udata/summary/price/actual"/> .- </strong>
</div>
</li>
</ul>
<!-- Вывод оформления заказа в один шаг -->
<xsl:apply-templates select="document('udata://emarket/fast_purchasing_xslt/')/udata" mode="one_step" />
</div>
</div>
</div>
</xsl:template>
<!-- Вывод товаров item в корзине -->
<xsl:template match="item" mode="cart_items" >
<!-- Подключаю форму для кнопки "Пересчитать" -->
<form id="basket_{page/@id}" action="/emarket/basket/put/element/{page/@id}/" method="get">
<li class="clearfix">
<div class="col1">
<a href="{page/@link}"><img src="{document(concat('upage://', page/@id))/udata/page/properties/group[@name='images_tovara']/property[@name='glavnoe_izobrazhenie']/value}" width="59"/></a>
<strong><a href="{page/@link}"> <xsl:value-of select="page/name"/></a></strong>
</div>
<div class="col2"><input name="amount" class="text" value="{amount}" type="text" />
<a href="#" onclick="document.getElementById('basket_{page/@id}').submit()" ><img alt="Пересчитать" title="Пересчитать" src="/images/sync.png" style="margin-bottom: 4px; margin-left: 4px;"/></a>
</div>
<div class="col3"><xsl:value-of select="price/actual"/> .- </div>
<div class="col4"><a alt="Удалить товар из корзины" title="Удалить товар из корзины" href="/emarket/basket/remove/element/{./page/@id}/"><span class="del">del</span></a></div>
</li>
<!-- Закрываю форму для кнопки "Пересчитать" -->
</form>
</xsl:template>
<!-- КОРЗИНА ТОВАРОВ ВЫВОД ONE STEP ОФОРМЛЕНИЯ ЗАКАЗА -->
<xsl:template match="udata" mode="one_step" >
<!-- Подключаю форму обработки данных оформления заказа -->
<form method="post" action="/emarket/saveinfo/">
<div class="blocks-holder clearfix">
<div class="block main-block">
<h2>Личные данные</h2>
<!-- Вывод поля данных пользователя -->
<xsl:apply-templates select="customer" mode="customer" />
<!-- Вывод поля адреса доставки -->
<xsl:apply-templates select="delivery" mode="delivery" />
</div>
<div class="sub-block block">
<h2>Способ доставки</h2>
<!-- Вывод выбора способа доставки -->
<xsl:apply-templates select="delivery_choose/items/item" mode="delivery_choose" />
</div>
<div class="add-block block">
<h2>Способ оплаты</h2>
<!-- Вывод выбора способа оплаты -->
<xsl:apply-templates select="payment/items/item" mode="payment" />
</div>
</div>
<!-- Вывод кнопки оформления заказа и кнопки возвращения в каталог -->
<div class="btn-holder">
<input type="submit" value="оформить заказ" class="submit fl-r"/>
<a href="/" class="reset fl-l">Вернуться в каталог</a>
</div>
<!-- Закрываю форму обработки данных оформления заказа -->
</form>
</xsl:template>
<!-- Поля личных данных пользователя -->
<xsl:template match="customer" mode="customer">
<xsl:apply-templates select="document(concat('udata://data/getEditForm/', object/@id))/udata/group/field" mode="delivery_field" />
</xsl:template>
<xsl:template match="delivery" mode="delivery">
<xsl:apply-templates select="document('udata://data/getCreateForm/5')/udata/group/field" mode="delivery_field" />
</xsl:template>
<!-- Вывод поля адреса доставки -->
<xsl:template match="field" mode="delivery_field">
<div class="f-row clearfix">
<label class="label"><xsl:value-of select="@title" />*</label>
<div class="f-input"><input type="{@type}" class="text" name="{@input_name}" /></div>
</div>
</xsl:template>
<!-- Вывод поля СТРАНА адреса доставки -->
<xsl:template match="field[@name='country']" mode="delivery_field">
<div class="f-row clearfix">
<label class="label"><xsl:value-of select="@title" />*</label>
<select name="{@input_name}" class="text">
<xsl:apply-templates select="values/item" mode="delivery_field_select" />
</select>
</div>
</xsl:template>
<!-- Вывод данных списка в поле СТРАНА адреса доставки -->
<xsl:template match="item" mode="delivery_field_select">
<option value="{@id}" ><xsl:value-of select="."/></option>
</xsl:template>
<!--Вывод item способов доставки-->
<xsl:template match="item" mode="delivery_choose" >
<div class="f-row clearfix">
<input checked="checked" name="delivery-address" value="new" type="radio" />
<label for="r5"><xsl:value-of select="@name"/></label>
</div>
</xsl:template>
<!--Вывод item способов оплаты-->
<xsl:template match="item" mode="payment" >
<div class="f-row clearfix">
<input checked="checked" type="radio" name="payment-id" class="{@type-name}" value="{@id}" />
<label for="r2"><xsl:value-of select="@name"/></label>
</div>
</xsl:template>
</xsl:stylesheet>
Рассчитываться стоимость доставки должна после заполнения индекса(ведь вроде на это смотрит ). ну либо хотя бы по нажатию кнопки. все равно. это ведь с помощью скрипта решить можно... главное что дергать...
Воспользовался статьей
[link]http://wiki.umisoft.ru/%D0%9E%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%BA%D0%B0%D0%B7%D0%B0_%D0%B2_%D0%BE%D0%B4%D0%B8%D0%BD_%D1%88%D0%B0%D0%B3_%E2%80%93_xslt_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%82%D0%BE%D1%80[/link]
php коды скопировал, а далее ошибка - Debug message for UC-pages.
В файл cart.xsl добавил
<xsl:template match="/result[@method = 'fast_purchasing_xslt']">
<xsl:apply-templates select="document('udata://emarket/fast_purchasing_xslt')" mode="onstep"/>
</xsl:template>
<xsl:template match="udata[@module='emarket' and @method = 'fast_purchasing_xslt']" mode="onstep">
В статье не все подробно описано. Как сделать правильно?
В файл cart.xsl добавил
<xsl:template match="/result[@method = 'fast_purchasing_xslt']">
<xsl:apply-templates select="document('udata://emarket/fast_purchasing_xslt')" mode="onstep"/>
</xsl:template>
<xsl:template match="udata[@module='emarket' and @method = 'fast_purchasing_xslt']" mode="onstep">
В статье не все подробно описано. Как сделать правильно?
а после <xsl:template match="udata[@module='emarket' and @method = 'fast_purchasing_xslt']" mode="onstep">
у вас что-то есть?