Задача: в нашем распоряжении инфоблок с разделами и элементами. Необходимо массово деактивировать все элементы/разделы.
Решение достаточно простое. Начнем с элементов. Для их выключения нам понадобятся два метода: CIBlockElement::GetList и CIBlockElement::Update. С помощью первого — собираем уникальные идентификаторы всех элементов, с помощью второго — снимаем активность элемента. Код будет следующим:
$arSelect = Array("ID", "NAME", "DATE_ACTIVE_FROM"); $arFilter = Array("IBLOCK_ID"=>$iblock, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y"); $res = CIBlockElement::GetList(Array(), $arFilter, false, Array(), $arSelect); $i; while($ob = $res->GetNextElement()) { $i++; $el = new CIBlockElement; $ElementArray = Array("ACTIVE" => "N",); $arFields = $ob->GetFields(); $el->Update($arFields['ID'], $ElementArray); } echo "отключено элементов: ".$i;
В переменной $iblock
должен содержаться ID вашего инфоблока.
В моем случае требовалось отключить все элементы, если отключить нужно только некоторые — добавьте соответствующие условие в массив $arFilter
. Например, "CODE" => "car"
— таким образом будут выбраны и впоследствии отключены только элементы с указанным символьным кодом.
Либо "!NAME" => array("%.jpg%", "%.jpeg%", "%.png%")
— таким образом из выборки будут исключены все элементы, в названиях которых присутствуют указанные значения.
C разделами инфоблока — ситуация аналогичная. Нам потребуется класс CIBlockSection.
Готовое решение:
$arFilter = Array('IBLOCK_ID'=>$iblock, 'GLOBAL_ACTIVE'=>'Y'); $db_list = CIBlockSection::GetList(Array(), $arFilter, true); $i; while($ar_result = $db_list->GetNext()) { $i++; $bs = new CIBlockSection; $arFields = Array("ACTIVE" => "N"); $bs->Update($ar_result['ID'], $arFields); } echo "отключено разделов: ".$i;
Помогло ! Спасибо
Здравствуйте, я не силен в битрикс. Подскажите, где этот код нужно прописать, чтобы в неактивном разделе каталога деактивировались все подразделы и товары в них?
Здравствуйте.
Нужно создать файл с произвольным именем в папке с сайтом, скопировать указанный код в него и выполнить. Например, обратившись к данному файлу по адресу сайта через браузер.
Не забудьте также подключить в этом файле header.php и footer.php.
Касаемо деактивации товаров в конкретном разделе — нужно доработать указанный в статье код. В массиве $arFilter вероятно нужно передать что-то вроде параметра SECTION_ID в котором будет указан идентификатор вашего раздела. Точнее не скажу, нужно проверять.
Код для деактивации разделов работает, а для деактивации элементов почему-то не работает
Попробуйте отредактировать значение $arFilter следующим образом:
$arFilter = Array( "IBLOCK_ID"=>$iblock, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y", "SECTION_ID"=>идентификатор раздела, 'INCLUDE_SUBSECTIONS'=>'Y');
Если и это не решает проблемы, то идей нет. Вероятно либо вы что-то делаете не так, либо есть какая-то специфика в настройках.