Перейти к содержимому

Раздел не выводится - разбор причин

Раздел заведён и активен, а в дереве на сайте его нет. Разбираем причины по убыванию частоты, начиная со служебных полей самого раздела.

С чего начать

Смотрим служебные поля раздела:

$res = CIBlockSection::GetList([], ['IBLOCK_ID' => $iblockId, 'ID' => $sectionId],
false, ['ID', 'NAME', 'ACTIVE', 'GLOBAL_ACTIVE', 'DEPTH_LEVEL', 'LEFT_MARGIN', 'ELEMENT_CNT']);
print_r($res->GetNext());
// собственная активность и глобальная активность - разные поля
// глобальная становится отрицательной при выключенном родителе выше по дереву

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

Считаем элементы раздела:

$res = CIBlockSection::GetList([], ['IBLOCK_ID' => $iblockId, 'ACTIVE' => 'Y'],
true, ['ID', 'NAME']); // третий аргумент включает подсчёт элементов
while ($row = $res->GetNext()) {
printf("%-30s %s\n", $row['NAME'], $row['ELEMENT_CNT']);
}
// компонент меню и списка обычно скрывает разделы без элементов

Пустые разделы скрываются настройкой самого компонента, а вовсе не платформой. Раздел без активных элементов пропадает из дерева именно поэтому, и лечится это либо элементами, либо параметром вывода.

Проверяем целостность дерева:

$rows = \Bitrix\Iblock\SectionTable::getList([
'select' => ['ID', 'LEFT_MARGIN', 'RIGHT_MARGIN', 'DEPTH_LEVEL'],
'filter' => ['=IBLOCK_ID' => $iblockId], 'order' => ['LEFT_MARGIN' => 'ASC'],
])->fetchAll();
// нулевые границы у части разделов означают несобранное дерево

Дерево разделов хранится числовыми границами, а не только ссылкой на родителя. Запись разделов мимо штатного API оставляет эти границы неверными, и вывод дерева ломается без единой ошибки.

Причины

  1. Выключен родительский раздел примерно 30% случаев

    ПризнакРаздел активен, но на сайте нет ни его, ни соседних вложенных разделов.

    ПроверкаСмотрим признак глобальной активности у раздела и активность всех его родителей.

    Что делатьВключаем родительский раздел: глобальная активность считается по всей цепочке сверху вниз.

  2. В разделе нет активных элементов примерно 25% случаев

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

    ПроверкаСчитаем активные элементы раздела с учётом всех вложенных подразделов.

    Что делатьМеняем параметр компонента о показе пустых разделов или наполняем сам раздел.

  3. Раздел закрыт правами примерно 20% случаев

    ПризнакАдминистратор видит раздел, а посетитель или менеджер - нет.

    ПроверкаПроверяем режим прав инфоблока и правила доступа именно на этот раздел.

    Что делатьПравим правило доступа: при расширенном режиме прав каждый раздел закрывается отдельно.

  4. Сломано дерево разделов примерно 15% случаев

    ПризнакРазделы выводятся не на своих уровнях или дублируются в разных ветках.

    ПроверкаСмотрим числовые границы и уровень вложенности у разделов инфоблока.

    Что делатьПересобираем дерево штатными средствами: границы считает API, а не прямая запись.

  5. Страница отдаётся из кэша примерно 10% случаев

    ПризнакНовый раздел появился в админке, но не появился в меню сайта.

    ПроверкаСбрасываем кэш компонента дерева и обновляем страницу сайта.

    Что делатьНастраиваем сброс кэша по тегу при любом изменении разделов инфоблока.

Частые вопросы

Чем активность раздела отличается от глобальной?

Первая относится к самому разделу, вторая учитывает всех его родителей. Выключенный родитель гасит ветку целиком, и раздел остаётся активным лишь формально.

Почему раздел открывается по адресу, но нет в меню?

Компонент меню скрывает разделы без активных элементов. Это настройка вывода, а не признак самого раздела.

Как посчитать элементы с учётом подразделов?

Штатным подсчётом при выборке разделов: он умеет считать и по вложенным. Свой подсчёт запросом в цикле на большом каталоге стоит заметно дороже.

Что ломает дерево разделов?

Запись разделов мимо штатного API: границы и уровень вложенности при этом не пересчитываются. Через обычные методы платформы этого не происходит.

Почему после переноса каталога разделы перепутались?

Перенос делался прямыми запросами к таблицам вместе с идентификаторами. Разделы переносят выгрузкой или скриптом на штатных методах.

Смежное

Первоисточник