+7 495 008 8452
  • Загрузка
Выберите ваш цвет

Опрос с вариантами ответов из элементов инфоблока «Битрикс»

Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.

Сегодня мы предложим решение частной, но довольно популярной задачи. Допустим, требуется вывести форму опроса, в которой одно из полей представляет собой выпадающий список (drop down). Было бы удобно, если бы записи списка автоматически формировались из названий элементов инфоблока. Разумеется, при изменении инфоблока элементы выпадающего списка также должны меняться автоматически. Как этого добиться?

1. Используем обработчики

AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "OnAfterIBlockElementHandler", 1000);
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "OnAfterIBlockElementHandler", 1000);
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", "OnBeforeIBlockElementUpdateHandler", 1000);
AddEventHandler("iblock", "OnBeforeIBlockElementDelete", "OnBeforeIBlockElementDeleteHandler", 1000);


2. Отредактируем код формы на сайте

#
$QUESTION_ID = 39; // ID вопроса, в который будут выводится названия из инфоблока


Еще надо будет настроить ID в коде, приведенном ниже:

#
function OnAfterIBlockElementHandler(&$arFields)
{
     if ($arFields["IBLOCK_ID"] != '3' || intval($arFields["RESULT"]) <= 0) 
         return $arFields;


3. Массив ответов на вопрос формы

Используем следующий код:

$arAdd = Array("QUESTION_ID"=> $QUESTION_ID, "MESSAGE"=> $arFields["NAME"], "FIELD_TYPE"=> "dropdown");


Сейчас в нем указан тип «dropdown». При необходимости его можно заменить. Например, на «multiselect».

4. Итоговый код init.php

В результате должен получиться файл init.php с таким кодом:

<?
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "OnAfterIBlockElementHandler", 1000);
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "OnAfterIBlockElementHandler", 1000);
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", "OnBeforeIBlockElementUpdateHandler", 1000);
AddEventHandler("iblock", "OnBeforeIBlockElementDelete", "OnBeforeIBlockElementDeleteHandler", 1000);
$old_name = "";
$QUESTION_ID = 39; // ID вопроса, в который мы будем добавлять ответы
function OnBeforeIBlockElementUpdateHandler(&$arFields) {
    global $old_name;
    $arr = CIblockElement::GetByID($arFields["ID"]);
    if ($ar = $arr->Fetch()) $old_name = trim($ar["NAME"]);
}
function OnBeforeIBlockElementDeleteHandler($ID) {
    global $QUESTION_ID;
    $arr = CIblockElement::GetByID($ID);
    if ($ar = $arr->Fetch()) {
        CModule::IncludeModule("form");
        $rsAnswersDel = CFormAnswer::GetList($QUESTION_ID, $by = "s_id", $order = "desc", Array(
            "MESSAGE" => $ar["NAME"]
        ) , $is_filtered);
        while ($arAnswerDel = $rsAnswersDel->Fetch()) CFormAnswer::Delete($arAnswerDel["ID"]);
    }
}
function OnAfterIBlockElementHandler(&$arFields) {
    //Здесь надо поменять ID инфоблока, из которого мы будем брать названия элементов
    if ($arFields["IBLOCK_ID"] != '3' || intval($arFields["RESULT"]) <= 0) return $arFields;
    global $old_name, $QUESTION_ID;
    CModule::IncludeModule("form");
    //Удаляем старое значение ответа при возможном Update.
    if (strlen($old_name) > 0) {
        $rsAnswersDel = CFormAnswer::GetList($QUESTION_ID, $by = "s_id", $order = "desc", Array(
            "MESSAGE" => $old_name
        ) , $is_filtered);
        while ($arAnswerDel = $rsAnswersDel->Fetch()) CFormAnswer::Delete($arAnswerDel["ID"]);
    }
    //Добавляем новое значение
    $rsAnswers = CFormAnswer::GetList($QUESTION_ID, $by = "s_id", $order = "desc", Array() , $is_filtered);
    $arAnswer = $rsAnswers->Fetch();
    if (!$arAnswer) {
        $arAdd = Array(
            "QUESTION_ID" => $QUESTION_ID,
            "MESSAGE" => $arFields["NAME"],
            "FIELD_TYPE" => "dropdown"
        );
        CFormAnswer::Set($arAdd, false, $QUESTION_ID);
    }
    else {
        $bnew = true;
        do {
            if ($arAnswer["MESSAGE"] == $arFields["NAME"]) {
                $bnew = false;
                break;
            }
        } while ($arAnswer = $rsAnswers->Fetch());
        if ($bnew) {
            $arAdd = Array(
                "QUESTION_ID" => $QUESTION_ID,
                "MESSAGE" => $arFields["NAME"],
                "FIELD_TYPE" => "dropdown"
            );
            CFormAnswer::Set($arAdd, false, $QUESTION_ID);
        }
    }
}
?>


Удачи! 


Спасибо за внимание!
Читайте свежий выпуск «Кладовки программиста» каждый день!

Назад в раздел

Подписаться на новые материалы раздела:
Загрузка...