вторник, 21 августа 2012 г.

Bitrix - Дополнительные поля в почтовом уведомлении о новом заказе

Задача: добавить поля "комментарий киента к заказу", "телефон", "название службы доставки", "название способа оплаты", "полный адрес клиента" в шаблон письма-уведомления о новом заказе

Идея решения:
1. Добавляем новые поля в шаблон почтового события SALE_NEW_ORDER.
Поля добавляем в текст шаблона в виде
#<имя поля>#

2. Добавляем в систему обработчик события "перед отправкой почтового уведомления о новом заказе".
3. В обработчике события заполняем добавленные в шаблон поля

Решение
Шаг 1. Шаблон SALE_NEW_ORDER

В шаблон добавил такой текст

...
Контактный телефон: #PHONE#
Комментарий:
#ORDER_DESCRIPTION#
Служба доставки: #DELIVERY_NAME#
Способ оплаты: #PAY_SYSTEM_NAME#
Адрес доставки: #FULL_ADDRESS#
...

Шаги 2 и 3. Код

в /bitrix/php_interface/init.php

вписал такой код
Код
//-- Добавление обработчика события

AddEventHandler("sale", "OnOrderNewSendEmail", "bxModifySaleMails");

//-- Собственно обработчик события

function bxModifySaleMails($orderID, &$eventName, &$arFields)
{
  $arOrder = CSaleOrder::GetByID($orderID);
  
  //-- получаем телефоны и адрес
  $order_props = CSaleOrderPropsValue::GetOrderProps($orderID);
  $phone="";
  $index = ""; 
  $country_name = "";
  $city_name = "";  
  $address = "";
  while ($arProps = $order_props->Fetch())
  {
    if ($arProps["CODE"] == "PHONE")
    {
       $phone = htmlspecialchars($arProps["VALUE"]);
    }
    if ($arProps["CODE"] == "LOCATION")
    {
        $arLocs = CSaleLocation::GetByID($arProps["VALUE"]);
        $country_name =  $arLocs["COUNTRY_NAME_ORIG"];
        $city_name = $arLocs["CITY_NAME_ORIG"];
    }

    if ($arProps["CODE"] == "INDEX")
    {
      $index = $arProps["VALUE"];   
    }

    if ($arProps["CODE"] == "ADDRESS")
    {
      $address = $arProps["VALUE"];
    }
  }

  $full_address = $index.", ".$country_name."-".$city_name.", ".$address;

  //-- получаем название службы доставки
  $arDeliv = CSaleDelivery::GetByID($arOrder["DELIVERY_ID"]);
  $delivery_name = "";
  if ($arDeliv)
  {
    $delivery_name = $arDeliv["NAME"];
  }

  //-- получаем название платежной системы   
  $arPaySystem = CSalePaySystem::GetByID($arOrder["PAY_SYSTEM_ID"]);
  $pay_system_name = "";
  if ($arPaySystem)
  {
    $pay_system_name = $arPaySystem["NAME"];
  }

  //-- добавляем новые поля в массив результатов
  $arFields["ORDER_DESCRIPTION"] = $arOrder["USER_DESCRIPTION"]; 
  $arFields["PHONE"] =  $phone;
  $arFields["DELIVERY_NAME"] =  $delivery_name;
  $arFields["PAY_SYSTEM_NAME"] =  $pay_system_name;
  $arFields["FULL_ADDRESS"] = $full_address;   
}



Полезные ссылки

Прототип кода взял из комментария к статье "Артикул в уведомлении о заказе" Спасибо автору
http://dev.1c-bitrix.ru/community/webdev/user/46046/blog/articles-in-the-notification-of-the-order/
События интернет-магазина
Тут помог раздел "События связанные с отправкой почтовых шаблонов"
http://dev.1c-bitrix.ru/api_help/sale/sale_events.php
Курс разработчика, раздел "Обработка событий"
http://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=46&LESSON_ID=2222
Документация для разработчика, раздел "Обработка событий"
http://dev.1c-bitrix.ru/api_help/main/general/technology/events.php
Тема форума "Обработка событий"
http://dev.1c-bitrix.ru/community/forums/forum6/topic28942/

1 комментарий:

  1. отличное решение, спасибо! Но CSaleLocation устарел с версии 14 и пол этому рецепту работает не всё (например, индекс и город не подтягиваются). Подскажите пож-та, чем можно заместить?
    Заранее благодарен,
    Глеб

    ОтветитьУдалить