Как получить корневой раздел элемента инфоблока в Битриксе?

Как можно получить значение ['DEPTH_LEVEL'] равное 1 из пути, полученного с помощью функции CIBlockSection::GetNavChain?
  • 3 октября 2023 г. 11:37
Ответы на вопрос 11
Чтобы получить корневой раздел элемента инфоблока в Битриксе, можно воспользоваться функцией CIBlockSection::GetNavChain, а затем из полученного пути выбрать первый элемент. Вот пример кода:

```php
$sectionId = 10; // ID раздела, для которого нужно получить корневой раздел

$navChain = CIBlockSection::GetNavChain(false, $sectionId);
$rootSection = $navChain->Fetch();

$rootSectionId = $rootSection['ID'];
$rootSectionDepth = $rootSection['DEPTH_LEVEL'];

echo "Корневой раздел ID: " . $rootSectionId . ", глубина: " . $rootSectionDepth;
```

В данном примере мы передаем ID раздела в функцию GetNavChain и получаем объект CDBResult. Затем с помощью метода Fetch выбираем первый элемент из пути, который представляет корневой раздел. Затем мы можем получить значение его ID и глубины.

Важно отметить, что если у раздела нет подразделов, то его ID и глубина будут совпадать с показателями ['DEPTH_LEVEL'], возвращаемыми при использовании функции CIBlockSection::GetList без дополнительных фильтров.
$select = [
    "IBLOCK_ID",
    "SECTION_ID" => "ID",
    "SECTION_NAME" => "NAME",
    "PARENT_ID" => "ROOT_SECTION.ID",
    "PARENT_NAME" => "ROOT_SECTION.NAME",
]; 
$iblockId = 12; 
$sections = [437, 494, 482]; 
$entity = \Bitrix\Iblock\Model\Section::compileEntityByIblock($iblockId); 
$dbNavChain = $entity::getList([
    "select" => $select,
    "filter" => [
        "=IBLOCK_ID" => $iblockId,
        "ID" => $sections, 
        "=ROOT_SECTION.DEPTH_LEVEL" => 1
    ],
    'runtime' => [
        'ROOT_SECTION' => [
            'data_type' => $entity,
            'reference' => [
                '=ref.IBLOCK_ID' => new \Bitrix\Main\DB\SqlExpression('?i', $iblockId),
                '>this.LEFT_MARGIN' => 'ref.LEFT_MARGIN',
                ' 'ref.RIGHT_MARGIN',
            ]
        ]
    ],
    "order" => [
        "ROOT_SECTION.LEFT_MARGIN" => "ASC"
    ],
    "cache" => [
        "ttl" => 86400
    ]
]); 
$result = []; 
while ($navChain = $dbNavChain->fetch()) {
    $section = [
        "ID" => $navChain["PARENT_ID"],
        "IBLOCK_ID" => $navChain["IBLOCK_ID"],
        "NAME" => $navChain["PARENT_NAME"],
    ]; 
    $result[$navChain["SECTION_ID"]] = $section;
} 
print_r($result); 

Результат: 
Array
(
    [437] => Array
        (
            [ID] => 75
            [IBLOCK_ID] => 12
            [NAME] => Гель-лаки
        )

    [482] => Array
        (
            [ID] => 338
            [IBLOCK_ID] => 12
            [NAME] => Инструменты
        )

    [494] => Array
        (
            [ID] => 338
            [IBLOCK_ID] => 12
            [NAME] => Инструменты
        )
)
Похожие вопросы