Отправка в письме веб-формы только заполненных полей 1С Битрикс
2021.08.09
Допустим у вас есть веб-форма в которой много полей и не все они заполняются, или заполняются в зависимости от каких то условий, стандартный модуль веб форм создаёт шаблоны для них вот в таком виде
Название поля
------------------------
Значение поля
но если заполнены не все поля получается такая картина
Название поля
------------------------
Название поля
------------------------
Значение поля
Название поля
------------------------
Как то не удобно обрабатывать такие заявки, по этому предлагаю такое решение.
Код представленный ниже вставляем в /local/init.php или подключаемый к нему файл
в самих шаблонах
удаляем все поля для вывода и прописываем строку #MESSAGE#
сохраняем обязательно в формате html Остаётся только прописать ID форм в самом коде для которых будет работать это правило.
Название поля
------------------------
Значение поля
но если заполнены не все поля получается такая картина
Название поля
------------------------
Название поля
------------------------
Значение поля
Название поля
------------------------
Как то не удобно обрабатывать такие заявки, по этому предлагаю такое решение.
Код представленный ниже вставляем в /local/init.php или подключаемый к нему файл
в самих шаблонах
удаляем все поля для вывода и прописываем строку #MESSAGE#
сохраняем обязательно в формате html Остаётся только прописать ID форм в самом коде для которых будет работать это правило.
<? AddEventHandler('main', 'OnBeforeEventAdd', array("MyCustomForm", "my_OnBeforeEventAdd")); class MyCustomForm { function my_OnBeforeEventAdd($event, &$lid, &$arFields) { /* ID форм у которых нужно выводить только заполненные результаты */ $arrayForms = [ 11, 13, 14, ]; /* Проверяем есть ли текущая форма в нашем массиве */ if (in_array($arFields['RS_FORM_ID'], $arrayForms)) { if (CModule::IncludeModule("form")) { /* получаем все вопросы формы*/ $FORM_ID = $arFields['RS_FORM_ID']; $arFilter = array(); $rsQuestions = CFormField::GetList( $FORM_ID, "N", $by = "s_id", $order = "desc", $arFilter, $is_filtered ); $messageArray = array(); while ($arQuestion = $rsQuestions->Fetch()) { $messageArray[$arQuestion['C_SORT']]['NAME'] = $arQuestion['TITLE']; $messageArray[$arQuestion['C_SORT']]['VALUE'] = $arFields[$arQuestion['SID']]; } /* Сортируем полученный массив по полю сортировка (в данном случае оно записано как ключ) */ ksort($messageArray); /* создаём таблицу из заполненных свойств */ $arFields['MESSAGE'] = '<table border="1">'; foreach ($messageArray as $key => $oneField){ if(!empty(trim($oneField['VALUE']))) { $arFields['MESSAGE'] .= '<tr>'; $arFields['MESSAGE'] .= '<td>' . $oneField['NAME'] . '</td>'; $arFields['MESSAGE'] .= '<td>' . $oneField['VALUE'] . '</td>'; $arFields['MESSAGE'] .= '</tr>'; } } $arFields['MESSAGE'] .= '</table>'; $arFields['MESSAGE'] = htmlspecialchars_decode(htmlspecialchars($arFields['MESSAGE'])); } } } }
![]()
Александр
|
Отличная статья!
Однако есть одно небольшое замечание: использовать индекс сортировки в качестве ключа - плохая практика, администратор сайта может установить у ряда полей одинаковый индекс и тогда в цикле строка "$messageArray[$arQuestion['C_SORT']]" будет заменять значение предыдущего элемента новым с тем же индексом сортировки. Может лучше использовать: $by = "s_sort" вместо $by = "s_id" |