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

Меню показывает не то - разбор причин

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

С чего начать

Ищем файлы меню по дереву разделов:

Окно терминала
find /home/bitrix/www -maxdepth 4 -name '.*.menu.php' -o -maxdepth 4 -name '.*.menu_ext.php' | head
ls -la /home/bitrix/www/catalog/.left.menu.php 2>/dev/null
# поиск файла идёт снизу вверх и останавливается на первом найденном
# тип меню задаётся вторым словом в имени файла и должен совпадать с параметром

Меню ищется от текущего раздела вверх до корня и берётся первое найденное. Файл в подразделе перекрывает родительский полностью, даже когда внутри пусто.

Смотрим содержимое найденного файла:

/catalog/.left.menu.php
$aMenuLinks = [
['Каталог', '/catalog/', [], [], ''],
['Акции', '/catalog/sale/', [], [], 'CSite::InGroup([5])'], // условие показа
];
// пустой массив в файле означает пустое меню в этом разделе и ниже

Пустой файл меню - самая частая причина исчезнувшего меню. Он выглядит безобидно, но перекрывает родительское меню так же надёжно, как заполненный.

Проверяем параметры компонента:

$APPLICATION->IncludeComponent('bitrix:menu', 'horizontal', [
'ROOT_MENU_TYPE' => 'left',
'MENU_CACHE_TYPE' => 'A',
'USE_EXT' => 'Y', // без этого динамическое меню не подключается
'MAX_LEVEL' => 3, // штатные шаблоны глубже четвёртого уровня не рисуют
]);

Тип меню в параметрах компонента должен совпадать с именем файлов. Опечатка в типе даёт пустое меню без единой ошибки, потому что искать компоненту просто нечего.

Причины

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

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

    ПроверкаИщем файлы меню по дереву разделов от текущего вверх до корня сайта.

    Что делатьУдаляем или заполняем лишний файл: поиск останавливается на первом найденном.

  2. Файл меню пустой примерно 25% случаев

    ПризнакМеню пропало в разделе и во всех вложенных разделах сразу.

    ПроверкаОткрываем найденный файл и смотрим, есть ли в нём пункты.

    Что делатьЗаполняем файл или убираем его совсем: пустой массив перекрывает родительское меню.

  3. Не совпал тип меню примерно 20% случаев

    ПризнакКомпонент выводит пустоту, хотя файл меню в разделе есть.

    ПроверкаСравниваем тип меню в параметрах компонента с именем файла меню.

    Что делатьПриводим тип к одному значению: статическое заменяется только статическим, динамическое - динамическим.

  4. Динамическое меню не подключено примерно 15% случаев

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

    ПроверкаСмотрим наличие файла динамического меню и параметр его подключения у компонента.

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

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

    ПризнакФайл меню изменён, а на сайте прежние пункты.

    ПроверкаСбрасываем кэш меню и обновляем страницу ещё раз.

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

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

Почему меню пропало во всём разделе?

Скорее всего, в разделе появился пустой файл меню. Он перекрывает родительское меню целиком, и поиск вверх по дереву на нём останавливается.

Как добавить в меню пункты из инфоблока?

Файлом динамического меню, который собирает пункты кодом. У компонента при этом должно быть включено подключение таких файлов.

Почему не выводятся вложенные уровни?

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

Откуда в меню лишний пункт?

Страница создавалась с включённой опцией добавления пункта меню. Она незаметно заводит собственное меню раздела и добавляет туда пункт.

Как скрыть пункт от части посетителей?

Условием показа в самом пункте меню: проверкой группы или авторизации. Права на раздел при этом всё равно проверяются отдельно.

Смежное

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