Редактировать

Массовое изменение сортировки на товарах в группе по флагу

Задача

Изменить сортировку элементов в группе. Выполнить это действие при условии установки флага “Изменить сортировку товаров”, само значение свойства сортировки для товаров взять у их родительской группы.

Решение

Битрикс

Добавить пользовательское свойство раздела:

  • Тип данных: Да/Нет
  • Код поля: UF_DO_RESORT

Добавление обработчика события

<?php
$eventManager = \Bitrix\Main\EventManager::getInstance();

// CDecIBEvent
$eventManager->addEventHandler("iblock", "OnBeforeIBlockSectionUpdate", ["CDecIBEvent", "OnBeforeIBlockSectionUpdateHandler"]);
?>

Код функции обработчика

<?php
class CDecIBEvent {
	/**
	 * на обновление категории
	 * */
    public function OnBeforeIBlockSectionUpdateHandler(&$arFields) {

        if ( !isset($arFields['UF_DO_RESORT']) || (int)$arFields['UF_DO_RESORT'] <= 0 ) {
            return;
        }

        // получим все товары в категории и проставим им сортировку
        $arOrder = array('ID'=>'ASC');

        $arFilter = array(
            'IBLOCK_ID' => $arFields['IBLOCK_ID'],
            'SECTION_ID' => $arFields['ID'],
            'INCLUDE_SUBSECTIONS' => 'Y',
        );

        $rsItems = CIBlockElement::GetList($arOrder, $arFilter);

        $i = 0;
        while($arItem = $rsItems->Fetch()) {
            $i++;

            $el = new CIBlockElement();
            $el->Update($arItem["ID"], array('SORT' => $arFields['SORT']));
        }

        // сбросим флаг пересчета сортировки
        $arFields['UF_DO_RESORT'] = 0;
    }
}