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

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

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

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

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

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

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

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

Ответов: 3
Просмотров: 3803
Последний ответ 19 Декабря 2016, 12:29:09
от aghigay
Как в форму заказа в один шаг добавить свое поле адрес?

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

Ответов: 3
Просмотров: 2832
Последний ответ 03 Мая 2017, 23:21:19
от aghigay

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

*

stud_mai

  • *
  • 14
  • +0/-0
    • Просмотр профиля
Добрый день!

Имеется код, взятый с wiki.umisoft.ru, для отправки уведомлений с разным текстом при изменении статуса заказа и доставки:

<xsl:template match="status_notification">
    <br />
<xsl:text>Ваш заказ № </xsl:text>
<xsl:value-of select="order_number" />
<xsl:text> </xsl:text>
<xsl:choose>
<!-- Уведомления о статусе заказа -->
<xsl:when test="contains(status, 'поступил в обработку')">
был получен.
</xsl:when>
<xsl:when test="contains(status, 'отменён')">
был отменен.
</xsl:when>
<xsl:when test="contains(status, 'отклонён')">
был отклонен.
</xsl:when>
<xsl:when test="contains(status, 'доставляется')">
доставляется.
                <xsl:if test="document(concat('uobject://',order_id,'.delivery_service_id'))//value">
                                       <xsl:apply-templates select="document(concat('uobject://',order_id))/udata" mode="delivery_link" />     
                                </xsl:if>   
</xsl:when>
<xsl:when test="contains(status, 'готов')">
готов.
</xsl:when>
<xsl:when test="contains(status, 'принят')">
принят.
</xsl:when>
<xsl:when test="contains(status, 'оплачивается')">
оплачивается.
</xsl:when>
<xsl:when test="contains(status, 'редактируется')">
редактируется.
</xsl:when>
<!-- Уведомления о статусе оплаты -->
<xsl:when test="contains(status, 'ожидает оплаты')">
ожидает оплаты.
</xsl:when>
<xsl:when test="contains(status, 'оплачен')">
был оплачен.
</xsl:when>
<xsl:when test="contains(status, 'обновлен: оплата подтверждена')">
был обновлен, оплата подтверждена.
</xsl:when>
<xsl:when test="contains(status, 'обновлен: оплата отклонена')">
был обновлен, оплата отклонена.
</xsl:when>
<!-- Уведомления о статусе доставки -->
<xsl:when test="contains(status, 'ожидает отгрузки')">
ожидает отгрузки.
</xsl:when>
<xsl:when test="contains(status, 'доставляется')">
отправлен.
</xsl:when>
<xsl:when test="contains(status, 'доставлен')">
доставлен.
</xsl:when>
</xsl:choose>
<br/><br/>
<xsl:text>Посмотреть историю заказов и самостоятельно отслеживать этапы доставки заказа Вы можете в своем </xsl:text>
<a href="http://{domain}/users/login/">
<xsl:text>личном кабинете</xsl:text>
</a> в разделе <a href="http://{domain}/emarket/ordersList/" target="_blank"><xsl:text>"Мои заказы"</xsl:text></a>.<br />
</xsl:template>

Все работает нормально за исключением того момента, условие <xsl:if test="document(concat('uobject://',order_id,'.delivery_service_id'))//value"> в статусе "Доставляется" никак не обрабатывается, точнее как-будто test всегда = true, хотя это не так. Никак не могу понять в чем причина такого поведения? Может кто сталкивался с подобной ситуацией?

P.S. При смене статуса доставки заказа на "Доставляется" почему-то подхватывается тот код, который предназначен для статуса заказа "Доставляется". Тоже интересно почему так?

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
А что может содержаться в поле delivery_service_id?
И какой у данного поля тип данных?

*

stud_mai

  • *
  • 14
  • +0/-0
    • Просмотр профиля
А что может содержаться в поле delivery_service_id?
И какой у данного поля тип данных?

Вот такой вид поля delivery_service_id:
<property id="618" name="delivery_service_id" type="string">
<title>Идентификатор отслеживания</title>
<value>12291951MOW</value>
</property>
Я позаимствовал это условие из другой части сайта - из личного кабинета, где все прекрасно работает в том смысле, что если поле отсутствует, то ничего не выводится. Вот код от туда:
<xsl:if test="document(concat('uobject://',@id,'.delivery_service'))//value">
 <tr>
    <td>
        <xsl:text>Отслеживание заказа:</xsl:text>
    </td>
    <td>
        <xsl:apply-templates select="document(concat('uobject://',@id))/udata" mode="delivery_service" />     
     </td>
 </tr>
</xsl:if>
Хотя здесь используется поле delivery_service для условия, смысл не меняется, т.к. они оба взаимосвязаны: без одного из них желаемый результат в дальнейшем не достижим. Изначально я и с ним пробовал, результат аналогичный - условие выполняется(((

Вид поля delivery_service:
<property id="617" name="delivery_service" type="relation">
<title>Сервис доставки</title>
<value>
<item id="36165" name="DPD" type-id="250" ownerId="2" xlink:href="uobject://36165"/>
</value>
</property>

Тип данных создавался новый - Справочник для поля "Сервис доставки"

К слову сказать, также писал чуть по-другому условие:
<xsl:template match="status_notification">
 <xsl:variable name="order" select="document(concat('uobject://', order_id))/udata" />
 <br />
 <xsl:text>Ваш заказ № </xsl:text>
  ....
      <xsl:when test="contains(status, 'доставляется')">
доставляется.               
                <xsl:if test="$order//property[@name = 'delivery_service_id']/value">
Отследить ход доставки Вы можете на сайте
<xsl:apply-templates select="document(concat('uobject://',order_id))/udata" mode="delivery_link" />     
                </xsl:if>
  ....

Результат точь-в-точь

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Возможно, из-за того что у вас поле строка, value все равно выдается, даже несмотря на то что он пустой (в другом то примере тип поля "выпадающий список").
Попробуйте сделать такое условие
<xsl:variable name="delivery_service_id" select="document(concat('uobject://',order_id,'.delivery_service_id'))//value" />
<xsl:if test="$delivery_service_id and not($delivery_service_id='')">
     считаем, что в поле delivery_service_id есть какое-то значение
</xsl:if >

*

stud_mai

  • *
  • 14
  • +0/-0
    • Просмотр профиля
Спасибо за быстрый ответ, пока его не испытывал, зато сейчас для себя отметил странную штуку: если менять статус из модуля Интернет магазин / Заказы (где таблица со списком заказов), то условие выполняется, а если статус менять непосредственно из заказа (Интернет магазин / Редактирование заказа), то все работает. Почему интересно так??

Также остается открытым вопрос о том, почему при смене статуса доставки на "Доставляется" подхватывается тот код, который предназначен для статуса заказа "Доставляется".

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Также остается открытым вопрос о том, почему при смене статуса доставки на "Доставляется" подхватывается тот код, который предназначен для статуса заказа "Доставляется".

Ну у вас идет проверка в письме по текстовому названию статуса. Причем в переменной status может быть не только статус заказа, но и статус доставки, и статус оплаты. Так что, название статусов совпадают, изменение статусов вызывает один и тот же шаблон, вот он и срабатывает.

*

stud_mai

  • *
  • 14
  • +0/-0
    • Просмотр профиля
Понятно, я просто думал, что если уж в задаются такие значение статусов по умолчанию, то они как-то разделяются между собой. Интересно почему разработчики юми сразу их по разному не назвали?!

Кстати, предложенный вами метод работает, спасибо!

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Понятно, я просто думал, что если уж в задаются такие значение статусов по умолчанию, то они как-то разделяются между собой. Интересно почему разработчики юми сразу их по разному не назвали?!

А они их и назвали по разному, если говорить о коде статуса (некое англ наименование), а в письмо приходит просто русский вариант, который вы и используете в своих choose сравниваях. К тому же, в настройках модуля "интернет-магазин" есть возможность отключить отправку письма при смене статуса доставки, или при смене статуса оплаты, или при смене статуса заказа. Что позволяет не отправлять лишние уведомления клиенту.