Модифицировать состав заказа #ORDER_LIST# в почтовом событии "Новый заказ"

Если вы хотите как-то по особенному сверстать состав заказа в почтовом уведомлении 1С-Битрикс "Новый заказ", у вас это не получится, так как переменная ORDER_LIST формируется в модуле sale.order.ajax. Само собой, можно пойти по пути наименьшего сопротивления, изменить компонент заказа. Но есть способ проще и гибче.

Итак: В почтовом событии "Новый заказ", нам доступен ряд переменных. Одной из которых является #ORDER_LIST#

В этой переменной отдается состав заказа, при этом вы не сможете ни как красиво оформить этот список. Он передается одним сплошным массивом из компонента sale.order.ajax. Если вы захотите разделить его на составляющие, придется либо модифицировать компонент, само собой, предварительно вынеся его в свое пространство имен и лишиться обновлений данного компонента. Придется поддерживать его самоcтоятельно

Перехватываем событие формирования письма.

Но. мы можем просто перехватить событие, формирования письма, подмешать в него свои данные и отправить дальше. Для этого используем событие OnOrderNewSendEmail

Создаем событие в файле /local/php_iterface/init.php. Подсказки по коду прямо в нем

//СОБЫТИЕ
AddEventHandler("sale", "OnOrderNewSendEmail", "ModifyOrderSaleMails");
function ModifyOrderSaleMails($orderID, &$eventName, &$arFields)
{
   if(CModule::IncludeModule("sale") && CModule::IncludeModule("iblock"))
   {
 //СОСТАВ ЗАКАЗА РАЗБИРАЕМ SALE_ORDER НА ЗАПЧАСТИ
      $strOrderList = "";
      $dbBasketItems = CSaleBasket::GetList(
                 array("NAME" => "ASC"),
                 array("ORDER_ID" => $orderID),
                 false,
                 false,
                 array("PRODUCT_ID", "ID", "NAME", "QUANTITY", "PRICE", "CURRENCY")
               );
while ($arProps = $dbBasketItems->Fetch())
 {
 //ПЕРЕМНОЖАЕМ КОЛИЧЕСТВО НА ЦЕНУ
      $summ = $arProps['QUANTITY'] * $arProps['PRICE'];
 //СОБИРАЕМ В СТРОКУ ТАБЛИЦЫ
      $strCustomOrderList .= "<tr><td>".$arProps['NAME']."</td><td>".$arProps['QUANTITY']."</td><td>".$arProps['PRICE']."</td><td>".$arProps['CURRENCY']."</td><td>".$summ."</td><tr>";
 }
 //ОБЪЯВЛЯЕМ ПЕРЕМЕННУЮ ДЛЯ ПИСЬМА
 $arFields["ORDER_TABLE_ITEMS"] = $strCustomOrderList; 

}

Вот и все. Мы создали новую переменную #ORDER_TABLE_ITEMS# для письма, в которую можем подмешивать любые данные, в моем случае просто строка таблицы. Которую можно красиво стилизовать.

Само собой, вы можете создать несколько переменных с отдельными данным, если нужно сильно разнести состав заказа по письму. Вот так:

while ($arProps = $dbBasketItems->Fetch())
 {
  //ДРОБИМ НА ЗАПЧАСТИ
  $name = $arProps['NAME'];
  $quantity = $arProps['QUANTITY'];
  $price = $arProps['PRICE'];
  $currency = $arProps['CURRENCY'];
  $summ = $arProps['QUANTITY'] * $arProps['PRICE'];
 }
  //ОБЪЯВЛЯЕМ НОВЫЕ ПЕРМЕННЫЕ ДЛЯ ПИСЬМА
  $arFields["NAME_ITEM"] = $name;
  $arFields["QUANTITY_ITEM"] = $quantity;
  $arFields["PRICE_ITEM"] = $price;
  $arFields["CURRENCY_ITEM"] = $currency;
  $arFields["SUMM_ITEM"] = $sum;

И в принципе, перехватывая данное письмо, можно добавлять любые данные в письмо. От данных плательщика, местоположения, телефона итд. Тех переменных которых нет в типовом шаблоне письма

Таким образом и сделали что хотели, и не "поломали" компонент оформления заказа

Добавлено: Вывести в почтовое событие данные из свойств заказа

Если нужно добавить в почтовое событие любые данные из свойств заказа. Например: Номер телефона, адрес доставки, местоположение. В общем, что угодно. Можно добавить вот таткой обработчик:

AddEventHandler("sale", "OnOrderNewSendEmail", "bxModifySaleMails");
function bxModifySaleMails($orderID, &$eventName, &$arFields)
{ $additional_information = ''; $arOrder = CSaleOrder::GetByID($orderID); $order_props = CSaleOrderPropsValue::GetOrderProps($orderID); while ($arProps = $order_props->Fetch()){ //контактный телефон if ($arProps['ORDER_PROPS_ID']==3){ $additional_information.='Контактный телефон: '.$arProps['VALUE']; } //Адрес if ($arProps['ORDER_PROPS_ID']==7){ $additional_information.='Адрес доставки: '.$arProps['VALUE']; } } $arFields["ADD_INFORMATION"] = $additional_information;
}

Просто перечисляете все необходимые свойства (их ID) в блоке

 if ($arProps['ORDER_PROPS_ID']==3){
$additional_information.='Контактный телефон:'.$arProps['VALUE']; }

В итоге, все собирается в #ADD_INFORMATION# - эту переменную и вставляем в нужном месте тела письма "Новый заказ"

Все заметки
Уважаемый читатель! В связи с участившимся спамом в комментариях, возможность писать доступна только для зарегистрированных пользователей

Зарегистрироваться Войти
Напомнить пароль

Быстрая регистрация через соц.сеть:
Александр Цыганов
Приветствую тебя о сэнсэй платформы 1с Битрикс!  ;)  
Прошу помочь мне с файлом init.php
Не могу вывести что бы в почтовом событии отгружался артикул на почту.
вот код (ну и вдруг кому прегодиться):
Код
<?php
//-- Добавление обработчика события
AddEventHandler("sale", "OnOrderNewSendEmail", "bxModifySaleMails");
//-- Собственно обработчик события
function bxModifySaleMails($orderID, &$eventName, &$arFields)
{
  $arOrder = CSaleOrder::GetByID($orderID);
  
  //-- получаем телефоны и адрес
  $order_props = CSaleOrderPropsValue::GetOrderProps($orderID);
  $phone="ORDER_PROP_41";
  $index = "";
  $country_name = "";
  $city_name = "ORDER_PROP_40";  
  $address = "ORDER_PROP_45";
  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;  
}
Заранее Огромное спасибо!!!
Мир и процветание этому Блогу! ;)
Александр Цыганов
вот код свойства Артикул: CML2_ARTICLE вот ID свойства артикул: 129 и вот ID инфоблока каталога: 22
Михаил Базаров
Цитата
Александр Цыганов пишет:
AddEventHandler("sale", "OnOrderNewSendEmail", "ModifyOrderSaleMails"  ;)  ;
Вот так. Взято на форуме битрикса. Быстро ж нашлось :D  Тупо яндексом
Array("CODE"=>"ARTICLE")); - сюда подставить код свойства "Артукул" у тебя
Код
AddEventHandler("sale", "OnOrderNewSendEmail", "bxModifySaleMails");
function bxModifySaleMails($orderID, &$eventName, &$arFields)
{
   if(CModule::IncludeModule("sale") && CModule::IncludeModule("iblock"))
   {
      $strOrderList = "";
      $dbBasketItems = CSaleBasket::GetList(
                 array("NAME" => "ASC"),
                 array("ORDER_ID" => $orderID),
                 false,
                 false,
                 array("PRODUCT_ID", "ID", "NAME", "QUANTITY", "PRICE", "CURRENCY")
               );
      while ($arBasketItems = $dbBasketItems->Fetch())
      {
         $product_article = "";
         $article_find = CIBlockElement::GetProperty($IBLOCK_ID, $arBasketItems["PRODUCT_ID"], array(), Array("CODE"=>"ARTICLE"));
         if($article_value = $article_find->Fetch())
            $product_article = $article_value["VALUE"];
         $strOrderList .= $product_article.' - '.$arBasketItems["ID"]." - ".$arBasketItems["NAME"]." - ".$arBasketItems["QUANTITY"]." ".GetMessage("SOA_SHT").": ".SaleFormatCurrency($arBasketItems["PRICE"], $arBasketItems["CURRENCY"]);
         $strOrderList .= "\n";
      }
      $arFields["ORDER_LIST"] = $strOrderList;
   }
   return true;
}
Борис Евстратов
Здравствуйте! А не посоветуете каким образом можно подрегулировать/убрать десятичные нули в столбце "Цена" а то вылезает 1234.0000 руб.
Спасибо большое!
Михаил Базаров
Цитата
Борис Евстратов написал:
Здравствуйте! А не посоветуете каким образом можно подрегулировать/убрать десятичные нули в столбце "Цена" а то вылезает 1234.0000 руб.
Спасибо большое!
Из топорного метода- использовать регулярное выражение php
Из нормального- проверить модуль валют, какой там формат.
Борис Евстратов
Михаил Базаров, подскажете как настраивать стили таблицы? В int.php, как я понял, не получится назначить — сайт тогда падает.
А от , который присутствует в письме, почему-то стили не наследуются.
Большое спасибо!
Константин Лазарашвили
Цитата
Борис Евстратов пишет:
Михаил Базаров , подскажете как настраивать стили таблицы? В int.php, как я понял, не получится назначить — сайт тогда падает.
А от , который присутствует в письме, почему-то стили не наследуются.
Большое спасибо!
Михаил, так же интересует этот вопрос. Не получается сделать таблицу
u740928@mail.ru
Очень полезная статья!!! Все сделал и работает, кроме Платежной системы..да пока не до неё)(много чем дополнил данный код) АВТОРУ РЕСПЕКТ!. А вот помогите разобраться с Адресом доставки. У меня есть Автоматизированные службы доставки они используют поле "Адрес доставки" у меня туда падает "Адрес". А вот я создал для Курьерской поля Улица, дом, корпус, квартира. Как мне их вычлинить((( как только не пробывал. Читаю про класс CSaleOrderPropsValue::GetOrderProps там есть пример, он мне выводит Информацию о доставки как "Адрес доставки" так и мои поля (ул д к к) как эти поля вывести в заказ((( помогите.
u740928@mail.ru
Вопрос по доп полям закрыт (сам тупанул вообще не так логику выстроил) победил эти поля. А вот как сделать вдруг поможете. Если Автоматизированная служба доставки заполняет мне (автоматом (стоит модуль Boxberry) "Адрес доставки", а курьерская заполняет "мои поля"(ул. дом. кор. кв.), как сделать условие какое именно значение брать "Адрес доставки" или "мои поля" при выборе службы доставки? Т.е. Покупатель выбрал Курьерскую доставку и заполнил поля в письмо должны попасть "мои поля". А другой выбрал Автоматизированную (Boxberry) там заполняются "Адрес доставки" в письме выводить их.?
Михаил Базаров
Цитата
u740928@mail.ru написал:
Вопрос по доп полям закрыт (сам тупанул вообще не так логику выстроил) победил эти поля. А вот как сделать вдруг поможете. Если Автоматизированная служба доставки заполняет мне (автоматом (стоит модуль Boxberry) "Адрес доставки", а курьерская заполняет "мои поля"(ул. дом. кор. кв.), как сделать условие какое именно значение брать "Адрес доставки" или "мои поля" при выборе службы доставки? Т.е. Покупатель выбрал Курьерскую доставку и заполнил поля в письмо должны попасть "мои поля". А другой выбрал Автоматизированную (Boxberry) там заполняются "Адрес доставки" в письме выводить их.?
Можно попробовать (но надо пробовать, не гарантирую успех) навесить условие на ID службы доставки
Типа алгоритма:

Если ID доставки = 12
  Исполняем такой код
Если ID доставки = 13
  Исполняем другой код
u740928@mail.ru
Это хорошая идея! Но надо не забыть если поменялся ID в код внести изменения. Вот с чем ещё столкнулся: у установленных модулей автоматизированной службы доставки отсутствует "NAME"
$arDeliv = CSaleDelivery::GetByID($arOrder["DELIVERY_ID"] ;) ;  $delivery_name = "";  if ($arDeliv)  {    $delivery_name = $arDeliv["NAME"];  } Изыскал проверяю вывод а он мне по ID выплевывает ПУСТОТУ. Если обычная, то есть не модуль, то всё гуд.
u740928@mail.ru
Уточнение если обычная служба доставки (например  Курьерская у неё  [DELIVERY_ID] => 1
А если модуль то у неё  [DELIVERY_ID] => ems:elivery (EMS), [DELIVERY_ID] => boxberry:PVZ_COD (Boxberry) ((( вот тут грабли(
mtsub
Цитата
Вот так. Взято на форуме битрикса. Быстро ж нашлось  Тупо яндексом
Array("CODE"=>"ARTICLE"  ;)  ); - сюда подставить код свойства "Артукул" у тебя
- это работает для товарных предложений ARTICLE, если товар CML2_ARTICLE не имеет торг. предложения - не работает.

© 2011—2017 Частный вебмастер: ИП Базаров, ОГРНИП: 315784700173692. Работает на 1С-Битрикс.

Копирование материалов запрещено: "ГК РФ, часть 4, раздел VII: Права на результаты интеллектуальной деятельности".

Информация размещенная на сайте, не является публичной офертой.
Политика конфеденциальности