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

1240  |  17

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

В большинстве случаев, достаточно вомпользоваться стандартным компонентом 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

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

Расскажи друзьям-то:
Уважаемый читатель! В связи с участившимся спамом в комментариях, возможность писать доступна только для зарегистрированных пользователей
Зарегистрироваться Войти Напомнить пароль
Или войти через социальную сеть:
Сергей Манник
Добрый день. Благодарю за действительно понятные уроки по битрикс.
у меня вопрос к вашему уроку
"Самодельная форма добавления элемента на API Битрикс"
Собственно сам вопрос: как сделать вывод не по ID а по ЧПУ
Михаил Базаров
Цитата
Сергей Манник написал:
Добрый день. Благодарю за действительно понятные уроки по битрикс.
у меня вопрос к вашему уроку
"Самодельная форма добавления элемента на API Битрикс"
Собственно сам вопрос: как сделать вывод не по ID а по ЧПУ
Просто добавьте в init.php обработчик события, что бы при добавлении элемента создавал ему символьный код

Типа того
Код
<?
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", Array("MyClass40", "OnBeforeIBlockElementAddHandler"));
class MyClass40
{
    function OnBeforeIBlockElementAddHandler(&$arFields)
    {
        $name = $arFields["NAME"];
        $arParams = array("replace_space"=>"-","replace_other"=>"-");
        $trans = Cutil::translit($name,"ru",$arParams);
        $arFields["CODE"] = $trans;
    }
}
?>
Сергей Манник
а если точнее
Цитата
Сергей Манник пишет:
Добрый день. Благодарю за действительно понятные уроки по битрикс.
у меня вопрос к вашему уроку
"Самодельная форма добавления элемента на API Битрикс"
Собственно сам вопрос: как сделать вывод не по ID а по ЧПУ
а если точнее то при создании не происходит генерация символьного кода а только ID
Сергей Манник
спасибо за оперативный ответ. все работает.
И вопрос не в тему:


Когда планируете дальнейшие видео по созданию инфопортала?
Сергей Манник
подскажите ответ еще вот на такой вопрос.
руководство захотело добавлять новости в подробное описание не через textarea а через визуальный редактор такой же как и комментарий к записи. если хотя бы в общих чертах опишите как это реализовать буду признателен.
Михаил Базаров
Цитата
Сергей Манник написал:
подскажите ответ еще вот на такой вопрос.
руководство захотело добавлять новости в подробное описание не через textarea а через визуальный редактор такой же как и комментарий к записи. если хотя бы в общих чертах опишите как это реализовать буду признателен.
Просто берете любой визуальный редактор редактор и интегрируете его в этот вывод. Но зачем вообще новости так добавлять? Их проще через стандартную форму (компонент).
Motocross Inua
Здравствуйте.
Как вывести свойства из раздела инфоблока? То есть в инфоблоке "объявления" разделы - мото, экипировка. Для каждого раздела разные свойства. Как сделать чтоб при выборе раздела выводились свойства именно этого раздела? Спасибо
Михаил Базаров
Цитата
Motocross Inua написал:
Здравствуйте.
Как вывести свойства из раздела инфоблока? То есть в инфоблоке "объявления" разделы - мото, экипировка. Для каждого раздела разные свойства. Как сделать чтоб при выборе раздела выводились свойства именно этого раздела? Спасибо
Это достаточно сложно, просто так, в формате текстового описания не объяснить. Более того, боюсь что и в формате видео не объяснить.
Дмитрий Гайчук
Здравствуйте, Михаил!
1) Подскажите как организована обработка событий формы стандартного компонента main.feedback?
2) какой путь будет более правильным: добавить нужную мне функциональность в стандартный обработчик или написать свой собственный обработчик так, как показано в этом уроке?
Владислав Кузнецов
Добрый день.
Огромная благодарность за Ваши труды по ведению данного сайте, он очень сильно помогает начинающим работать с платформой Битрикс. Я не так давно стал заниматься созданием сайтов. И очень заинтересовался данной платформой. Ваши статьи очень в этом помогаю.
Но я пытался сделать форму по данной статье и у меня не очень получилось. Данные передаются, но выдает что "Что-то пошло не так". Если не сложно не могли бы мне помочь с данной проблемой.
Владислав Кузнецов
У меня не получается вставить части кодов из необходимых файлов, и с позволения приложу на них ссылки со своего Гугл Диска. add_form_page.php и add_form_result.php
Владислав Кузнецов
P.S.: Я разобрался, вывел ошибки и решил их. Извиняюсь, если Вас отвлек.
Михаил Базаров
Цитата
Владислав Кузнецов написал:
P.S.: Я разобрался, вывел ошибки и решил их. Извиняюсь, если Вас отвлек.
Не успел ответить! Но это хорошо- когда задачки решаются самостоятельно :)
Дмитрий Гайчук
Цитата
Дмитрий Гайчук пишет:
Здравствуйте, Михаил!
1) Подскажите как организована обработка событий формы стандартного компонента main.feedback?
2) какой путь будет более правильным: добавить нужную мне функциональность в стандартный обработчик или написать свой собственный обработчик так, как показано в этом уроке?
Добрый день, Михаил. Конкретизирую вопрос. При кастомизиции компонента main.faadback скопировал шаблон с помощью команд меню ( не файловым менеджером), при этом файл component.php остался в папке с компонентами Битрикс. Таким образом, получилось, что форма находится в папке шаблона сайта, а обработчик событий формы остался в папке с компонентами Битрикс и пришлось изменять его там. Это нормальная ситуация или я что-то неправильно сделал?
Михаил Базаров
Цитата
Дмитрий Гайчук написал:
Цитата
Дмитрий Гайчук пишет:
Здравствуйте, Михаил!
1) Подскажите как организована обработка событий формы стандартного компонента main.feedback?
2) какой путь будет более правильным: добавить нужную мне функциональность в стандартный обработчик или написать свой собственный обработчик так, как показано в этом уроке?
Добрый день, Михаил. Конкретизирую вопрос. При кастомизиции компонента main.faadback скопировал шаблон с помощью команд меню ( не файловым менеджером), при этом файл component.php остался в папке с компонентами Битрикс. Таким образом, получилось, что форма находится в папке шаблона сайта, а обработчик событий формы остался в папке с компонентами Битрикс и пришлось изменять его там. Это нормальная ситуация или я что-то неправильно сделал?
Добрый. Нет не нормальная, нельзя менять компоненты в ядре. Если сильно надо- то нужно скопировать его в свое пространство имен и править там. По сути, просто сделать свой компонент- на основе штатного.
Дмитрий Гайчук
пробовал скопировать component.php в свое пространство имен, туда же где и весь компонент, но переменная POST_FORM_ACTION_URI упорно указывает на component.php из ядра.

Значит нужно прописать путь к обработчику вручную и добавить в начало этого обработчика:
<?
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";);
?>
а дальше логику обработки события. Правильно?
Дмитрий Гайчук
некорректно выразился: "POST_FORM_ACTION_URI указывает на component.php из ядра".
При использовании POST_FORM_ACTION_URI вызывается component.php из ядра

© 2011—2016 Частный вебмастер: ИП Базаров, ОГРНИП: 315784700173692. Работает на 1С-Битрикс.
Копирование материалов запрещено: "ГК РФ, часть 4, раздел VII: Права на результаты интеллектуальной деятельности".

Информация размещенная на сайте, не является публичной офертой. Политика конфеденциальности
x
Как к Вам обращаться? *
Ваша электронная почта: *
Доп. материалы (логотип, тех. задание):
 
Обзор
Текст сообщения: