Несколько раз у меня возникал вопрос такого плана — как сделать так, чтобы общие константы во всех письмах можно было заменять централизованно, т.е. у вас например есть 2 почтовых шаблона и в каждом из них вы хотите сделать общую подпись вроде: «с уважением, администрация сайта http://www.site.org». Естественно, возникает мысль, что раз такая надпись есть в каждом из двух писем и эта надпись одинакова в этих письмах, то ее можно присвоить какой-то константе, а в текст письма вставить эту константу. Вариант реализации этого я расскажу в этой статье.
1. Определяем место для хранения констант для почтовых шаблонов в панели управления Битрикс
Я такие вопросы решаю обычно простым созданием дополнительного информационного блока. В нашем случае мы должны хранить наименование константы и текст, на который будет заменяться константа. Для хранения наименования константы будем использовать наименование, а для хранения текста — поле Детальное описание.
2. Определяем форму подстановки константы в почтовый шаблон
Проще всего использовать форму, которую использует Битрикс #FIELD_NAME# . Соответственно, в инфоблоке будем хранить наименование константы в форме FIELD_NAME , а шаблоне письма писать #FIELD_NAME# .
3. И делаем замену!
Мы, конечно же, не будем лезть в ядро системы и пытаться что-то там менять. Мы просто будем использовать события Битрикс.
Нужное нам событие легко найти в документации OnBeforeEventSend — http://dev.1c-bitrix.ru/api_help/main/events/onbeforeeventsend.php
Добавляем код в файл /bitrix/php_interface/init.php (если такого файла не обнаружите, то его нужно создать):
AddEventHandler('main', 'OnBeforeEventSend', "OnBeforeEventSendHandle"); // замена констант в письмах function OnBeforeEventSendHandle($arFields) { }
Этот код позволит зарегистрировать обработчик события. Далее в функции OnBeforeEventSendHandle пишем код замены общих констант.
AddEventHandler('main', 'OnBeforeEventSend', "OnBeforeEventSendHandle"); // замена констант в письмах function OnBeforeEventSendHandle($arFields) { if(!CModule::IncludeModule("iblock")) { ShowError(GetMessage("IBLOCK_MODULE_NOT_INSTALLED")); return 0; } $arFilter = Array("IBLOCK_ID"=>22, "ACTIVE"=>"Y"); $arSelect = Array("NAME", "DETAIL_TEXT"); $res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); while($ob = $res->GetNextElement()) { $ob["NAME"] = str_replace("#", "", $ob["NAME"]); $ob["DETAIL_TEXT"] = htmlspecialchars_decode($ob["DETAIL_TEXT"]); $arFields[$ob["NAME"]] = $ob["DETAIL_TEXT"]; } }
В коде вам нужно будет заменить ID информационного блока, в котором хранятся константы, на свой. И это все. Удачи в работе!