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

Отправка e-mail при изменении элемента инфоблока

00 голосов
7
Здравствуйте.
Появилась интересная задача, но как ее реализовать пока что не знаю.

Что имеем?
Имеем элемент некого инфоблока, у которого есть множественное свойство типа «привязка к пользователю».

Задача
При изменении этого элемента отправлять автоматом на e-mail привязанных пользователей сообщение типа «Элемент обновился».

Как реализовать?
Если честно, пока не знаю как это сделать. Посмотрел в документации и нашел:
1) CEvent::Send. Функция отправляет e-mail по событию заданного типа, только вот непонятно, как этот тип со всеми настройками создается?
2) Событие OnAfterIBlockElementUpdate в обработчике которого можно создавать список e-mail пользователей адресов и передавать в функцию CEvent::Send.

Так можно сделать? Или что-то упустил?
спросил 13 Июнь, 13 от Asteria (1,840 баллов)

7 Ответы

00 голосов
Цитата
Юрий Шубин пишет:
Или что-то упустил?

Да, немного.

Смотрите:
1) У элемента инфоблока есть привязка к пользователям.
2) Элемент инфоблока можно редактировать.
3) После редактирования нужно разослать привязанным к элементу пользователям какое-то извещение.

Смотрите: до редактирования были одни привязки, после редактирования могли привязки могли измениться.

Кому рассылаем: тем, кто был привязан до редактирования, или тем, кто после?
ответил 13 Июнь, 13 от Ly (4,580 баллов)
00 голосов
Цитата
Кому рассылаем: тем, кто был привязан до редактирования, или тем, кто после?

Тем кто после…
ответил 26 Июнь, 13 от Asteria (1,840 баллов)
00 голосов
Цитата
Юрий Шубин пишет:
Тем кто после

Тогда, действительно, вам нужно использовать обработчик события OnAfterIBlockElementUpdate. В обработчике извлекаете емейлы привязанных пользователей.

Что касается отправки письма, то CEvent::Send, на мой вкус, какое-то очень сильное колдунство. Я использовал модуль рассылок:
Код
$arEmails = array(...); // массив емейлов
$arFields = array(
   'STATUS' => 'P',
   'BCC_TO_SEND' => implode(',', $arEmails),
   'FROM_FIELD' => COption::GetOptionString('main', 'email_from', 'дефолтный@емейл'),
   'SUBJECT' => 'Тема сообщения',
   'BODY_TYPE' => 'text',
   'BODY' => 'Тело сообщения',
   'RUB_ID' => 1,
   'DIRECT_SEND' => 'N',
   'CHARSET' => 'UTF-8',
);
CModule::IncludeModule('subscribe');
$posting = new CPosting;
$ID = $posting->Add($arFields);
if ($ID) $posting->SendMessage($ID);
ответил 29 Сен, 13 от Ly (4,580 баллов)
00 голосов
Dmitry Ban, большое спасибо за код. Очень пригодится.
Только еще есть вопросы.

Как можно проверять действительно ли изменился элемент (а не просто открыт и сохранен без изменений) и только в этом случае отправлять e-mail'ы?
ответил 30 Дек, 13 от Asteria (1,840 баллов)
00 голосов
Цитата
$arEmails = array(...); // массив емейлов
$arFields = array(
'STATUS' => 'P',
'BCC_TO_SEND' => implode(',', $arEmails),
'FROM_FIELD' => COption::GetOptionString('main', 'email_from', 'дефолтный@емейл'),
'SUBJECT' => 'Тема сообщения',
'BODY_TYPE' => 'text',
'BODY' => 'Тело сообщения',
'RUB_ID' => 1,
'DIRECT_SEND' => 'N',
'CHARSET' => 'UTF-8',
);
CModule::IncludeModule('subscribe');
$posting = new CPosting;
$ID = $posting->Add($arFields);
if ($ID) $posting->SendMessage($ID);

Все делаю как в вашем коде, но выпуск создается, а на почту ничего не приходит… :(
ответил 16 Апр, 14 от Asteria (1,840 баллов)
00 голосов
Добрый день!
Цитата
Dmitry Ban пишет:
Кому рассылаем: тем, кто был привязан до редактирования, или тем, кто после?

А вот если тем, кто был привязан до?
ответил 09 Авг, 14 от Chuvaaak (100 баллов)
00 голосов
Тогда нужно использовать обработчик события OnBeforeIBlockElementUpdate
ответил 14 Дек, 14 от Ly (4,580 баллов)

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

+1 голос
1 ответ
спросил 24 Дек, 14 от аноним
0 голосов
6 ответов
спросил 24 Июль, 13 от Snezhka (2,240 баллов)
0 голосов
8 ответов