UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: stud_mai от 04 Октября 2015, 16:01:22

Название: Проблемы уведомления клиента при смене статуса заказа и доставки
Отправлено: stud_mai от 04 Октября 2015, 16:01:22
Добрый день!

Имеется код, взятый с 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. При смене статуса доставки заказа на "Доставляется" почему-то подхватывается тот код, который предназначен для статуса заказа "Доставляется". Тоже интересно почему так?
Название: Re: Проблемы уведомления клиента при смене статуса заказа и доставки
Отправлено: admin от 01 Января 2016, 06:13:48
А что может содержаться в поле delivery_service_id?
И какой у данного поля тип данных?
Название: Re: Проблемы уведомления клиента при смене статуса заказа и доставки
Отправлено: stud_mai от 04 Января 2016, 23:58:11
А что может содержаться в поле 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>
  ....

Результат точь-в-точь
Название: Re: Проблемы уведомления клиента при смене статуса заказа и доставки
Отправлено: admin от 05 Января 2016, 00:05:47
Возможно, из-за того что у вас поле строка, 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 >
Название: Re: Проблемы уведомления клиента при смене статуса заказа и доставки
Отправлено: stud_mai от 05 Января 2016, 00:11:20
Спасибо за быстрый ответ, пока его не испытывал, зато сейчас для себя отметил странную штуку: если менять статус из модуля Интернет магазин / Заказы (где таблица со списком заказов), то условие выполняется, а если статус менять непосредственно из заказа (Интернет магазин / Редактирование заказа), то все работает. Почему интересно так??

Также остается открытым вопрос о том, почему при смене статуса доставки на "Доставляется" подхватывается тот код, который предназначен для статуса заказа "Доставляется".
Название: Re: Проблемы уведомления клиента при смене статуса заказа и доставки
Отправлено: admin от 05 Января 2016, 00:23:26
Также остается открытым вопрос о том, почему при смене статуса доставки на "Доставляется" подхватывается тот код, который предназначен для статуса заказа "Доставляется".

Ну у вас идет проверка в письме по текстовому названию статуса. Причем в переменной status может быть не только статус заказа, но и статус доставки, и статус оплаты. Так что, название статусов совпадают, изменение статусов вызывает один и тот же шаблон, вот он и срабатывает.
Название: Re: Проблемы уведомления клиента при смене статуса заказа и доставки
Отправлено: stud_mai от 05 Января 2016, 00:43:12
Понятно, я просто думал, что если уж в задаются такие значение статусов по умолчанию, то они как-то разделяются между собой. Интересно почему разработчики юми сразу их по разному не назвали?!

Кстати, предложенный вами метод работает, спасибо!
Название: Re: Проблемы уведомления клиента при смене статуса заказа и доставки
Отправлено: admin от 05 Января 2016, 00:59:01
Понятно, я просто думал, что если уж в задаются такие значение статусов по умолчанию, то они как-то разделяются между собой. Интересно почему разработчики юми сразу их по разному не назвали?!

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