Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
Шаги "оформление заказа"

Автор atachРаздел Шаблоны TPL

Ответов: 11
Просмотров: 6596
Последний ответ 14 Августа 2013, 16:59:21
от admin
Вывести сумму заказа на странице "Заказ поступил в обработку"

Автор AxiomateriaРаздел Шаблоны XSLT

Ответов: 2
Просмотров: 3746
Последний ответ 07 Ноября 2014, 23:46:49
от Axiomateria
Перенаправление на страницу регистрации покупателя перед оформлением заказа

Автор AxiomateriaРаздел Шаблоны XSLT

Ответов: 16
Просмотров: 10006
Последний ответ 11 Марта 2013, 11:54:29
от Axiomateria
Проблемы уведомления клиента при смене статуса заказа и доставки

Автор stud_maiРаздел Шаблоны XSLT

Ответов: 7
Просмотров: 4247
Последний ответ 05 Января 2016, 00:59:01
от admin
Не суммировать скидку на товар с общей скидкой от суммы заказа

Автор smartwebРаздел Шаблоны TPL

Ответов: 3
Просмотров: 2625
Последний ответ 19 Декабря 2016, 12:29:09
от aghigay

0 Пользователей и 2 Гостей просматривают эту тему.

*

rellai

  • **
  • 58
  • +5/-0
    • Просмотр профиля
Re:Заказа в 1 клик
« Ответ #15 : 20 Мая 2014, 20:28:25 »
Так понял немного:
Прописал лабел
'error-required_one_click_list'		=> 'Заказ не оформлен, потому что не были заполнены обязательные поля: ',
Теперь показывается более правильно но не отображается, какие именно поля не заполнены. в отличии от теста
<error>
Заказ не оформлен, потому что не были заполнены обязательные поля:
</error>
« Последнее редактирование: 20 Мая 2014, 21:25:58 от rellai »

*

rellai

  • **
  • 58
  • +5/-0
    • Просмотр профиля
Re:Заказа в 1 клик
« Ответ #16 : 20 Мая 2014, 21:41:20 »
вот тут косяк
throw new publicException(getLabel('error-required_one_click_list') . $dataModule->assembleErrorFields($errors));
в $dataModule->assembleErrorFields($errors) - пусто

вот заполнение
	$dataModule = cmsController::getInstance()->getModule('data');
$errors = $dataModule->checkRequiredFields($form->getId());


Ура заменил папку в classes Data из тестового юми и все заработало....
всмысле вернуло правильную ошибку ))
Заказ не оформлен, потому что не были заполнены обязательные поля: Фамилия, Имя, E-mail, Телефон
« Последнее редактирование: 20 Мая 2014, 21:47:41 от rellai »

*

rellai

  • **
  • 58
  • +5/-0
    • Просмотр профиля
Re:Заказа в 1 клик
« Ответ #17 : 23 Мая 2014, 07:43:09 »
Чего то не могу понять почему шаблон не применяется для этой формы:
пишу в шаблоне object.xsl
<xsl:apply-templates select="document('udata://data/getCreateForm/126')/udata" /> </xsl:template> 
и прописываю для него шаблон:
<xsl:variable name="customer-info" select="document(concat('uobject://', document('udata://users/auth')/udata/user_id))" />
<xsl:variable name="customer-email" select="$customer-info//group[@name = 'idetntify_data']/property[@name = 'e-mail']/value" />   

<xsl:template match="getCreateForm">
<div class="content">
<form class="buyer_data" enctype="multipart/form-data" method="post" action="/{udata/group/@lang}/emarket/getOneClickOrder/">
<xsl:apply-templates select="udata/group/field" />
</form>
</div>
</xsl:template>

<xsl:template match="field">
 
<div>
<label>
<xsl:if test="@required">
<xsl:attribute name="class">required</xsl:attribute>
</xsl:if>
<span>
<xsl:value-of select="@title" /><xsl:if test="@required"><xsl:text>*</xsl:text></xsl:if>:
</span>
<input type="text" class="textinputs" name="data[new][{@name}]">
<xsl:variable name="inputName" select="@name" />
<xsl:if test="@required">
<xsl:attribute name="required">required</xsl:attribute>
</xsl:if>
<xsl:choose>
<xsl:when test="$customer-info//object/@type-guid = 'users-user' and $inputName = 'email'">
<xsl:attribute name="value"><xsl:value-of select="$customer-email"/></xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="value"><xsl:value-of select="$customer-info//property[@name = $inputName]/value"/></xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</input>
</label>
</div>
</xsl:template>

А он не применяется...понять не могу почему...
Может кто знает?


*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Заказа в 1 клик
« Ответ #18 : 23 Мая 2014, 09:42:39 »
ваш вызов
<xsl:apply-templates select="document('udata://data/getCreateForm/126')/udata" /> </xsl:template> 

вернет xml вида
<udata module="data" method="getCreateForm" generation-time="0.009103">
 <group name="group_1" title="Первая группа полей">
   <field name="field_1_1" title="Первое поле" ... и другие атрибуты ... />
   <field name="field_1_2" title="Первое поле" ... и другие атрибуты ... />
   <field name="field_1_3" title="Первое поле" ... и другие атрибуты ... />
    ... и другие поля ...
 </group>
 <group name="group_2" title="Вторая группа полей">
   <field name="field_2_1" title="Первое поле" ... и другие атрибуты ... />
   <field name="field_2_2" title="Первое поле" ... и другие атрибуты ... />
   <field name="field_2_3" title="Первое поле" ... и другие атрибуты ... />
    ... и другие поля ...
 </group>

  ... и другие группы полей ...

</udata>

и начинать обрабатывать его надо шаблоном с другим match
<xsl:template match="udata[@method='getCreateForm']">
....
</xsl:template>

*

rellai

  • **
  • 58
  • +5/-0
    • Просмотр профиля
Re:Заказа в 1 клик
« Ответ #19 : 23 Мая 2014, 10:46:24 »
вот xml
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="data" method="getCreateForm" generation-time="0.011625">
<group name="personal" title="Персональные данные">
<field name="lname" title="Фамилия" field_id="180" input_name="data[new][lname]" type="string" id="180" required="required"/>
<field name="fname" title="Имя" tip="Это поле содержит Имя пользователя. Оно отображается в характеристиках пользователя и может быть изменено самим пользователем." field_id="181" input_name="data[new][fname]" type="string" id="181" required="required"/>
<field name="father_name" title="Отчество" field_id="182" input_name="data[new][father_name]" type="string" id="182"/>
<field name="email" title="E-mail" field_id="209" input_name="data[new][email]" type="string" id="209" required="required"/>
<field name="phone" title="Телефон" field_id="440" input_name="data[new][phone]" type="string" id="440" required="required"/>
</group>
</udata>

match не сработал

попробовал в вызове тоже применить
Цитировать
<xsl:apply-templates select="document('udata://data/getCreateForm/126')/udata[@method = 'getCreateForm']" />
все тож самое
« Последнее редактирование: 23 Мая 2014, 10:55:46 от rellai »

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Заказа в 1 клик
« Ответ #20 : 23 Мая 2014, 10:58:06 »
match не сработал

вы уверенны что он  не сработал? или что у вас сработал первый template? а сами поля не появились?

Так как в вашем примере дальше еще есть ошибки с match

например
<xsl:apply-templates select="udata/group/field" />
должен превратиться в
<xsl:apply-templates select="group/field" />

Для полной уверенности что проблема именно в вызове, попробуйте такую вставку:

вызов
<xsl:apply-templates select="document('udata://data/getCreateForm/126')/udata" mode="test" /> 

шаблон
<xsl:template match="udata[@method='getCreateForm']">
вывод успешно произведен
</xsl:template>

*

rellai

  • **
  • 58
  • +5/-0
    • Просмотр профиля
Re:Заказа в 1 клик
« Ответ #21 : 23 Мая 2014, 11:22:21 »
в общем заработало когда  mode у обоих прописал если убрать то перестает работать.
Спасибо большое за подсказку!!
а почему только с mode работает?

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Заказа в 1 клик
« Ответ #22 : 23 Мая 2014, 11:45:44 »
значит, у вас есть где-то еще один шаблон, который подходит и перекрывает данный вызов

*

rellai

  • **
  • 58
  • +5/-0
    • Просмотр профиля
Re:Заказа в 1 клик
« Ответ #23 : 24 Июня 2014, 13:17:07 »
Спасибо :)
В общем я все сделал единственное что не приходит письмо с подтверждением заказа что нужно прописать?

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Заказа в 1 клик
« Ответ #24 : 24 Июня 2014, 22:17:52 »
возможно, письмо отправлялось по какому-то event который вы не перенесли.

Нет под рукой кода с функцией /emarket/getOneClickOrder/ поэтому точнее не могу подсказать.

*

rellai

  • **
  • 58
  • +5/-0
    • Просмотр профиля
Re:Заказа в 1 клик
« Ответ #25 : 25 Июня 2014, 08:08:20 »
вот функции::
		/**
* Оформление заказа в 1 клик
* @param bool $itemType
* @param bool $elementId
* @return array
* @throws publicException
*/
public function getOneClickOrder($itemType = false, $elementId = false) {
$params = array();
      $customer = customer::get();
$types = umiObjectTypesCollection::getInstance();
$form = $types->getTypeByGUID('emarket-purchase-oneclick');

$dataModule = cmsController::getInstance()->getModule('data');
$errors = $dataModule->checkRequiredFields($form->getId());
if ($errors !== true) {
throw new publicException(getLabel('error-required_one_click_list') . $dataModule->assembleErrorFields($errors));
}

$errors = $this->validOneClickInfo();

if (count($errors) > 0) {
return $errors;
}

if ($itemType && $elementId) {
$_REQUEST['no-redirect'] = 1;
$this->basket('put', 'element', $elementId);
}
$order = self::getBasketOrder();

$this->saveOneClickInfo($order);

if ($order->getTotalAmount() < 1) {
throw new publicException('%error-market-empty-basket%');
}

$order->setValue('order_date', time());
$numOrder = $order->generateNumber();
$order->setOrderStatus('waiting');
$order->commit();
$params['orderId'] = $numOrder;

return $params;
}

/**
* Валидация данных о покупателе в 1 клик
* @return array
*/
public function validOneClickInfo() {
$dataForm = getRequest('data');
$emarketOneClick = umiObjectTypesCollection::getInstance()->getTypeByGUID('emarket-purchase-oneclick');

$errors = array();
foreach ($emarketOneClick->getAllFields() as $field) {
$value = $dataForm['new'][$field->getName()];

if($restrictionId = $field->getRestrictionId()) {
$restriction = baseRestriction::get($restrictionId);
if($restriction instanceof baseRestriction) {
if($restriction instanceof iNormalizeInRestriction) {
$value = $restriction->normalizeIn($value);
}

if($restriction->validate($value) == false) {
$fieldTitle = $field->getTitle();

$errstr = getLabel('error-wrong-field-value');
$errstr .=  " \"{$fieldTitle}\" - " . $restriction->getErrorMessage();

$errors['nodes:error'][] = $errstr;
}
}
}

if (count($errors) > 0) {
return $errors;
}
}
}

/**
* Сохранение информации о покупателе, совершившем заказ в 1 клик
* @param $order
* @return array
*/
public function saveOneClickInfo($order) {
$dataForm = getRequest('data');
$objects = umiObjectsCollection::getInstance();

$emarketOneClick = umiObjectTypesCollection::getInstance()->getTypeByGUID('emarket-purchase-oneclick');
$objectId = $objects->addObject($order->getName(), $emarketOneClick->getId());
$object = $objects->getObject($objectId);
 
foreach ($emarketOneClick->getAllFields() as $field) {
$value = $dataForm['new'][$field->getName()];
$object->setValue($field->getName(), $value);
}
  $object->commit();
     
if (!customer::get()->isFilled()) {
foreach ($emarketOneClick->getAllFields() as $field) {
$value = $dataForm['new'][$field->getName()];
customer::get()->setValue($field->getName(), $value);
}
}

$order->setValue('purchaser_one_click', $objectId);
$order->commit();

return;
}

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Заказа в 1 клик
« Ответ #26 : 25 Июня 2014, 09:42:04 »
тут ничего нет кроме изменения статуса заказа, и наверняка на него повешено событие... посмотрите в файле /classes/modules/emarket/events.php или /classes/modules/emarket/custom_events.php событие order-status-changed и посмотрите перенесена ли функция для данного события

*

rellai

  • **
  • 58
  • +5/-0
    • Просмотр профиля
Re:Заказа в 1 клик
« Ответ #27 : 26 Июня 2014, 10:09:22 »
вот в файле events.php
new umiEventListener('order-status-changed', 'events', 'onEmarketOrderAdded');

а вот в файле __events_handlers.php
	public function onEmarketOrderAdded(iUmiEventPoint $event) {
if ($event->getMode() == "after" && $event->getParam("old-status-id") != $event->getParam("new-status-id")) {

if ($event->getParam("new-status-id") == order::getStatusByCode('waiting') && $event->getParam("old-status-id") != order::getStatusByCode('editing')) {
$module = cmsController::getInstance()->getModule('emarket');
$order = $event->getRef("order");
$link = $module->getObjectEditLink($order->getId(), 'order');
$this->registerEvent('emarket-order-add', array($link, $order->getName()), null, $order->getId());
}
}
}

то-есть вроде все есть...
при обычном оформлении заказа все отправляется
при заказе в 1 клик нет...

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Заказа в 1 клик
« Ответ #28 : 26 Июня 2014, 12:14:43 »
не похоже, что это то? что вам надо, но тут уже много может быть вариантов, вы же сейчас миксуете код с разных примеров, что у вас там есть, а что должно быть сложно сказать.
« Последнее редактирование: 26 Июня 2014, 23:34:44 от admin »

*

rellai

  • **
  • 58
  • +5/-0
    • Просмотр профиля
Re:Заказа в 1 клик
« Ответ #29 : 26 Июня 2014, 15:18:05 »
ну вот адрес доставки я взял со стандартного демодизи...
а можете сказазать где вызывается 'order-status-changed' в коде я догнать не могу...