Раздел не выводится - разбор причин
Раздел заведён и активен, а в дереве на сайте его нет. Разбираем причины по убыванию частоты, начиная со служебных полей самого раздела.
С чего начать
Смотрим служебные поля раздела:
$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 оставляет эти границы неверными, и вывод дерева ломается без единой ошибки.
Причины
-
Выключен родительский раздел примерно 30% случаев
ПризнакРаздел активен, но на сайте нет ни его, ни соседних вложенных разделов.
ПроверкаСмотрим признак глобальной активности у раздела и активность всех его родителей.
Что делатьВключаем родительский раздел: глобальная активность считается по всей цепочке сверху вниз.
-
В разделе нет активных элементов примерно 25% случаев
ПризнакРаздел исчезает из меню и списка, но открывается по прямому адресу.
ПроверкаСчитаем активные элементы раздела с учётом всех вложенных подразделов.
Что делатьМеняем параметр компонента о показе пустых разделов или наполняем сам раздел.
-
Раздел закрыт правами примерно 20% случаев
ПризнакАдминистратор видит раздел, а посетитель или менеджер - нет.
ПроверкаПроверяем режим прав инфоблока и правила доступа именно на этот раздел.
Что делатьПравим правило доступа: при расширенном режиме прав каждый раздел закрывается отдельно.
-
Сломано дерево разделов примерно 15% случаев
ПризнакРазделы выводятся не на своих уровнях или дублируются в разных ветках.
ПроверкаСмотрим числовые границы и уровень вложенности у разделов инфоблока.
Что делатьПересобираем дерево штатными средствами: границы считает API, а не прямая запись.
-
Страница отдаётся из кэша примерно 10% случаев
ПризнакНовый раздел появился в админке, но не появился в меню сайта.
ПроверкаСбрасываем кэш компонента дерева и обновляем страницу сайта.
Что делатьНастраиваем сброс кэша по тегу при любом изменении разделов инфоблока.
Частые вопросы
Чем активность раздела отличается от глобальной?
Первая относится к самому разделу, вторая учитывает всех его родителей. Выключенный родитель гасит ветку целиком, и раздел остаётся активным лишь формально.
Почему раздел открывается по адресу, но нет в меню?
Компонент меню скрывает разделы без активных элементов. Это настройка вывода, а не признак самого раздела.
Как посчитать элементы с учётом подразделов?
Штатным подсчётом при выборке разделов: он умеет считать и по вложенным. Свой подсчёт запросом в цикле на большом каталоге стоит заметно дороже.
Что ломает дерево разделов?
Запись разделов мимо штатного API: границы и уровень вложенности при этом не пересчитываются. Через обычные методы платформы этого не происходит.
Почему после переноса каталога разделы перепутались?
Перенос делался прямыми запросами к таблицам вместе с идентификаторами. Разделы переносят выгрузкой или скриптом на штатных методах.
Смежное
- Разделы изнутри: дерево, ключи, привязки элементов - глобальная активность и ключи дерева
- Разделы инфоблока - оглавление подтемы
- Элемент не появляется в списке: разбор причин - тот же разбор для элементов
- Вывод разделов: дерево, подразделы, адреса - как выводят дерево правильно
- Правка структуры разделов: перенос, слияние, удаление - перенос и слияние разделов
- Меню показывает не то: разбор причин - соседний разбор навигации
- Права не применяются: разбор причин - когда раздел закрыт правами
- Кэш не срабатывает: страница собирается заново каждый раз - кэш дерева разделов
- Инфоблоки в 1С-Битрикс - устройство инфоблоков целиком