Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Добавление собственных макросов в почтовый шаблон

00 голосов
9
Здравствуйте.
Необходимо добавить в тип почтового шаблона «Новый заказ» (SALE_NEW_ORDER) дополнительные поля (свойства заказа). Прочитал, что в init.php можно сделать отправку уведомления менеджеру с данными заказчика. Но как получить данные заказчика, введенные в форму, в обработчике события OnOrderAdd? Массив arFields их не содержит.

Как это сделать?
Код
AddEventHandler("sale", "OnOrderAdd", "mail4manager");
     function mail4manager(&$ID,&$arFields)
     {
      $eventArFields = Array 
           ( 
           "NAME" => $arFields["NAME"], 
           "PHONE"    => $arFields["PHONE"] 
           ); 
    $event->Send("SALE_NEW_ORDER", SITE_ID, $eventArFields , "N", $template_id);     
     }
?>

P.S. Создавать новое пространство компонентов и менять непосредственно код компонента заказ не хочется.
спросил 04 Май, 13 от Asteria (1,840 баллов)

9 Ответы

00 голосов
А что вам за поля нужны, сделайте вар-дамп существующих полей. Они совпадают с полями от CSaleOrder::GetByID?
ответил 04 Май, 13 от ledyNEXUS (420 баллов)
00 голосов
CSaleOrderPropsValue::GetList ?
ответил 05 Май, 13 от Eddie (2,060 баллов)
00 голосов
Пробую так:
Код
AddEventHandler("sale", "OnOrderAdd", "mail4manager");
     function mail4manager(&$ID,&$arFields)
     {
      $db_vals = CSaleOrderPropsValue::GetList(
            array("SORT" => "ASC"),
            array("ORDER_ID" => $ID)
        );
      while ($arVals = $db_vals->Fetch()){
        echo "<pre>";
        print_r($arVals);
        echo "</pre>";        
        }
        die();      
     }
?>

Но массив $arVals почему-то пустой. В чем может быть проблема?
P.S. Код с любым другим определенным ID заказа работает.
P.P.S. Переменная ID в массив arFilter передается.
ответил 06 Июль, 13 от Asteria (1,840 баллов)
00 голосов
Видимо, событие создается после вызова в компоненте CSaleOrder::Add, а свойства заказа он прописывает после генерации этого события. Какая-то неправильная логика получается. В качестве фикса можно например в этом событии запоминать ID заказа в $GLOBALS, а после отработки компонента написать CSaleOrderPropsValue::GetList. Более рационального решения в голову не приходит.
ответил 10 Окт, 13 от Eddie (2,060 баллов)
00 голосов
Дмитрий Якинцев, не совсем понял.
Как теперь реализация согласно вашей логике будет выглядеть?

Цитата
а после отработки компонента написать CSaleOrderPropsValue::GetList.

Вот тут более всего неясно. Где это писать в таком случае? Если запускать по крону, то будет задержка. Желательно, чтобы письмо уходило сразу. Как тогда быть?? Воспользоваться агентами?
ответил 10 Янв, 14 от Asteria (1,840 баллов)
00 голосов
Неужели никто не делал почтовые шаблоны через обработку событий? Тема-то распространенная, как я заметил. Подскажите пожалуйста.
ответил 27 Апр, 14 от Asteria (1,840 баллов)
00 голосов
Делали. Только здесь, если я не ошибаюсь, проблема не в том, что трудно отправить письмо, а в том, что заказ создается до события OnOrderAdd, а свойства заказа создаются после события OnOrderAdd, поэтому во время обработки OnOrderAdd их просто не существует еще. И отправку надо делать не по событию, а после вызова компонента оформления заказа.
ответил 23 Авг, 14 от Eddie (2,060 баллов)
00 голосов
Цитата
Дмитрий Якинцев пишет:
И отправку надо делать не по событию, а после вызова компонента оформления заказа.

Это я уже понял. Но как сделать отправку после вызова компонента? Что значит после вызова компонента?
ответил 28 Дек, 14 от Asteria (1,840 баллов)
00 голосов
Например, в component_epilog.php
ответил 17 Апр, 15 от Eddie (2,060 баллов)

Похожие вопросы

0 голосов
2 ответов
0 голосов
2 ответов
спросил 29 Апр, 14 от ROKKI (160 баллов)
0 голосов
2 ответов
0 голосов
1 ответ
0 голосов
1 ответ