Модернизация iblock.element.add.form: активируем и деактивируем элемент

29.03.2017 При разработке личных кабинетов на CMS 1С-Битрикс очень часто приходится манипулировать доступностью данных. Одним из вариантов такой доступности или недоступности данных в виде элемента инфоблока может быть активность элемента.

Стандартные средства управления в компоненте формы iblock.element.add.form, которая доступна для публичной части, по-умолчанию не дают возможности управления активностью элемента.

Ниже описана процедура добавления возможности управлять активностью элемента инфоблока из компонента iblock.element.add.form . Как вы увидите ничего сложного в изменениях нет. В каждом пункте потребуется вставить либо 1 либо 2 строчки программного кода.

Последовательность действий такая:

1. Переносим компонент в отдельное пространство имён, чтобы не сломать логику работы текущего компонента.
2. Редактируем файл параметров .parameters.php , чтобы добавить в настройку компонента возможность показать или спрятать поле Активность в форме редактирования.
3. Редактируем файл component.php в 2 местах, чтобы добавить поле Активность в массив обрабатываемых полей и свойств для чтения значений, и добавляем возможность записи этого значений при изменении элемента.
4. Редактируем файл template.php для вывода управляющих элементов формы, чтобы видеть и изменять значение активности.
5. Проверяем на работоспособность.


Перенос компонента в отдельное пространство имен.

1. Создаём каталог(aka папку aka директорию) , например, myspace1 в /bitrix/components. Так чтобы получилось /bitrix/components/myspace1
2. Находим компонент /bitrix/components/bitrix/iblock.element.add.form и весь каталог с содержимым копируем в /bitrix/components/myspace1 . Так чтобы получилось /bitrix/components/myspace1/iblock.element.add.form
3. Далее в /bitrix/components/myspace1/iblock.element.add.form открываем файл .description.php на редактирование. Находим параметр $arComponentDescription["PATH"]["ID"] и меняем его myspace1. Сохраняем файл.

На этом данных действий вполне достаточно.


Редактирование файла .parameters.php


1. Открываем файл /bitrix/components/myspace1/iblock.element.add.form/.parameters.php на редактирование
2. Находим код инициализации массива $arProperty_LNSF. Выглядит это на момент написания статьи так:

$arProperty_LNSF = array(
    "NAME" => GetMessage("IBLOCK_ADD_NAME"),
    "TAGS" => GetMessage("IBLOCK_ADD_TAGS"),
    "DATE_ACTIVE_FROM" => GetMessage("IBLOCK_ADD_ACTIVE_FROM"),
    "DATE_ACTIVE_TO" => GetMessage("IBLOCK_ADD_ACTIVE_TO"),
    "IBLOCK_SECTION" => GetMessage("IBLOCK_ADD_IBLOCK_SECTION"),
    "PREVIEW_TEXT" => GetMessage("IBLOCK_ADD_PREVIEW_TEXT"),
    "PREVIEW_PICTURE" => GetMessage("IBLOCK_ADD_PREVIEW_PICTURE"),
    "DETAIL_TEXT" => GetMessage("IBLOCK_ADD_DETAIL_TEXT"),
    "DETAIL_PICTURE" => GetMessage("IBLOCK_ADD_DETAIL_PICTURE"),
);

И в самую первую позицию добавляем "ACTIVE" => "Активность", чтобы получилось

$arProperty_LNSF = array(
    "ACTIVE" => "Активность",
    "NAME" => GetMessage("IBLOCK_ADD_NAME"),
    "TAGS" => GetMessage("IBLOCK_ADD_TAGS"),
    "DATE_ACTIVE_FROM" => GetMessage("IBLOCK_ADD_ACTIVE_FROM"),
    "DATE_ACTIVE_TO" => GetMessage("IBLOCK_ADD_ACTIVE_TO"),
    "IBLOCK_SECTION" => GetMessage("IBLOCK_ADD_IBLOCK_SECTION"),
    "PREVIEW_TEXT" => GetMessage("IBLOCK_ADD_PREVIEW_TEXT"),
    "PREVIEW_PICTURE" => GetMessage("IBLOCK_ADD_PREVIEW_PICTURE"),
    "DETAIL_TEXT" => GetMessage("IBLOCK_ADD_DETAIL_TEXT"),
    "DETAIL_PICTURE" => GetMessage("IBLOCK_ADD_DETAIL_PICTURE"),
);

Здесь не нужно обращать внимание на то, что значение поля без функции GetMessage(). Это не тема статьи. Но по фен-шую можно добавить.

Сохраняем файл.


Редактируем файл кода компонента component.php

1. Открываем файл /bitrix/components/myspace1/iblock.element.add.form/component.php на редактирование
2. Находим строчку с первой инициализацией стандартных полей элемента $arResult["PROPERTY_LIST_FULL"]. Выглядит начало кода таким образом:

    $arResult["PROPERTY_LIST_FULL"] = array(
        "NAME" => array(
            "PROPERTY_TYPE" => "S",
            "MULTIPLE" => "N",
            "COL_COUNT" => $COL_COUNT,
        ),
        "TAGS" => array(
            "PROPERTY_TYPE" => "S",
            "MULTIPLE" => "N",
            "COL_COUNT" => $COL_COUNT,
        ),
        "DATE_ACTIVE_FROM" => array(
            "PROPERTY_TYPE" => "S",
            "MULTIPLE" => "N",
            "USER_TYPE" => "DateTime",
        ),
..........................

И в самую первую позицию добавляем такую конструкцию "ACTIVE" => array("PROPERTY_TYPE" => "ACTIVE"), , чтобы получилось
    $arResult["PROPERTY_LIST_FULL"] = array(
        "ACTIVE" => array(
            "PROPERTY_TYPE" => "ACTIVE",
        ),
        "NAME" => array(
            "PROPERTY_TYPE" => "S",
            "MULTIPLE" => "N",
            "COL_COUNT" => $COL_COUNT,
        ),
        "TAGS" => array(
            "PROPERTY_TYPE" => "S",
            "MULTIPLE" => "N",
            "COL_COUNT" => $COL_COUNT,
        ),
        "DATE_ACTIVE_FROM" => array(
            "PROPERTY_TYPE" => "S",
            "MULTIPLE" => "N",
            "USER_TYPE" => "DateTime",
        ),
..........................

3. Теперь нам нужно найти секцию где формируется массив полей и свойств элемента для обновления элемента (update).
Находим, примерно на 745й, строке такое условие

                if (!$res = $oElement->Update($arParams["ID"], $arUpdateValues, $bWorkflowIncluded, true, $arParams["RESIZE_IMAGES"]))
                {
                    $arResult["ERRORS"][] = $oElement->LAST_ERROR;
                }

И прямо перед ним вставляем следующий кусок кода

                if ($_REQUEST["PROPERTY"]["ACTIVE"]["0"] == "Y") $arUpdateValues["ACTIVE"] = "Y";
                else $arUpdateValues["ACTIVE"] = "N";

чтобы получилось

                if ($_REQUEST["PROPERTY"]["ACTIVE"]["0"] == "Y") $arUpdateValues["ACTIVE"] = "Y";
                else $arUpdateValues["ACTIVE"] = "N";

               
                if (!$res = $oElement->Update($arParams["ID"], $arUpdateValues, $bWorkflowIncluded, true, $arParams["RESIZE_IMAGES"]))
                {
                    $arResult["ERRORS"][] = $oElement->LAST_ERROR;
                }

Сохраняем файл.

На этом этапе  мы завершили подготовку массива полей и обработку значения активности элемента.


Редактируем файл шаблона компонента template.php


1. Открываем файл /bitrix/components/myspace1/iblock.element.add.form/templates/.default/template.php на редактирование
2. Находим начало кода конструкции switch ($INPUT_TYPE):
3. Вставляем кусок кода прямо за switch ($INPUT_TYPE):
                            case "ACTIVE":
                            ?>
                            <input type="checkbox" name="PROPERTY[ACTIVE][0]"<?if ($arResult["ELEMENT"]["ACTIVE"] == "Y"):?> checked="checked"<?endif;?> value="Y" />
                            <?
                            break;

так чтобы получилось
                        switch ($INPUT_TYPE):
                            case "ACTIVE":
                            ?>
                            <input type="checkbox" name="PROPERTY[ACTIVE][0]"<?if ($arResult["ELEMENT"]["ACTIVE"] == "Y"):?> checked="checked"<?endif;?> value="Y" />
                            <?
                            break;
                            case "USER_TYPE":


Сохраняем файл.



Проверяем на работоспособность




Статья ожидает завершения....

Возврат к списку