Иногда при разработке сайта требуется реализовать функционал добавления элементов инфоблока простыми пользователям.Будет достаточно удобно если, после создания новости, модератор будет получать письмо о создании нового элемента. Сделать это можно через событие OnBeforeIBlockElementAdd
Например: на сайте создана "форма добавления элементов" и пользователи сайта могут предлагать новости для размещения на сайте. Однако, новость публикуется не сразу, а после проверки модератором
Будет достаточно удобно если, после создания новости, модератор будет получать письмо о создании нового элемента. Сделать это можно через событие OnBeforeIBlockElementAdd- вызывается до вставки элемента информационного блока, и может быть использовано для отмены вставки или переопределения некоторых полей.
Почтовое уведомление о добавлении новости
Итак: мы создали инфоблок "Народные новости", ID которого 82, и есть несколько свойств:
Ссылка на источник - с ID 143
Адрес новости - c ID 153
Автор новости - с ID 154


Также создаем новый тип почтового события "NEW_ELEMET_ADDED"

И само письмо которое будет отправляться администратору (или по любому, другому адресу). В котором передаем следующие данные:
Уважаемый администратор, на сайте появилась новая новость)
Проверьте и опубликуйте ее
Название: #ADD_NAME#
Текст анонса:
#ADD_ANOUNCE#
Текст подробно:
#ADD_DETAIL#
Источник: #ADD_SOURCE#
Ссылка на новость: #ADD_LINK#
Автор новости: #ADD_AUTOR#

Создание почтового события методом CEvent::Send
И самое главное, это создать обработчик который будет при добавлении элемента, создавать почтовое событие со всеми данными, для этого воспользуемся методом CEvent::Send
Создаем файл init.php в директории /local/php_interface -и добавляем внего следующий код. Подсказки по коду прямо в нем:
//Регистрируем обработчик именем функции будет IBFeedForm
AddEventHandler('iblock', 'OnBeforeIBlockElementAdd', 'IBFeedForm');
//Описываем функцию
function IBFeedForm(&$arFields)
{
//Создаем переменные, внутри которых прописываем:
$SITE_ID = 's1'; //Индетификатор сайта
$IBLOCK_ID = 82; //Индетификатор инфоблока с новостями
$EVEN_TYPE = 'NEW_ELEMET_ADDED'; // Тип почтового события (создавали выше)
if ($arFields['IBLOCK_ID'] == $IBLOCK_ID) {
//Собираем в массив все данные, которые хотим передать в письмо
//Перечисляем все поля как в почтовом событии
$arFeedForm = array(
//Стандартные поля инфоблока
"ADD_NAME" => $arFields['NAME'], //Название новости
"ADD_ANOUNCE" => $arFields['PREVIEW_TEXT'], //Анонс
"ADD_DETAIL" => $arFields['DETAIL_TEXT'], //Детальное описание
//Свойства инфоблока - просто перечисляем ID всех нужных свойств
"ADD_SOURCE" => $arFields['PROPERTY_VALUES']['143'],
"ADD_LINK" => $arFields['PROPERTY_VALUES']['153'],
"ADD_AUTOR" => $arFields['PROPERTY_VALUES']['154'],
);
//И собственно, собираем все это в метод
//Который создаст наше почтовое событие
CEvent::Send($EVEN_TYPE, $SITE_ID, $arFeedForm );
}
}
Обязательно, поле того как скопируете код события, удалите все переносы строк (да и комментарии). Оставил в примере, что бы было понятнее и нагляднее
допустим для отправки этой ссылки администратору сайта, который будет решать дальнейшую судьбу предложенной новости.

Цитата |
---|
Nikita Androsov пишет: вопросик, как нам вытащить ссылку на созданный элемент инфоблока ? допустим для отправки этой ссылки администратору сайта, который будет решать дальнейшую судьбу предложенной новости. |
Код |
---|
"ADD_LINK" => $arFields['ID'], |
Код |
---|
https://АДРЕС_САЙТА/bitrix/admin/iblock_element_edit.php?IBLOCK_ID=82&type=news&ID=#ADD_LINK#&lang=ru&WF=Y |
Сейчас пытаюсь "соединить"
https://camouf.ru/blog-note/2449/?sphrase_id=28078
и эту заметку.
С помощью формы создаутся данные в инфоблоке, письмо уходить но приходить так (кусок кода):
...
Размер кухни: "ADD_SIZE"
Стиль: "ADD_STYLE"
...
В обработчике формы код такой:
Код |
---|
$PROP = array(); $PROP['ATT_TYPEKITCHEN_CALC'] = $_POST['kitchen_form']; //Вид кухни // Размеры: Длина/Ширина/Остров $data = $_POST['size1_form11'] . 'x' . $_POST['size1_form12'] . 'x' . $_POST['size2_form12'] . 'x' . $_POST['size1_form13'] . 'x' . $_POST['size3_form13'] . 'x' . $_POST['size2_form13'] . 'x' . $_POST['size1_form14'] . 'x' . $_POST['size3_form14'] . 'x' . $_POST['size2_form14']; $data = trim($data, 'x'); $PROP['ATT_SIZE_CALC'] = $data; $PROP['ATT_STYLE_CALC'] = $_POST['kitchen_style']; // Стиль $PROP['ATT_COLOR_CALC'] = $_POST['kitchen_color']; // Цвет $PROP['ATT_FASAD_CALC'] = $_POST['kitchen_fasady']; // Фасад $PROP['ATT_STOL_CALC'] = $_POST['kitchen_stol']; // Столешница $PROP['ATT_MOYKA_CALC'] = $_POST['kitchen_moyka']; // Тип мойки $PROP['ATT_FARTUK_CALC'] = $_POST['kitchen_fartuk']; // Фартук $PROP['ATT_FURN_CALC'] = $_POST['kitchen_furn']; // Фурнитура $PROP['ATT_NAME_CALC'] = $_POST['name']; // ФИО $PROP['ATT_PHONE_CALC'] = $_POST['phone']; // Телефон $PROP['ATT_EMAIL_CALC'] = $_POST['email']; // Почта $PROP['ATT_REGION_CALC'] = $_POST['region']; // Город и область $PROP['ATT_CALLTIME_CALC'] = $_POST['calltime']; // Время звонка $PROP['ATT_COMENTS_CALC'] = $_POST['comment']; // Любые комментарии... $PROP['ATT_FILE_POL_CALC'] = $_FILES['file_pol']; //Свойство файл //Основные поля элемента $fields = array( "DATE_CREATE" => date("d.m.Y H:i:s"), //Передаем дата создания "CREATED_BY" => $GLOBALS['USER']->GetID(), //Передаем ID пользователя кто добавляет "IBLOCK_SECTION_ID" => false, // элемент лежит в корне раздела "IBLOCK_ID" => 14, "PROPERTY_VALUES" => $PROP, // Передаем массив значении для свойств "NAME" => strip_tags($_REQUEST['name']), "ACTIVE" => "Y", //поумолчанию делаем активным или ставим N для отключении поумолчанию ); |
в intuit.php
Код |
---|
AddEventHandler('iblock', 'OnBeforeIBlockElementAdd', 'IBFeedForm'); function IBFeedForm(&$arFields) { $SITE_ID = 's1'; $IBLOCK_ID = 14; $EVEN_TYPE = 'NEW_ELEMET_ADDED'; if ($arFields['IBLOCK_ID'] == $IBLOCK_ID) { $arFeedForm = array( "ADD_NAME" => $arFields['NAME'], "ADD_PHONE" => $_POST['phone'], "ADD_EMAIL" => $_POST['email'], "ADD_REGION" => $arFields['PROPERTY_VALUES']["152"], "ADD_CALLTIME" => $arFields['PROPERTY_VALUES']['151'], "ADD_COMENTS" => $arFields['PROPERTY_VALUES']['149'], "ADD_FILE_POL" => $arFields["PROPERTY_VALUES"]["150"], "ADD_TYPEKITCHEN" => $arFields['PROPERTY_VALUES']['137'], "ADD_SIZE" => $arFields['PROPERTY_VALUES']['138'], "ADD_STYLE" => $arFields['PROPERTY_VALUES']['139'], "ADD_COLOR" => $arFields['PROPERTY_VALUES']['140'], "ADD_FASAD" => $arFields['PROPERTY_VALUES']['141'], "ADD_STOL" => $arFields['PROPERTY_VALUES']['142'], "ADD_MOYKA" => $arFields['PROPERTY_VALUES']['143'], "ADD_FARTUK" => $arFields['PROPERTY_VALUES']['144'], "ADD_FURN" => $arFields['PROPERTY_VALUES']['145'], ); CEvent::Send($EVEN_TYPE, $SITE_ID, $arFeedForm); } } |
Размер кухни: #ADD_SIZE#
Стиль: #ADD_STYLE#
То в письме приходит:
Размер кухни:
Стиль:
Если создаю через админку то приходит:
Размер кухни: 400х400x100
Стиль: 15
У свойства Размер кухни тип поля Строка
У свойства Стиль - Список
как думаете из-за чего эта нумерация вылезла?

Цитата |
---|
Надежда написал: Добрый день воспользовался вашим примером, но после каждой отправки данных из формы возникает надпись «int(14865)» но при этом после каждой отправки цифра увеличивается на 1 как думаете из-за чего эта нумерация вылезла? |
Первое, что приходит в голову, в качестве результат выводится количество элементов в этом инфоблоке. Надо смотреть в шаблоне, что отвечает за этот вывод.
Задача: передать в тело письма не только строковые поля такие как Имя, Фамилия и Номер телефона, но и как минимум путь до загруженного файла с формы. Причём файл грузится в пользовательское свойство типа файл (не множественное).
Код |
---|
use Bitrix\Main\Loader; Loader::includeModule("iblock"); AddEventHandler('iblock', 'OnAfterIBlockElementAdd', 'IBFeedForm'); function IBFeedForm(&$arFields) { $SITE_ID = 's1'; $IBLOCK_ID = 22; $EVEN_TYPE = 'MODAL'; $DOMAIN = ((!empty($_SERVER['HTTPS'])) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST']; if ($arFields['IBLOCK_ID'] == $IBLOCK_ID) { $fileUrl = CIBlockElement::GetList( false, [ 'IBLOCK_ID' => $IBLOCK_ID, 'ACTIVE' => 'Y', 'ID' => $arFields['ID'] ], false, false, [ 'PROPERTY_FORM_FILE' ] )->Fetch()['PROPERTY_FORM_FILE_VALUE']; $filePath = CFile::GetPath($fileUrl); $file = $DOMAIN . $filePath; $arFeedForm = array( "PHONE" => $arFields['NAME'], "NAME" => $arFields['PROPERTY_VALUES']['110'], "MAIL" => $arFields['PROPERTY_VALUES']['112'], "COMMENT" => $arFields['PROPERTY_VALUES']['113'], "FILE" => $file ); CEvent::Send($EVEN_TYPE, $SITE_ID, $arFeedForm); } } |
Основной смысл в том, что Миша предлагает в своём решении обработчик который отлавливает событие ДО создания элемента в инфоблоке "OnBeforeIBlockElementAdd". Таким методом я не мог получить полный путь до файла в созданном элементе, поэтому использовал обработчик который отлавливает событие ПОСЛЕ создания элемента в инфоблоке "OnAfterIBlockElementAdd". Тогда в массиве $arFields я получаю ID элемента, по нему через CIBlockElement::GetList получил значение этого свойства, форматировал значение через CFile::GetPath и получил полный путь до файла.