Телеграм: @bazarow_ru Почта: mihail@bazarow.ru

Самодельная форма добавления элемента на API Битрикс

Просмотров: 45375

Компонент iblock.element.add.form написан таким образом, что вы не сможете (не попотев изрядно и не используя js) как угодно переставлять поля ввода. Например сделать заполненеие текста анонса до ввода разделов. Или переставить чекбоксы свойств до ввода названия (хотя это глупо, но вы не сможжете сделать такую глупость даже если захотите)

При разработке информационных порталов, или просто сложных сайтов, на которых пользователям доступно самостоятельное добавление элементов инфоблока, часто возникает потребность в создании достаточно сложных форм добавления элементов

В большинстве случаев, достаточно воcпользоваться стандартным компонентом iblock.element.add.form. Однако, данный компонент очень давно не обновляется. Назвать его гибким и тонко настраеваемым ни как нельзя. Достаточно часто, для создания формы приходиться писать свои костыли. Например: форму добавления элемента инфоблока через API Битрикс

Компонент iblock.element.add.form написан таким образом, что вы не сможете (не попотев изрядно и не используя js) как угодно переставлять поля ввода. Например сделать заполненеие текста анонса до ввода разделов. Или переставить чекбоксы свойств до ввода названия (хотя это глупо, но вы не сможете сделать такую глупость даже если захотите)

Расскажу как сделать форму через API. Абсолютным костылем данный способ не назвать, в любом случае задача будет решена. И у вас будет возможность оформлять форму как угодно.

Работать будем с методом CIBlockElement::Add - добавляет новый элемент информационного блока. Перед добавлением элемента вызываются обработчики события OnBeforeIBlockElementAdd, из которых можно изменить значения полей или отменить добавление элемента вернув сообщение об ошибке.

Создаем форму на произвольной странице сайта или в основном шаблоне

Для начала: имеем инфоблок "Тест", у которого созданы свойства "Строка", "Список", "Чекбокс", "Файл", "Привязка к разделам". ID этого инфоблока 12

Кстати: в стандартном компоненте не хватает некоторых свойств, например он не умеет выводить свойство привязка к раздел. Как это реализовать можете подсмотреть тут

Далее: Создаем в корне сайта страницу add_form_page.php с таким содержимым

<?
	 require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");

	 //Подключаем модуль инфоблоков
	 CModule::IncludeModule('iblock');
	 $IBLOCK_ID = 12; //ИД инфоблока с которым работаем
	 ?>

	 <form name="add_my_ankete" action="/add_form_result.php" method="POST" enctype="multipart/form-data">

	Название
	 <input type="text" name="name" maxlength="255" value="">

	Картинка анонса
	 <input type="file" size="30" name="image" value="">

	 Свойство Строка
	 <input type="text" name="line" maxlength="255" value="">

	Выпадающий список не множественный
	   <select name='selector'>
	     <option value='#'>Выберите из списка</option>
	     <option value="60">1</option>
	     <option value="61">2</option>
	   </select>
	              
	   Текст анонса
	   <textarea name="description" placeholder="Заполните поле"></textarea>
	                
	   Выбор раздела- множественный
	   <select name='section_id[]' multiple>
	     <option value='#'>Выберите из списка или начните вводить название</option>
	     <?
	       $arFilter = array('IBLOCK_ID' => $IBLOCK_ID, 'ACTIVE' => 'Y', "DEPTH_LEVEL" => "2");
	       $arSelect = array('ID', 'NAME');
	       $rsSection = CIBlockSection::GetTreeList($arFilter, $arSelect);
	       while ($arSection = $rsSection->Fetch()) {
	     ?>
	       <option value="<?= $arSection['ID']; ?>"><?= $arSection['NAME']; ?></option>
	     <?}?>
	   </select>
	             
	   Чекбокс
	   <label><input type="checkbox" name="chek_box" value="47"> Рассрочка </label>
	               
	   Произвольный файл
	   <input type="file" size="30" name="file_pol" value="">
	                    
	   Привязка к подразделам конкретного раздела другого мнфоблока чекбоксы                 
	   <?
	   $rsParentSection = CIBlockSection::GetByID(5741);
	   if ($arParentSection = $rsParentSection->GetNext()) {
	   $arFilter = array('IBLOCK_ID' => $arParentSection['IBLOCK_ID'], '>LEFT_MARGIN' => $arParentSection['LEFT_MARGIN'], '<RIGHT_MARGIN' => $arParentSection['RIGHT_MARGIN'], '>DEPTH_LEVEL' => $arParentSection['DEPTH_LEVEL']);
	   $rsSect = CIBlockSection::GetList(array('left_margin' => 'asc'), $arFilter);
	   while ($arSect = $rsSect->GetNext()) {
	   ?>
	    <label><input name='service_dop[]' type="checkbox" value="<?= $arSect['ID']; ?>"> <?= $arSect['NAME']; ?></label>
	   <?}}?>            
	   <input type="submit" value="Отправить">
	 </form>    
<?require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/footer.php"); ?>

Это наша форма, которую заполняет пользователь

Рядом создаем файл add_form_result.php, которому будет передаваться POST запрос и пользователю будет выдаваться сообщение о результате добавления. Содержимое файла:

<?
	 require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");
	 define("NO_KEEP_STATISTIC", true);
	 define("NOT_CHECK_PERMISSIONS", true);
	 require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
	 ?>
 
	 <?
	 if (!empty($_REQUEST['name']) and !empty($_REQUEST['description'])) {
 
	   CModule::IncludeModule('iblock');
 
	   echo 'Вот такие данные мы передали';
	   echo '<pre>';
	   print_r($_POST);
	   echo '<pre>';
 
	   //Погнали
	   $el = new CIBlockElement;
	   $iblock_id = 24;
	   $section_id = false;
	   $section_id[$i] = $_POST['section_id']; //Разделы для добавления
 
	   //Свойства
	   $PROP = array();
 
	   $PROP['LINE'] = $_POST['line']; //Свойство Строка
	   $PROP['SELECTOR'] = $_POST['selector']; //Свойство список
	   $PROP['CHEK_BOX'] = $_POST['chek_box']; //Свойство чекбокс
	   $PROP['FILE_POL'] = $_FILES['file_pol']; //Свойство файл
	   $PROP['SECTIONS_SV'][$c] = $_POST['sections_sv']; //Чекбоксы привязка к разделам
 
	   //Основные поля элемента
	   $fields = array(
	     "DATE_CREATE" => date("d.m.Y H:i:s"), //Передаем дата создания
	     "CREATED_BY" => $GLOBALS['USER']->GetID(),  //Передаем ID пользователя кто добавляет
	     "IBLOCK_SECTION" => $section_id[$i], //ID разделов
	     "IBLOCK_ID" => $iblock_id, //ID информационного блока он 24-ый
	     "PROPERTY_VALUES" => $PROP, // Передаем массив значении для свойств
	     "NAME" => strip_tags($_REQUEST['name']),
	     "ACTIVE" => "Y", //поумолчанию делаем активным или ставим N для отключении поумолчанию
	     "PREVIEW_TEXT" => strip_tags($_REQUEST['description']), //Анонс
	     "PREVIEW_PICTURE" => $_FILES['image'], //изображение для анонса
	     "DETAIL_TEXT"  => strip_tags($_REQUEST['description_detail'],
	     "DETAIL_PICTURE" => $_FILES['image_detail'] //изображение для детальной страницы
	   );
	  
	   //Результат в конце отработки
	   if ($ID = $el->Add($fields)) {
	     echo "Сохранено";
	   } else {
	     echo 'Произошел как-то косяк Попробуйте еще разок';
	   }
	 }
	 ?>
<? require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/footer.php"); ?>

Вот и все. Результат будет отдаваться в запись элемента инфоблока. Уже по вкусу, можете оформлять как угодно, прикручивать js проверку на заполненность или на проверку данных- маски.

На базе данной заметки сделал компонент. Устроен максимально просто, поддается доработкам и расширению функционала. Компонент добавления элемента в инфоблок

Видео: Форма добавления через API

Опубликовав и прочитав записку, понял, что она не до конца понятна. Решил записать поясняющее видео

Загрузка множественного свойства типа файл

Создаем массив со свойствами файлов, методом CFile::MakeFileArray и передаем в $PROP["MORE_PHOTO"] (в моем случае, свойство с доп картинками)


$arMorePhoto["VALUE"];
    $i = 0;
    foreach ($_POST["MORE_PHOTO"] as $morePhoto) {
        $arMorePhoto['n'.$i] = array("VALUE"=>CFile::MakeFileArray($morePhoto));
        $i++;
    }
$PROP["MORE_PHOTO"] = $arMorePhoto;
Александр Семашко 18.05.2020
Добрый день. Спасибо за форму. Подскажите, кто нибудь уже изменял данную форму, что бы она работала при редактировании элемента. Поделитесь пожалуйста
Павел Шестаков 01.07.2020
Добрый день.
Все что нужно уже сделано, но вот возникла такая проблема.
Инфоблок куда пишу данные имеет свойство "Товар" - привязка к элементу инфоблока каталог товаров. При создании заявки нужно сделать выбор 1-3 элементов из каталога.  Как это реализовать полноценно на API не могу разобраться (новичок еще), прошу помощи натолкнуть на мысль.
Михаил Базаров 01.07.2020
Цитата
Павел Шестаков написал:
Добрый день.
Все что нужно уже сделано, но вот возникла такая проблема.
Инфоблок куда пишу данные имеет свойство "Товар" - привязка к элементу инфоблока каталог товаров. При создании заявки нужно сделать выбор 1-3 элементов из каталога.  Как это реализовать полноценно на API не могу разобраться (новичок еще), прошу помощи натолкнуть на мысль.
Суть в том, что вам нужно получить список товаров методом
https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getlist.php
загнать их в select
И передать в нужное свойство (привязка к элементам) ID выбранного товара
Arsen Sheremeta 30.09.2020
Здравствуйте.
У меня пошаговая форма на 6 шагов. Подскажите пожалуйста как сделать чтоб после первого шага форма  создавала запись (элемент), а с каждым следующим шагом, обновляла туже запись а не создавала новую? Спасибо!
Михаил Базаров 30.09.2020
Цитата
Arsen Sheremeta пишет:
Здравствуйте.
У меня пошаговая форма на 6 шагов. Подскажите пожалуйста как сделать чтоб после первого шага форма  создавала запись (элемент), а с каждым следующим шагом, обновляла туже запись а не создавала новую? Спасибо!
На первом шаге создаете элемент методом: CIBlockElement::Add
На остальных обновляете методом: CIBlockElement::Update
Arsen Sheremeta 30.09.2020
Цитата
Михаил Базаров пишет:
[QUOTE][URL=/club/user/14020/]Arsen Sheremeta[/URL] пишет:
Здравствуйте.
У меня пошаговая форма на 6 шагов. Подскажите пожалуйста как сделать чтоб после первого шага форма  создавала запись (элемент), а с каждым следующим шагом, обновляла туже запись а не создавала новую? Спасибо![/QUOTE] На первом шаге создаете элемент методом: CIBlockElement::Add
На остальных обновляете методом: CIBlockElement::Update
Спасибо!
Roma Rampagev 03.10.2020
Все сделал
Максим Максимов 16.03.2021
Добрый день
Спасибо за базу знаний по битрикс !
А есть ли возможность сделать и вашей формы редактор статей на сайте ?

Не только создавать статью но и изменять её?
Михаил Базаров 20.03.2021
Цитата
Максим Максимов написал:
Добрый день
Спасибо за базу знаний по битрикс !
А есть ли возможность сделать и вашей формы редактор статей на сайте ?

Не только создавать статью но и изменять её?
В целом да. Нужно передать сюда ID статьи и по нему получить все содержимое элемента (методом CIBlockElement::GetByID)
Заполнить им все поля, а дальше в обработчике обновлять с помощью $el->Update

Штука получится монструозная- лучше сделать свой компонент.

Как сделать такой компонент добавления/редактирования элемента, будет рассмотрено в этом курсе
https://camouf.ru/video/board/
Владимир 25.06.2021
Здравствуйте!
Хорошее видео. Не подскажете как это всё отправить на почту?
Столкнулся с проблемой нет нигде описание как добавить в форму обратной связи поле "select", решил попробовать как у вас на видео, но не понятно как оправлять ее на почту... ну и прикрутить recaptcha.
Спасибо!

Записная книжка разработчика

Примерно с 2013-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Fancybox в стандартном шаблоне детальной карточки товара, вместо вспл... Просмотров: 127 Задача: заменить работу с изображениями в стандартном или кастомном шаблоне детальной карт... Запретить указание количества товаров, добавляемого в корзину, в опре... Просмотров: 92 Задача состоит в том, чтобы запретить указание количества товара, добавляемого в корзину, ... Подключение jquery из ядра битрикс и объединение своих скриптов в оди... Просмотров: 20932 Если используете большое количество js скриптов на сайте. Например: фансибокс, всяческие г... Обновление цен и остатков, в каталоге 1C-Битрикс, из текстового файла... Просмотров: 75 Задача: прочитать txt-файл с ценами и остатками, который выгружает программа учета по FTP,... Запретить изменения описаний товаров при выгрузке из 1С УТ на сайт Просмотров: 18172 При разработке сайтов на Битрикс, с интеграцией с 1С Управление Тороговлей, нужно запретит... Вывести имя пользователя добавившего элемент инфоблока в Битрикс Просмотров: 17249 Иногда, необходимо вывести имя пользователя добавившего элемент инфоблока. Например, автор... Автогенерация символьных кодов разделов и элементов Битрикс Просмотров: 16169 Иногда нужно создать символьные коды для разделов и элементов. Например: если сайт создан ... Скопировать номер телефона из поля пользователя в телефон для регистр... Просмотров: 2839 Задача, на конкретном сайте: раньше все пользователи регистрировались по стандартному режи... Создать pdf файл из элемента инфоблока, дать скачать пользователю, по... Просмотров: 5362 Задача: при каждом посещении статьи, на сайте, нужно создавать pdf файл с ее содержимым и ... Добавить все свойства инфоблока в умный фильтр одним разом Просмотров: 11283 Если у вас достаточно много свойств, в инфоблоке с товарами, например: больше 1000-чи, пос... Валидация пароля и подтверждения при регистрации в битрикс Просмотров: 15311 Встала задачка сделать валидацию пароля и его подтверждения в стандартной форме регистраци... Объединить отдельные поля ФИО в одно свойство при оформлении заказа. Просмотров: 1335 Пользователь, при оформлении заказа, заполняет три отдельных поля с фамилией, именем и отч... Сгенерировать скидочные купоны, при заказе и отправить на почту Просмотров: 1723 Задача: после того как пользователь сделал заказ, нужно сгенерировать одноразовые купоны д... Заполнить свойство инфоблока ценой из торгового каталога Просмотров: 5108 Если вам по какой-то причине нужно скопировать цену товара в свойство этого же инфоблока. ... Простые калькуляторы в карточке товара каталога на Битрикс Просмотров: 16199 На одном из создаваемых сайтов было необходимо сделать небольшой калькулятор и предварител... Отключить поиск по описаниям товаров в Битрикс Просмотров: 11891 Иногда, нужно отключить поиск по описаниям анонсов и детальному описанию товаров, при разр... Увидеть файл заказов который передаст Битрикс в 1С Просмотров: 24512 Для диагностики обмена заказов, интернет-магазина на 1С Битрикс с 1С Управление Торговлей,... Автоматически отгрузить заказ и сменить статус отгрузки, при выполнен... Просмотров: 975 Проблема: Заказы, на сайте, обрабатываются только в 1С. При этом 1С не работает с отгрузка... Малая корзина Битрикс, упрощенный шаблон Просмотров: 13624 Шаблон малой корзины битрикс, который можно вывести в боковом разделе шаблона или в шапке ... Показ страницы сайта в боковом слайдере, на примере всплывающей формы... Просмотров: 3250 Если вы хотите сделать подгрузку любой страницы сайта в боковой слайдер, для этого в битри...