Битрикс. Активируем разделы и элементы по ID инфоблока

Изначально, после обмена с 1С произошла деактивация разделов и элементов основного каталога, ХЗ почему произошел такой обмен с 1С, потом все хорошо синхронизировалось и далее.

Судя по гуглу, такое иногда бывает, так что я не первый, кто решает данную разовую проблему. 

Прикладываю простой скрипт, который решает данную задачу.

Создаем, например, в корне сайта файл active_part.php и добавляем в него следующий код:

		
		<?php
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');

// ID инфоблока (заменить на нужный)
$iblockId = 31; 
// ID раздела (если нужно активировать только подразделы определенного раздела, убираем null и ставим ID раздела)
$sectionId = null; 

// Активация разделов
function activateSections($iblockId, $parentSectionId = null) {
    $filter = ['IBLOCK_ID' => $iblockId, 'ACTIVE' => 'N'];
    if ($parentSectionId) {
        $filter['SECTION_ID'] = $parentSectionId;
    }
    
    $rsSections = CIBlockSection::GetList(
        [],
        $filter,
        false,
        ['ID', 'IBLOCK_ID']
    );
    
    while ($section = $rsSections->Fetch()) {
        $bs = new CIBlockSection;
        $result = $bs->Update($section['ID'], ['ACTIVE' => 'Y']);
        if ($result) {
            echo "Активирован раздел ID: " . $section['ID'] . "<br>";
            // Рекурсивно активируем подразделы
            activateSections($iblockId, $section['ID']);
        } else {
            echo "Ошибка активации раздела ID: " . $section['ID'] . "<br>";
            echo $bs->LAST_ERROR . "<br>";
        }
    }
}

// Активация элементов
function activateElements($iblockId, $sectionId = null) {
    $filter = ['IBLOCK_ID' => $iblockId, 'ACTIVE' => 'N'];
    if ($sectionId) {
        $filter['SECTION_ID'] = $sectionId;
    }
    
    $rsElements = CIBlockElement::GetList(
        [],
        $filter,
        false,
        false,
        ['ID', 'IBLOCK_ID']
    );
    
    while ($element = $rsElements->Fetch()) {
        $el = new CIBlockElement;
        $result = $el->Update($element['ID'], ['ACTIVE' => 'Y']);
        if ($result) {
            echo "Активирован элемент ID: " . $element['ID'] . "<br>";
        } else {
            echo "Ошибка активации элемента ID: " . $element['ID'] . "<br>";
            echo $el->LAST_ERROR . "<br>";
        }
    }
}

// Выполняем активацию
activateSections($iblockId, $sectionId);
activateElements($iblockId, $sectionId);

echo "Операция успешно завершена!";
?>	
	

PS: дополнительно можно указать отдельный раздел и активировать только в нем его дочерние разделы и элементы. В коде указал.


Количество просмотров: 1


Понравилась статья?

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