Телеграм: @bazarow_ru Почта: mihail@bazarow.ru

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

Просмотров: 30311

Если вы хотите как-то по особенному сверстать состав заказа в почтовом уведомлении 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# - эту переменную и вставляем в нужном месте тела письма "Новый заказ"

u740928@mail.ru 18.10.2017
Выглядит примерно так :

Михаил Базаров 18.10.2017
Цитата
u740928@mail.ru написал:
Выглядит примерно так :
Если правильно понял, это какой-то отдельный модуль из маркетплейса? Тут, только узнавать у поставщика модуля. Напишите им в ТП
u740928@mail.ru 19.10.2017
Да это походу модуль, который встроен в готовый шаблон (АСПРО-ОПТИМУС) задал вопрос жду ответа. Спасибо.
Александр Жулин 24.10.2017
Цитата
u740928@mail.ru пишет:
Да это походу модуль, который встроен в готовый шаблон (АСПРО-ОПТИМУС) задал вопрос жду ответа. Спасибо.
Поправил в их шаблоне. Вот они пипы... 2000 руб за 1 строчку в коде!
Михаил Базаров 24.10.2017
Цитата
Александр Жулин написал:
Цитата
u740928@mail.ru  пишет:
Да это походу модуль, который встроен в готовый шаблон (АСПРО-ОПТИМУС) задал вопрос жду ответа. Спасибо.
Поправил в их шаблоне. Вот они пипы... 2000 руб за 1 строчку в коде!
В этом суть, почти всех готовых решений  ;)
mtsub 08.02.2018
Цитата
Александр Жулин написал:
Цитата
u740928@mail.ru  пишет:
Да это походу модуль, который встроен в готовый шаблон (АСПРО-ОПТИМУС) задал вопрос жду ответа. Спасибо.
Поправил в их шаблоне. Вот они пипы... 2000 руб за 1 строчку в коде!
- что именно поправили, можете код выложить?
Вячеслав 13.08.2019
Цитата
Михаил Базаров пишет:
Цитата
Александр Жулин написал:
Цитата
u740928@mail.ru пишет:
Да это походу модуль, который встроен в готовый шаблон (АСПРО-ОПТИМУС) задал вопрос жду ответа. Спасибо.
Поправил в их шаблоне. Вот они пипы... 2000 руб за 1 строчку в коде!
В этом суть, почти всех готовых решений
Исправить строчку кода - 10 руб.
Знать где исправить - 1990 руб.
Вот в этом вся суть  ;)
Игорь Гриценко 22.09.2020
Цитата
Михаил Базаров пишет:
[QUOTE][URL=/club/user/1030/]Александр Цыганов[/URL] пишет:
AddEventHandler("sale", "OnOrderNewSendEmail", "ModifyOrderSaleMails"     ;[/QUOTE] Вот так. Взято на форуме битрикса. Быстро ж нашлось    Тупо яндексом
Array("CODE"=>"ARTICLE")); - сюда подставить код свойства "Артукул" у тебя
[CODE] 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;
} [/CODE]
Уже все перепробовал, но это работает только для товарных предложений ARTICLE, если товар CML2_ARTICLE не имеет торг. предложения - не работает. Возможно у кого-то получилось настроить вывод артикула у простого товара в почтовый шаблон. Заранее спасибо!
Константин 11.12.2021
Здравствуйте!

Спасибо за статью! Подскажите, как подтянуть единицу измерения товара? Например, есть упаковка кофе 500гр, есть 1000гр. Нужно подставлять рядом с количеством товара единицу измерения.

Спасибо!
Константин 12.12.2021
Если необходимо добавить единицу измерения товара, можно сделать так:
$measure = \Bitrix\Catalog\ProductTable::getCurrentRatioWithMeasure($arProps['PRODUCT_ID']);

В нужное место: $measure[$arProps['PRODUCT_ID']]['MEASURE']['SYMBOL_RUS']

Записная книжка разработчика

Примерно с 2013-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Удалить товары из корзины, если есть определенные товары. Просмотров: 1915 Задача: если в корзину добавлены товары с определенным свойством, нужно удалить из корзины... Следующая/предыдущая новость/статья при просмотре подробной в Битрикс Просмотров: 18287 Дизайн создается только для наглядного и удобного предоставления содержимого сайта, пользо... Снять ограничение на количество символов в комментарии к заказу магаз... Просмотров: 12607 Как многим известно, в интернет-магазине на Битрикс имеется ограничение на количество симв... Установить остатки товара на складе из доступных остатков. Просмотров: 6229 Задача, заполнить остатки товаров, в 1С-Битрикс, из параметра "Доступное количество". Сортировка элементов по индексу сортировки значений типа список Просмотров: 11592 Внутри любого компонента есть заранее заложенные поля для сортировки элементов. МОжно сорт... Автоматическая загрузка каталогов из csv файлов в Битрикс Просмотров: 11797 Если требуется настроить автоматический импорт каталогов из csv файлов, от поставщиков. В... Если товар в корзине, поменять кнопку на "В корзине" в новом шаблоне ... Просмотров: 1769 Ранее я уже делал заметку на эту тему. Тогда, мы меняли значение input-а при добавлении то... Самодельная форма добавления элемента на API Битрикс Просмотров: 45279 Компонент iblock.element.add.form написан таким образом, что вы не сможете (не попотев изр... Ссылки для добавления и удаления товара из сравнения в Битрикс Просмотров: 8715 Просто оставляю это здесь, вставка ссылок на добавление и удаление товара из сравнения, ес... Открытие мобильного приложения Apache Cordova по ссылке Просмотров: 1187 Достаточно часто нужно реализовывать открытие мобильного приложения по ссылке. Например: п... AJAX корзина с отправкой количества из раздела каталога Просмотров: 20154 Столкнулся с задачкой: нужно было на одном сайте реализовать интерактивный прайс лист. При... Заполнение габаритов товара, после обмена с 1С, из свойств элемента и... Просмотров: 11821 Если Ваш интернет-магазин интегрирован с 1С, скорее всего столкнулись с такой проблемой: 1... Fancybox в стандартном шаблоне детальной карточки товара, вместо вспл... Просмотров: 105 Задача: заменить работу с изображениями в стандартном или кастомном шаблоне детальной карт... Добавление и удаление из сравнения на AJAX: Битрикс Просмотров: 18759 Рецепт лежал у меня в закромах, почти о нем и забыл, но тут подвернулся под руку- решил оп... Быстрая отписка от всех рассылок модуля "E-mail маркетинг", в кабинет... Просмотров: 277 Задача: дать пользователям возможность отписаться от всех рассылок "E-mail маркетинга", не... Правильное подключение стилей и скриптов в Битрикс Просмотров: 85235 Есть несколько способов подключения файлов стилей и скриптов, при верстке шаблонов в систе... Свойство: привязка к Яндекс:Картам - вывести из нескольких элементов ... Просмотров: 18668 Предположим, что у вас есть инфоблок со свойством "Привязка к яндекс картам". В этом инфоб... Массово: применить наценку ко всем товарам каталога с пересчетом от б... Просмотров: 6372 Рассмотрим как, в магазине работающем на 1С-битрикс, массово применить наценку на все това... Сравнение двух типов цен для иммитации системы скидок, в Битрикс Просмотров: 6820 Встала задачка, иммититровать систему скидок в интернет магазине на Битрикс. Из 1С-УТ, на ... Определить местоположение пользователя и показать магазины поблизости... Просмотров: 1831 Задача: в мобильном приложении, которое открывает сайт на 1С-Битрикс внутри себя, нужно оп...