November 8th, 2012

1С-Битрикс: почтовые шаблоны и почтовые события. Комментарии к файлу /bitrix/php_interface/init.php

Довелось мне дописать как-то в /bitrix/php_interface/init.php кусочек кода на отправку уведомлений о новой записи в инфоблок и изменении статуса записи. Громкими словами швыряться не буду, сначала картинка:

100

Например, задачка: гостевая книга. Форма на вопрос или отзыв, премодерация и ответ администрации. Чтоб было понятнее. Написание страницы, размещение компонента с формой и шаблон компонента рассматривать здесь не буду. Для многих случаев хватит "умолчального", а если экзотика - всего не опишешь.
Теперь важное - надо сделать так. чтобы администрация получала на почту себе уведомление о том, что оставлена новая запись в гостевой (или задан вопрос). Это раз. Когда администрация прокомментировала запись, пользователю (автору вопроса) на его почту приходит уведомление, что ему ответили.  А теперь по шагам.

Шаг 1 - делаем новый тип почтового события;
Шаг 2 - делаем новый почтовый шаблон и привязываем его к почтовому событию из п.1;
Здесь два важных момента: текст письма с уведомлением админу и пользователю мы можем написать сами. Вот пример, взятый из шаблона письма администратору:

Пользователь: #NAME#<br />
<br />
Задал вопрос: #QUESTION#<br />
<br />
E-mail: #EMAIL#<br />
<br />
Город: #CITY#<br />
<br />
Категории: #CATEGORY#<br />
<br />
IP-адрес посетителя: #IP#<br />
<br />
Чтобы ответить на вопрос, можно перейти: *сюда пишем вашу гиперссылку*
<br /><br />
Письмо сгенерировано автоматически, и отвечать на него не нужно.

А вот пример из шаблона уведомления пользователю:

Здравствуйте, ваш e-mail был указан в качестве адреса для оповещения об ответе на вопрос, заданный на сайте <a href="http://library.bsu.edu.ru">Научной библиотеки имени Н.Н.Страхова НИУ «БелГУ»</a>.
<br /><br />
Вопрос: #QUESTION#
<br /><br />
Ответ: #ANSWER#
<br /><br />
Вопрос и ответ опубликованы в разделе *тут урл где опубликовано на сайте*
<br /><br />
Если вы не задавали вопрос и не указывали свой e-mail, просто проигнорируйте это письмо.<br />
Мы нигде и никогда не будем публиковать ваш e-mail.
<br /><br />
Это письмо сгенерировано автоматически, и отвечать на него не нужно.

Дальше - шаг 3 и самый ответственный. Лезем в /bitrix/php_interface/init.php
Исходный код написан с комментариями, привожу его кусочек, небольшое пояснение в начале поста в картинке. НЕ ЗАПУТАЙТЕСЬ СО СКОБКАМИ для завершения функций, почаще делайте бэкапы и не забудьте разрешить участие в документообороте (для изменения статусов паблиш и драфт). Удачи!

function SendUpdateMessage(&$arFields) // Сообщение пользователю, что ему ответили на указанный почтовый ящик
{
/*
Статусы в документообороте 1-Published, 2-Draft, 3-Ready;
83 это ID инфоблока, сообщение шлётся при смене статуса с драфт (модерация) на паблиш (отвечено и одобрено);
*/
if($arFields["IBLOCK_ID"]==83&&$arFields["WF_STATUS_ID"]==1)
{

$arEventFields = array(
"NAME" => $arFields["NAME"],
);
$props = CIBlockElement::GetProperty(83, $arFields["ID"]);

while($ar_props = $props->Fetch())
{
switch ($ar_props["ID"])
{ // свойства в инфоблоке - их ID и КОД
case 2426:
$arEventFields["QUESTION"]=$ar_props["VALUE"]; // Вопрос
break;
case 2427:
$arEventFields["ANSWER"]=$ar_props["VALUE"]; // Ответ
break;
case 233:
$arEventFields["EMAIL"]=$ar_props["VALUE"]; // Почта пользователя, задававшего вопрос
break;
}
}

if(filter_var($arEventFields["EMAIL"], FILTER_VALIDATE_EMAIL)){
CEvent::Send("NEW_QUESTION_ANSWER", 'ab', $arEventFields, "N", 281); // тип почтового события (NEW_QUESTION_ANSWER), символьный код сайта (ab), ID почтового шаблона (281)
}
}
// сюда писать для нового инфоблока
}
/***********************************************************************************/

function SendNewMessage(&$arFields) // Отправка уведомления админу, что появилась новая запись в инфоблоке
{

if($arFields["IBLOCK_ID"]==83) // 83 это ID инфоблока
{
CIBlockElement::SetPropertyValuesEx($arFields["ID"],83,array("ip"=>$_SERVER["REMOTE_ADDR"]));
if($arFields["WF_PARENT_ELEMENT_ID"] == $arFields["ID"])
{
$arEventFields = array(
"NAME" => $arFields["NAME"],
"ID" => $arFields["ID"],
/*
"QUESTION" => "",
"EMAIL" => "",
"CITY" => "",
"CATEGORY" => "",
"IP" => "",
*/
);
$props = CIBlockElement::GetProperty(83, $arFields["ID"]);
while($ar_props = $props->Fetch())
{
switch ($ar_props["ID"])
{ // свойства в 83-м инфоблоке
case 2426:
$arEventFields["QUESTION"]=$ar_props["VALUE"]; // Вопрос
break;
case 233:
$arEventFields["EMAIL"]=$ar_props["VALUE"]; // Почтовый ящик посетителя
break;
case 232:
$arEventFields["CITY"]=$ar_props["VALUE"]; // Город
break;
case 2417:
$arEventFields["CATEGORY"][]=$ar_props["VALUE_ENUM"];
break;
case 2425:
$arEventFields["IP"]=$ar_props["VALUE"];
break;
}
}
$arEventFields["CATEGORY"]=implode(", ",$arEventFields["CATEGORY"]);
//$arEventFields["CATEGORY"]=var_export($arEventFields["CATEGORY"],true);
CEvent::Send("NEW_PROG_NAME", 'ab', $arEventFields, "N", 280);
}
}
}