Пользовательские формы редактирования элементов используются, когда настройки стандартными средствами битрикса недостаточно.
Задача: управлять популярностью товаров в каталоге интернет-магазина.
Отмечаем в настройках компонента bitrix:catalog галочку использовать счетчик просмотров.
Теперь для сортировки элементов на странице каталога мы можем использовать поле SHOW_COUNTER.
Заказчик попросил добавить возможность изменять значение SHOW_COUNTER вручную.
Сначала мы рассмотрели вариант добавления свойства инфоблока shows и создания агента, который раз в час копировал бы значение SHOW_COUNTER в shows. Но тогда пришлось бы отдельно учитывать исходные значения либо добавленную администратором разницу, чтобы синхронизировать реальные и отредактированные значения количества показов. Либо использовать события и обновлять оба значения при изменении администратором.
Логичнее было вывести в форму редактирования поле SHOW_COUNTER. Остановимся на этом решении.
Создание пользовательских форм редактирования подробно описано в пользовательской документации.
Создаем в папке /bitrix/php_interface/include/ файл iblock_element_edit_my.php, копируем в него код из файла /bitrix/modules/iblock/admin/iblock_element_edit.php от строки:
//////////////////////////
//START of the custom form
//////////////////////////
до строки:
//////////////////////////
//END of the custom form
//////////////////////////
Нам надо вывести поле SHOW_COUNTER. Добавим в наш файл следующие строки:
$tabControl->AddEditField("SHOW_COUNTER", GetMessage("IBLOCK_FIELD_SHOW_COUNTER").":", $arIBlock["FIELDS"]["SHOW_COUNTER"]["IS_REQUIRED"] === "Y", array("size" => 7, "maxlength" => 10), $str_SHOW_COUNTER);
Я добавила эти строки после вывода всех свойств элемента
if(!empty($PROP)):
…
endif;
Вы можете вставить код в другом удобном месте.
Теперь на странице настроек инфоблока добавляем путь к нашему файлу.
Идем на страницу редактирования элемента и видим поле Количество показов.
Однако пока введенные в это поле данные не сохраняются.
Создадим файл /bitrix/php_interface/include/iblock_element_edit_before_save.php и определим в нем функцию BXIBlockAfterSave:
function BXIBlockAfterSave($arFields)
{
if($arFields['ID'] > 0 && intval($_POST["SHOW_COUNTER"])>=0)
{
$be = new CIBlockElement();
$be->Update($arFields['ID'], Array('SHOW_COUNTER' => intval($_POST["SHOW_COUNTER"])), false);
}
}
На странице настроек инфоблока добавляем путь к файлу.
Готово. Количеством просмотров теперь можно проставлять вручную.