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

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

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

mtsub 04.10.2017
концовка соот.
$arFields["ADD_INFORMATION"] = $additional_information;
Михаил Базаров 04.10.2017
Цитата
mtsub пишет:
концовка соот.
$arFields["ADD_INFORMATION"] = $additional_information;
if ($arProps['ORDER_PROPS_ID']==7) //Вместо 7 ID- вашего свойства с комментариями
{
     $additional_information.='Комментарий: '.$arProps['VALUE'];
}


Вот так
u740928@mail.ru 09.10.2017
Цитата
mtsub пишет:
как добавить комментарии?
$arOrder = CSaleOrder::GetByID($orderID);
if ($arOrder){
$order_comments = $arOrder['COMMENTS'];
}
$additional_information .='Комментарии: '.$order_comments.'<br />'
- не срабатывает, почему?
$arOrder = CSaleOrder::GetByID($orderID);
$comment = "";
if ($arOrder){
$comment = $arOrder["USER_DESCRIPTION"];
     }
$arFields["USER_DESCRIPTION"] = $comment;
mtsub 11.10.2017
Как в init.php передать в письмо артикул и ссылку на страницу(товар) при почтовых событиях "Новый быстрый заказ" и при "Заполнена web-форма" когда со страницы товара задан какой-то вопрос? Через событие "OnOrderNewSendEmail" уже знаю - как описано выше. А в других случаях "Новый быстрый заказ", "Заполнена web-форма"?
Михаил Базаров 12.10.2017
Цитата
mtsub написал:
Как в init.php передать в письмо артикул и ссылку на страницу(товар) при почтовых событиях "Новый быстрый заказ" и при "Заполнена web-форма" когда со страницы товара задан какой-то вопрос? Через событие "OnOrderNewSendEmail" уже знаю - как описано выше. А в других случаях "Новый быстрый заказ", "Заполнена web-форма"?
Новый быстрый заказ - это что за шаблон такой? Вообще не найду его
mtsub 12.10.2017
Цитата
Михаил Базаров пишет:
Цитата
mtsub написал:
Как в init.php передать в письмо артикул и ссылку на страницу(товар) при почтовых событиях "Новый быстрый заказ" и при "Заполнена web-форма" когда со страницы товара задан какой-то вопрос? Через событие "OnOrderNewSendEmail" уже знаю - как описано выше. А в других случаях "Новый быстрый заказ", "Заполнена web-форма"?
Новый быстрый заказ - это что за шаблон такой? Вообще не найду его
в моем случае так путь выглядит - \bitrix\templates\my_copy\components\bitrix\sale.basket.basket\template1\template.php
Игорь Гриценко 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 не имеет торг. предложения - не работает. Возможно у кого-то получилось настроить вывод артикула у простого товара в почтовый шаблон. Заранее спасибо!
Константин 12.12.2021
Если необходимо добавить единицу измерения товара, можно сделать так:
$measure = \Bitrix\Catalog\ProductTable::getCurrentRatioWithMeasure($arProps['PRODUCT_ID']);

В нужное место: $measure[$arProps['PRODUCT_ID']]['MEASURE']['SYMBOL_RUS']
Гость 27.09.2024
Михаил Базаров, Подскажите как вывести свойства товара, например цвет, размер и тд в шаблон письма?
Михаил Базаров 28.09.2024
Цитата
Гость написал:
Модифицировать состав заказа #ORDER_LIST# в почтовом событии "Новый заказ"
В PRODUCT_ID у нас ID товара, зная его получаем любую информацию об элементе с помощью CIBlockElement::GetList и вставляем в таблицу.
Рекомендую использовать именно стрый метод CIBlockElement::GetList - и код будет более читабельным и не сказать что сэкономите на производительности ощутимо.

Но если принципиально на D7 то попробуйте Bitrix\Iblock\PropertyTable

Блог-note: заметки разработчика

Основные функции вывода в шаблонах Битрикс

Знаю, что все их знают. Но иногда не бывает лишним собрать все самое используемое в одну кучку. Ведь у каждого бывают мо...

Input Type File, множественный с дропзоной и показом превью

Задача: Сделать возможность загрузки файлов в множественный input type="file" c помощью drag&drop и показом превью загру...

Увидеть файл заказов который передаст Битрикс в 1С

Для диагностики обмена заказов, интернет-магазина на 1С Битрикс с 1С Управление Торговлей, нужно увидеть xml файл с зака...

Работа с HTTP-запросами в Bitrix: Обзор возможностей класса \Bitrix\Main\HttpRequest

Класс \Bitrix\Main\HttpRequest, является наследником класса Request, представляет собой мощный инструмент для работы с д...

AJAX корзина с отправкой количества из раздела каталога

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

Вывести артикул в печатную форму бланка заказа

Задача: в печатную форму бланка заказа добавить артикулы товаров и данные о пользователе.

Ajax форма обратной связи, реализация в битрикс

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

Получить и вывести все цены товара в 1С-Битрикс

Задача: получить и вывести все цены товара по его ID в каталоге 1С-Битрикс (например, в детальной карточке catalog.e...

Сортировка элементов по индексу сортировки значений типа список

Внутри любого компонента есть заранее заложенные поля для сортировки элементов. Можно сортировать элементы в разных напр...