Категории статей
Модернизация 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. Проверяем на работоспособность.
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. Сохраняем файл.
На этом данных действий вполне достаточно.
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(). Это не тема статьи. Но по фен-шую можно добавить.
Сохраняем файл.
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;
}
Сохраняем файл.
На этом этапе мы завершили подготовку массива полей и обработку значения активности элемента.
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":
Сохраняем файл.
Статья ожидает завершения....
Стандартные средства управления в компоненте формы 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/myspace12. Находим компонент /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":
Сохраняем файл.
Проверяем на работоспособность
Статья ожидает завершения....