UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: shoto от 05 Июня 2012, 15:30:58

Название: Оформление заказа за один шаг.
Отправлено: shoto от 05 Июня 2012, 15:30:58
Добрый день.
Дошли таки до темы, когда оформление заказа в интернет-магазине хотят делать за один шаг, что бы не было "Далее" "Продолжить".
на 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 (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)
вроде описывается как...
но мне пока еще сложно понять что же надо делать после добавления приведенных там методов.
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 06 Июня 2012, 17:51:57
на каком именно моменте вы остановились? кастомы добавили? вывели все формы (выбор адреса, выбор способа доставки\оплаты и т.д.)? оформление заказа завершается удачно?
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 07 Июня 2012, 09:52:42
остановилась на пункте:
Цитировать
На системной странице /emarket/cart/, либо какой-либо другой, подобным вызовом: udata://emarket/fast_purchasing_xslt/
разместила вызов:
<xsl:apply-templates select="document('udata://emarket/fast_purchasing_xslt/')" />
на странице /emarket/cart.xsl
дальше не понятно что надо делать.
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 07 Июня 2012, 11:02:50
дальше вам надо создать шаблон для результатов работы макроса udata://emarket/fast_purchasing_xslt/

то есть смотрите что он возвращает и выводите соответствующие блоки, форма для информации о пользователе, форма выбора способа доставки и т.п. то есть берете узлы которые вам вернул вызов udata://emarket/fast_purchasing_xslt/ и пишете для них шаблоны на основе стандартных блоков которые есть в demodizzy
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 07 Июня 2012, 12:48:28
Мне необходимо все пункты объединить в один
<form method="post" action="{$lang-prefix}/emarket/saveinfo/">
получается?

т.е. создать еще один шаблон, на который будет переход со страницы  /emarket/cart/ после нажатия "оформить заказ"
Где будет шаблоны для заполнения данных о покупателе, способов доставки, адреса если нужно и способов оплаты.
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 07 Июня 2012, 14:46:43
Цитировать
т.е. создать еще один шаблон

который будет обрабатывать вызов макроса udata://emarket/fast_purchasing_xslt/ и вставлять шаблоны для заполнения данных о покупателе, способов доставки, адреса если нужно и способов оплаты, в то место где был вызван макрос udata://emarket/fast_purchasing_xslt/

Все эти формы будут внутри <form method="post" action="{$lang-prefix}/emarket/saveinfo/">
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 09 Июня 2012, 11:22:39
формы вывести удалось почти все:)
Вопрос теперь основной, как скрывать форму для заполнения адреса, если выбран способ доставки "Самовывоз".
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 09 Июня 2012, 14:11:37
сделать на 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>
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 09 Июня 2012, 15:04:56
Если после Корзины, нажимая "оформить заказ" попадаешь на страницу где все данные, то Самовывоз стоит первым и сразу отмеченный, и блок с адресом в данном случае не пропадает.
Если выбрать любой другой способ доставки, а потом снова выбрать "Самовывоз" то блок с Адресом скрывается.
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 09 Июня 2012, 15:10:03
значит добавь js код который скрывает этот блок с адресом если выбранный кусок не самовывоз, или сразу его скрой, если самовывоз всегда первый
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 09 Июня 2012, 15:56:21
Да, я уже подумала и сделала этот вариант. т.е. скрыла сразу блок.
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 09 Июня 2012, 16:02:38
то есть все получилось?
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 09 Июня 2012, 16:04:19
Блок Адрес скрыт сразу, и открывается если выбрать какой либо способ доставки не равный Самовывоз.

Еще вопрос.
Необходимо что бы при выборе: Петербург / Пригород / Другой город (из выпадающего списка).
Активными становились определенные способы доставки из всех вариантов доставки, а другие становились не активными.
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 09 Июня 2012, 16:10:53
точно также средствами js прячете или показываете какие-то блоки
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 13 Июня 2012, 10:54:11
Удалось прикрутить скрипт со старого сайта:)
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 14 Июня 2012, 15:24:31
засада...
при выборе пункта Самовывоз, форма для вывода адреса доставки конечно скрывается... но при нажатии "Оформить заказ" появляются ошибки заполнение полей адреса. а по логике это не должно проверяться... что делать?
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 14 Июня 2012, 16:11:49
либо в коде добавьте проверку что если выбран самовывоз то пропустить шаг с сохранением оплаты, либо при помощи js проставляйте способ оплаты при получении
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 14 Июня 2012, 16:28:58
проверку какими средствами?
оплата у меня одна единственная и проставлена по умолчанию.
как мне отключить проверку заполнения полей адреса доставки, если требуется Самовывоз. простое скрытие формы для адреса не вариант.
Где отключается проверка на заполнение?
Название: Re:Оформление заказа за один шаг.
Отправлено: Vladimir от 14 Июня 2012, 16:53:56
Можно в шаблонах данных снять обязательность полей в адресе доставки.
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 14 Июня 2012, 17:09:28
Можно в шаблонах данных снять обязательность полей в адресе доставки.
Это крайний вариант, т.к. все же для доставки все же важно что бы был адрес указан, в том числе и для вывода квитанции для оплаты через банк (данный пункт будет с способах оплаты).
Как все таки не выводить адрес доставки, при выборе способа Самовывоз.

мозг ушел на отдых:(
Название: Re:Оформление заказа за один шаг.
Отправлено: Vladimir от 14 Июня 2012, 18:32:28
Проверять наличие адреса вы будете яавскриптом, который напишите сами под свои нужды. А проверка средствами ЮМИ ставит вас в зависимость от имеющейся логики. Поэтому, давайте посмотрим так: а вообще у вас что-то купить при отключенном яваскрипте можно? Если нет, то нет смысла беспокоиться об адресе доставки.
В ином случае у вас правильный сайт и, конечно, тогда нельзя портить его такми костылем, лучше кастом написать.
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 15 Июня 2012, 10:33:06
Vladimir
При отключенном JavaScripte скрытые способы доставки, и адрес доставки не отображаются, но заказ при этом оформляется.
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 18 Июня 2012, 13:16:14
В ином случае у вас правильный сайт и, конечно, тогда нельзя портить его такми костылем, лучше кастом написать.

какая логика должна быть у этого кастома? с чего вообще начинать?
Название: Re:Оформление заказа за один шаг.
Отправлено: Vladimir от 18 Июня 2012, 18:05:47
Не знаю. Подумаем вместе.

В ашем макросе из Вики есть строка
$dataModule->saveEditedObject($addressId, true, true);
В методе saveEditedObject зашита проверка на обязательность полей checkRequiredData в __client_reflection.php
Т.о., избавиться от нее можно заменив системный метод сохрания объекта адреса доставки на свой собственный. Для начала, попробовать перетащить saveEditedObject к себе в __custom целиком так, чтобы проверять обязательность только если не выбран самовывоз.

С другой стороны, у объекта заказа поле доставки обязательным буть не должно. Даже если юмисофты его таким сделали, по логике не должно. Значит, можно попробовать, если выбран самовывоз, просто вообще не создавать объекта адреса. В макросе из Вики весь блок кода
 //сохранение адреса доставки
поместить в условный оператор "если не самовывоз, то..."

По идее, второй вариант должен сработать.
как узнать, что выбран самовывоз?  Есть $deliveryId. Не мудрствуя лукаво просто впишите проверку на id, который посмотрите в админке.
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 19 Июня 2012, 14:14:14
<delivery_choose>
<items>
<item id="18979" name="Самовывоз" price="0" xlink:href="uobject://18979"/>
правильным ли будет написать:
//сохранение адреса доставки
  if($deliveryId != '18979') {
Название: Re:Оформление заказа за один шаг.
Отправлено: Vladimir от 19 Июня 2012, 17:03:12
Думаю, да, вполне похоже на id
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 20 Июня 2012, 10:48:21
Что то не получается.
ведь этот кусок начинает "работать" если уже объект Адрес создан (силами JS спрятан). а вот как что бы не создавался сразу, а создавался только после выбора всего что не= "Самовывоз"...
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 20 Июня 2012, 11:55:50
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)
Название: Re:Оформление заказа за один шаг.
Отправлено: Vladimir от 20 Июня 2012, 12:25:07
Цитировать
Так как, по совету Владимира, мы заботимся о пользователях с отключенным js
Ничего подобного я не советовал! Я как раз клонил к тому, что если без яваскрипта поле адреса заполнить невозможно, то и нет никакого смысла вообще заморачивать себе голову обязательностью адреса - отключить обязательность в шаблонах данных и все дела.
Тем более, в реальности таких магазинов, где корзина на яваскрипте только и держится, уже стало много. Это просто я сам себе яваскрипт всегда отключаю, потому и бросается в глаза)

Но admin предложил очень  правильное решение.
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 20 Июня 2012, 12:43:39
Владимир, вы правы) я перечитал ваше сообщение.

Стоит сказать что с последних версия umi вопрос со скрытием адреса доставки при самомвывозе решен на уровне default решения смотри в данной статье http://blog.umi-cms.ru/dobryakov/release_2851/
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 20 Июня 2012, 12:49:54
Что то я не понимаю логики.
если $deliveryId равно 27255
то запускаем сохранение адреса доставки.
Зачем?! если нам наоборот надо сохранять адрес только в том случае если выбран НЕ самовывоз.

Про решение на уровне default, там просто строка "Самовывоз" выводится на шаге "Адрес доставки".
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 20 Июня 2012, 12:52:08
все верно, надо исправить условие с == на != в итоге в функции 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;

}
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 20 Июня 2012, 12:56:02
Это я уже пробовала. и написала что не работает.
При выбранном Самовывозе, методом JS у меня не выводятся поля для заполнения адреса (они скрыты), но при этом сохраняются пустые адреса для пользователя (проверку на обязательное заполнение этих полей я убрала).
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 20 Июня 2012, 13:12:44
shoto, покажите код шаблонов для вывода форм для оформления заказа в один шаг и покажите код custom функций, с которым вы работаете
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 20 Июня 2012, 13:26:35
<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);
}
Название: Re:Оформление заказа за один шаг.
Отправлено: bosya от 20 Июня 2012, 16:21:27
shoto а у Вас заказ создается?
столкнулся с проблемой на 2.8.5.2 на последнем шаге редиректит
emarket/purchase/payment/{$paymentName} и молчок..
доставка курьером или самовывозом,  оплата курьером.
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 20 Июня 2012, 16:25:49
bosya, у меня заказ создается. Все оформляется, только и дополнительный (пустой)адрес доставки создается, если указан Самовывоз. либо если поставлено значение "поле обязательное" то ругается что надо заполнить поля Адреса.
и у меня все шаги на одной странице /emarket/fast_purchasing_xslt/
Название: Re:Оформление заказа за один шаг.
Отправлено: bosya от 20 Июня 2012, 16:26:44
а у Вас какая версия юми?
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 20 Июня 2012, 16:46:27
а у Вас какая версия юми?
2.8.5.1
Название: Re:Оформление заказа за один шаг.
Отправлено: bosya от 20 Июня 2012, 17:03:59
Странно, может из за бонусов что то изменили в системе оформления заказа.все устанавливает и адрес и способ оплаты, но не хочет добавлять заказ
Название: Re:Оформление заказа за один шаг.
Отправлено: bosya от 21 Июня 2012, 10:44:30
И снова вопрос снимается...сам дурак...Спасибо)
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 21 Июня 2012, 12:22:02
И снова вопрос снимается...сам дурак...Спасибо)
т.е. и в новой версии все нормально работает?
а что было?
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 29 Июня 2012, 11:26:21
Хэлп! что же не так с моим скриптом что у меня создается адрес с пустыми полями?!
Название: Re:Оформление заказа за один шаг.
Отправлено: ktoxot от 16 Июля 2012, 16:07:27
Шаблоны оформил, но заказ не добавляется и все останавливается на моменте редиректа на страницу подтверждения оплаты. Когда оплата не активирована в системе управления выводит ошибку.
Название: Re:Оформление заказа за один шаг.
Отправлено: Vladimir от 16 Июля 2012, 21:27:47
Хэлп! что же не так с моим скриптом что у меня создается адрес с пустыми полями?!
На первый взгляд у админа в примере я вижу строчку
if($deliveryId != 27255){
а в вашем коде я такого условия не вижу. Может, потому и создается пустой адрес?
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 17 Июля 2012, 15:35:55
//сохранение адреса доставки
  if($deliveryId != 18979) {
есть, просто у меня ID другой у этого значения.
Название: Re:Оформление заказа за один шаг.
Отправлено: okolovas от 24 Июля 2012, 13:18:19
Вроде всё сделала по статье, но на последнем шаге происходит редирект на
emarket/purchase/payment/{$paymentName}
и заказ так и не создаётся... Помогите, пожалуйста, разобраться, в чём может быть причина...
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 24 Июля 2012, 19:43:42
Цитировать
Вроде всё сделала по статье, но на последнем шаге происходит редирект на
emarket/purchase/payment/{$paymentName}

у вас какие-то способы оплаты в админке?
Название: Re:Оформление заказа за один шаг.
Отправлено: okolovas от 02 Августа 2012, 14:10:48
у вас какие-то способы оплаты в админке?

Курьеру наличными и безнал для юр. лиц - оба имеют тип оплаты "Курьеру при получении".
Большое спасибо за отклик! Устранила проблему, хотя причину её так и не поняла)))

А где происходит отправка письма пользователю, о том что он сделал заказ? Пробую сделать это своими силами в функции saveinfo, но почему-то не получается вытащить email из только что сохранённого адреса доставки:

$addressId  = $collection->addObject("Address for customer #".$customer->id, $typeId);
$address = umiObjectsCollection::getInstance()->getObject($addressId);
$em = $address->getValue( 'email' );

$em пуст. Что неправильно делаю?
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 03 Августа 2012, 22:04:19
$addressId  = $collection->addObject("Address for customer #".$customer->id, $typeId); //добавляет новый объект для сохранения адреса
$address = umiObjectsCollection::getInstance()->getObject($addressId); // получаете объект нового адреса
$em = $address->getValue( 'email' ); // пытаетесь получить email

а сохранения в новосозданный объект всей информации (в том числе email) , после чего их можно будет вытягивать прописанно в  строчках:

    $dataModule = $cmsController->getModule("data");
    if($dataModule) {
      $dataModule->saveEditedObject($addressId, true, true);
    }

НО, это отвечая на ваш вопрос в чем ошибка, а говоря о том, чтобы отправить письмо пользователю при совершении заказа лучше смотреть в сторону обработчика события "оформление заказа" к которому вы можете привязаться и выполнить отправку письма. Посмотрите статью на wiki об отправке письма при оформлении Отправка писем менеджерам в зависимости от домена (http://wiki.umisoft.ru/%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B0_%D0%BF%D0%B8%D1%81%D0%B5%D0%BC_%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80%D0%B0%D0%BC_%D0%B2_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%82_%D0%B4%D0%BE%D0%BC%D0%B5%D0%BD%D0%B0)(там немного для другого это рассказывается, но все что вам надо там есть)
Название: Re:Оформление заказа за один шаг.
Отправлено: okolovas от 07 Августа 2012, 19:01:38
Спасибо большое! Всё получилось, письма отправляются.
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 08 Августа 2012, 15:56:16
а у меня проблема так и не решена.:(
Название: Re:Оформление заказа за один шаг.
Отправлено: shoto от 19 Сентября 2012, 13:47:34
Возвращаемся к старым баранам:(
1)Персональные данные - если не заполняешь какое то поле, если оно обязательное, автоматически выделяется поле и пишется "поле должно быть заполнено"
Но если идти дальше заполнять и не заполнить например поле в следующем блоке Контакты, куда выводятся е-маил и телефон, то почему то подсказка не появляется, но после нажатия "Отправить заказ" форма очищается, а адрес страницы имеет вид:
http://my_site.ru/emarket/fast_purchasing_xslt/?_err=1348046537
Название: Re:Оформление заказа за один шаг.
Отправлено: okolovas от 28 Сентября 2012, 18:34:51
Тоже сейчас бьюсь с тем, что при ошибочном заполнении поля формы очищаются. Теоретически вот:
http://wiki.umisoft.ru/Использование_GET_и_POST_параметров_в_XSLT-шаблонах
Но дело в том, что происходит редирект и страницу с ошибкой пользователь запрашивает уже не по методу POST. Может уже есть какой-то готовый способ? Пока единственное, что пришло в голову - сохранять данные REQUEST в сессию в ф-ции saveinfo до строчки
if($dataModule) {
$dataModule->saveEditedObject($addressId, true, true);
}
И затем в шаблоне запрашивать их уже из сессии. Подскажите плз, правильное ли направление мысли?
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 29 Сентября 2012, 00:07:52
вообще в umi есть дефолтный механизм сохранение значения полей формы в сессию, главное чтобы форма имела id, любой, и onsubmit событие

например так
<form action="some_action" onsubmit="site.forms.data.save(this); return site.forms.data.check(this);" id="some_id" method="post" enctype="multipart/form-data">

и чтобы файл /js/site/__common.js был подключен, так как он подтягивает файл /js/site/forms.js в котором этот функционал и есть
Название: Re:Оформление заказа за один шаг.
Отправлено: okolovas от 01 Октября 2012, 12:51:48
Спасибо большое за подсказку, с помощью неё набрела на вот такой способ:
http://wiki.umisoft.ru/%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D1%81%D0%B2%D1%8F%D0%B7%D1%8C:_%D0%A1%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D0%BF%D0%BE%D0%BB%D0%B5%D0%B9_%D0%BF%D1%80%D0%B8_%D0%B2%D0%BE%D0%B7%D0%BD%D0%B8%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B8_%D0%BE%D1%88%D0%B8%D0%B1%D0%BE%D0%BA_%D0%BE%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B8
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 01 Октября 2012, 13:06:05
добавлю только, что насколько мне известно, вариант в вики использует более старый вариант js скрипта,  чем скрипты из папки /js/site/
Название: Re:Оформление заказа за один шаг.
Отправлено: okolovas от 09 Октября 2012, 13:29:35
Ещё остался вопросик... Подскажите, пожалуйста, как правильно вытащить $order->number чтобы подставить его в письмо пользователю? Почему-то $order->id есть, а $order->number пуст... Пробовала делать и так:

$full_order = umiObjectsCollection::getInstance()->getObject($order->id);

но $full_order->number тоже пуст, как с ним правильно работать?
Название: Re:Оформление заказа за один шаг.
Отправлено: ktoxot от 09 Октября 2012, 17:41:31
Для тех у кого не отправляются письма и все зависает на  этапе
"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>
Название: Re:Оформление заказа за один шаг.
Отправлено: okolovas от 10 Октября 2012, 17:35:10
Если кому-то пригодится, удалось обойти проблему с $order->number только переместив отправку письма в функцию
public function onStatusChangedDomain(iUmiEventPoint $event) {
Название: Re:Оформление заказа за один шаг.
Отправлено: PHOENIX-75 от 12 Октября 2012, 15:02:20
Подскажите пожалуйста, может уже кто сталкивался и решал такой вопрос.
При оформлении заказа в один шаг у страницы отсутствует title.
Если посмотреть что отдаёт xml то видно, что title ничего не содержит:

<result module="emarket" method="fast_purchasing" domain="localhost" system-build="20317" lang="ru" header="" title="" site-name="Local-Shop" request-uri="/emarket/fast_purchasing/.xml">

Или может быть есть возможность подставить title принудительно?
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 16 Октября 2012, 12:11:03
для того чтобы в title что-то появилось надо чтобы в php скрипте был указан заголово. Самый простой пример:

немного редактируем функцию
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');
 
$this->setHeader("Наш заголовок");
return  $result;
}

не забываем что если мы в файле пишем кириллицу, то обязательно проверяйте кодировку файла , чтобы была utf-8 без bom
Название: Re:Оформление заказа за один шаг.
Отправлено: PHOENIX-75 от 18 Октября 2012, 17:20:59
Попробовал, дописал строчку в функцию. Увы, не сработало.
Может быть есть ещё какие варианты? Кто сталкивался?
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 25 Октября 2012, 16:32:38
код в студию
Название: Re:Оформление заказа за один шаг.
Отправлено: okolovas от 15 Ноября 2012, 19:04:47
Помогите, пожалуйста!

В том же механизме быстрого заказа из всех способов оплаты работает только "курьеру наличными". При выборе других способов ("курьеру картой", который должен работать так же как "наличными курьеру", или "робокасса") пользователь не попадает на страницу /emarket/saveinfo/ вообще. Почему так может происходить?

Способы оплаты в админке существуют, ID правильные, кроме того, в механизме обычного заказа по шагам /emarket/fast_purchase/ всё корректно работает...
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 16 Ноября 2012, 10:41:29
способы оплаты "наличными курьеру", или "робокасса" работают по разному принципу, если вы под строчкой
Цитировать
"наличными курьеру", или "робокасса"
подразумевали именно тип способа оплаты, а не то название, которые вы им дали при создании в админке.

Поэтому, давайте сначала о том, какой тип способа оплаты в админке у вашего варианта оплаты "курьеру картой"?
Название: Re:Оформление заказа за один шаг.
Отправлено: okolovas от 16 Ноября 2012, 12:30:09
Курьеру картой и курьеру наличными имеют одинаковый тип - "курьеру наличными". Robokassa имеет тип "Robokassa".
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 16 Ноября 2012, 16:20:40
а куда попадает пользователь когда выбирает вариант оплаты "Курьеру картой"?
Название: Re:Оформление заказа за один шаг.
Отправлено: okolovas от 16 Ноября 2012, 16:32:24
Как и при выборе робокассы, на страницу /emarket/fast_purchasing_xslt/do/
Если снова отправить заказ с одним из этих способов оплаты, то попадёт на /emarket/fast_purchasing_xslt/do/do/ , затем на /do/do/do/ и так далее.
Название: Re:Оформление заказа за один шаг.
Отправлено: okolovas от 19 Ноября 2012, 18:42:57
То есть, ничего не происходит, пользователь остаётся на той же странице. В URL в конец дописывается "/do" каждый раз.
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 22 Ноября 2012, 14:30:00
где-то тут писали, что в одном из последних релизов была бага со способом оплаты "Оплата курьеру при получении" вроде уже пофиксили, ну или по крайней мере umi СЗ взяла этот момент в разработку
Название: Re:Оформление заказа за один шаг.
Отправлено: rellai от 17 Мая 2014, 02:04:43
Всем привет, подниму старую тему.
У меня вопрос возник, а как сделать чтобы после ввода адреса расчиталась стоимость доставки?
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 17 Мая 2014, 07:22:28
Всем привет, подниму старую тему.
У меня вопрос возник, а как сделать чтобы после ввода адреса расчиталась стоимость доставки?


Очень общий вопрос.
Опишите в какой момент должна рассчитываться стоимость?
Например, если у вас стандартный вариант оформления заказа, как сделано в demodizzy, то у вас все шаги оформления идут подряд на разных страницах и стоимость доставок считается сама (и тут уже вопрос как правильно создать способы доставки чтобы они считались)...

или у вас установлен один из "готовых сайтов", тогда оформление заказа у вас происходит немного по другим шаблонам и немного другому сценарию...

или у вас оформление заказа в один шаг (либо сделанный на основе статьи wiki.umisoft, либо дефолтный если у вас одна из последних версий системы) и там рассчет опять же должен происходит сам собой...

или у вас свой способ доставки, который сам должен считать стоимость работая с API какого-то сервиса...

и т.п.

Пиши полнее, желательно с описание чего конкретно у вас уже есть, чего хочется и что не получается.
Название: Re:Оформление заказа за один шаг.
Отправлено: rellai от 17 Мая 2014, 10:41:01
Там свой сайт со своими шаблонами, от стандартных ничего не осталось.
Изначально сделано оформление заказа в несколько шагов. попросили сделать в 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>

Рассчитываться стоимость доставки должна после заполнения индекса(ведь вроде на это смотрит ). ну либо хотя бы по нажатию кнопки. все равно. это ведь с помощью скрипта решить можно... главное что дергать...
Название: Re:Оформление заказа за один шаг.
Отправлено: rellai от 19 Мая 2014, 13:48:59
Есть у кого нить мысли?
Как и что можно дернуть чтобы расчитало стоимость доставки?
Название: Re:Оформление заказа за один шаг.
Отправлено: rellai от 19 Мая 2014, 15:23:55
Все вроде вопрос решился, пошли обходным путем.
Всем спасибо
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 19 Мая 2014, 16:34:16
чисто по логике, дергать нужно следующее

1. предположим у нас рабочий шаблон оформления в один шаг. В нем есть блоки:
     - личные данные
     - адрес доставки
     - способ доставки
     - способ оплаты

2. Нас интересует поведение системы при работе с блоком адрес доставки. Там выводятся поля для заполнение нового или выбора ранее созданного адреса.

3. при заполнении определенных полей (например индекса), система должна отправлять ajax запрос для получения информации о стоимости доставки.

4. Изначально, надо проверить что стоимость доставки вообще считается. То есть, как вариант, попробовать оформить заказ в несколько шагов по default umi механизму. можно руками вбить адрес первого шага (/emarket/purchase/required ) и пройтись по шагам. Если система выводить стоимость доставки в зависимости от разных адресов, то идем дальше.

5. Возвращаемся к нашей странице оформления заказа в один шаг. Там после заполнения адреса, по кнопке (или еще по какому событию) отправляем данные с адресом (можно  просто записать его в систему, как будто шаг ввода адреса закончен) и запрашиваем данные по способам доставки. Система выводит их уже с ценами, которые мы благополучно вставляем в блок "Способов доставки"

P.S. безусловно схему можно шлифовать или использовать альтернативные приему, но зачастую, это выглядит таким образом
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 19 Мая 2014, 16:34:41
Все вроде вопрос решился, пошли обходным путем.
Всем спасибо

каким, если не секрет?
Название: Re:Оформление заказа за один шаг.
Отправлено: john от 13 Июня 2014, 22:55:38
Воспользовался статьей
[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">

В статье не все подробно описано. Как сделать правильно?
Название: Re:Оформление заказа за один шаг.
Отправлено: admin от 16 Июня 2014, 21:23:01
В файл 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">
у вас что-то есть?
Название: Re: Оформление заказа за один шаг.
Отправлено: timofey99 от 30 Марта 2018, 13:45:34
День добрый уважаемые знатоки юми, много искал в поисковиках, но ничего толкового( на мой взгляд не специалиста). Интересует калькулятор сдэк, есть модуль на оф сайте, но лицензия кончилась, продлить дорого. вот решил взять их код калькулятора и поставить в движок, но понятия не имею как( это мои первые шаги с юми). Не прошу сделать за меня, но подсказать с чего начать, многое не понятно. До этого занимался версткой и доработками. Если кто ответит опишу покажу и заскриню что и как планирую. не ругайте новичка))) на этом форуме буду с утра и до вечера каждый день