Если вы работаете с Bitrix, то наверняка сталкивались с ситуацией: в каталоге, блоге или меню красуются пустые разделы. С точки зрения UX это полный провал - пользователь кликает на раздел, а там ничего. В лучшем случае лёгкое раздражение, в худшем - потерянный клиент.
Хорошая новость: Bitrix позволяет спрятать такие «пустышки», и здесь мы разберём, как именно это делается. Будем говорить просто и по делу, но технические детали никуда не денем, ведь именно они решают задачу!
Скрытие пустых разделов при использовании специального компонента
За вывод списка разделов отвечает компонент bitrix:catalog.section.list. Он может вызываться в любом месте сайта - просто на странице (например, на главной странице интернет-магазина), на корневой странице каталога, блога сайта, списка услуг, на странице раздела каталога или ранее упомянутых разделов сайта.
У этого компонента есть четыре интересующих нас параметра.
- «Показывать количество элементов в разделе» (COUNT_ELEMENTS). Он принимает значения «Y» или «N». При значении «Y» будет показано количество элементов в разделе.
- «Показывать количество» (COUNT_ELEMENTS_FILTER). Выбирается, для каких товаров показывать количество: активных, доступных или всех. Доступные значения: CNT_ACTIVE, CNT_AVAILABLE, CNT_ALL соответственно.
- «Скрывать разделы с нулевым количеством элементов» (HIDE_SECTIONS_WITH_ZERO_COUNT_ELEMENTS). Принимает значения «Y» или «N». Если указать значение «Y», то разделы без элементов отображаться не будут.
- «Дополнительный фильтр для подсчета количества элементов в разделе» (COUNT_ELEMENTS_FILTER). Здесь указывается название глобальной переменной, в которую передается параметры дополнительного фильтра для подсчета количества элементов в разделе.
Пример использования:
// переменная обязательно должна быть глобальной и такой, чтобы не пересекаться названием с другими в массиве $GLOBALS
global $elementCountFilter;
// определяем дополнительные условия фильтрации в зависимости от того, какие товары нужно считать
switch ($arParams["COUNT_ELEMENTS_FILTER"])
{
case "CNT_ALL":
break;
case "CNT_ACTIVE":
$elementCountFilter["ACTIVE"] = "Y";
$elementCountFilter["ACTIVE_DATE"] = "Y";
break;
case "CNT_AVAILABLE":
$elementCountFilter["ACTIVE"] = "Y";
$elementCountFilter["ACTIVE_DATE"] = "Y";
$elementCountFilter["AVAILABLE"] = "Y";
break;
}
$APPLICATION->IncludeComponent(
"bitrix:catalog.section.list",
"",
array(
"COUNT_ELEMENTS" => "Y", // считать количество элементов в разделах
"ADDITIONAL_COUNT_ELEMENTS_FILTER" => "elementCountFilter", // указываем название переменной,
"COUNT_ELEMENTS_FILTER" => "CNT_ACTIVE", // количество каких товаров считаем - активных
"HIDE_SECTIONS_WITH_ZERO_COUNT_ELEMENTS" => "N", // скрывать разделы без элементов? - Нет, показывать
"VIEW_MODE" => "TEXT",
"SHOW_PARENT_NAME" => "Y",
"IBLOCK_TYPE" => "",
"IBLOCK_ID" => "",
"SECTION_ID" => $_REQUEST["SECTION_ID"],
"SECTION_CODE" => "",
"SECTION_URL" => "",
"TOP_DEPTH" => "2",
"SECTION_FIELDS" => "",
"SECTION_USER_FIELDS" => "",
"ADD_SECTIONS_CHAIN" => "Y",
"CACHE_TYPE" => "A",
"CACHE_TIME" => "36000000",
"CACHE_NOTES" => "",
"CACHE_GROUPS" => "Y"
)
);
Почему COUNT_ELEMENTS критично важен?
Если шаблоном компонента заложено отображение количества элементов в разделах, то при установленном значении «Y» (галочка в визуальных настройках компонента) это количество будет отображаться. Но главное: этот параметр напрямую включает механизм скрытия разделов. Если поставить «N», разделы не будут скрываться даже при включенных остальных параметрах (например, через редактирование массива параметров при подключении компонента).
Далее нужно установить галочку (через визуальные настройки компонента, или указать значение «Y») для параметра «Скрывать разделы с нулевым количеством элементов». Выбираем, какие товары считать: все, только активные или только доступные. Вариант «доступные» уместнее всего для каталога, потому что опирается на данные Торгового каталога, которого у статей быть не может.
При выборе «доступных товаров» будут отображены те разделы, в которых есть хотя бы один активный элемент, у которого в настройках Торгового Каталога указано ненулевое количество остатка. Соответственно будут скрыты разделы, в которых:
- нет элементов вообще;
- нет активных элементов;
- нет активных элементов, у которых нулевой остаток в Торговом Каталоге.
При выборе «активных товаров» будут отображены разделы, в которых есть активные элементы, при этом не имеет значения количество их остатка (если инфоблок является Торговым Каталогом). Будут скрыты разделы, в которых нет активных элементов.
При выборе «всех» отображаются все разделы, в которых есть любые элементы - без разницы активные или нет, доступные к покупке или нет. Скрываются только разделы, где элементов нет вообще.
Скрытие пустых разделов в меню
Меню инфоблоков выводится через файл с названием <тип_меню>.menu_ext.php. В нём вызывается специальный компонент bitrix:menu.sections.
Стандартно он не поддерживает скрытие пустых разделов. Но не стоит разочаровываться - его можно доработать.
Если вы не обладаете достаточными навыками PHP, лучше обратится за помощью к программистам. Мы с радостью поможем вам с этой задачей в рамках услуги по доработке сайтов.
«Под капотом» этот компонент использует API Bitrix Framework, а именно метод CIBlockSection::GetList(). У него есть параметр bIncCnt, который позволяет подсчитывать количество элементов раздела при выборке. При использовании этого параметра со значением true становятся доступны дополнительные поля.
- ELEMENT_SUBSECTIONS - подсчитывать элементы вложенных подразделов или нет (Y|N, по умолчанию Y).
- CNT_ALL – включать в подсчет неопубликованные элементы (Y|N, по умолчанию N). Актуально при установленном модуле документооборота.
- CNT_ACTIVE - при подсчете учитывать активность элементов (Y|N, по умолчанию N). Учитываются флаг активности элемента ACTIVE и даты начала/окончания активности.
Если вы ранее использовали API Bitrix Framework, то вам не составит труда доработать компонент самостоятельно.
Скрытие пустых разделов в меню на готовых решениях
Аналогичную процедуру с доработкой компонента динамических разделов инфоблока можно провести с компонентом у готового решения Некстайп: Альфа.
Для других готовых решений процедура может немного отличаться, но так как все подобные компоненты внутри используют один и тот же базовый API Bitrix Framework, то доработать можно любое готовое решение.
Вывод
- Для списков разделов используйте bitrix:catalog.section.list и не забудьте включить COUNT_ELEMENTS = "Y" - это ключ к механизму скрытия.
Настройте HIDE_SECTIONS_WITH_ZERO_COUNT_ELEMENTS и выберите корректный COUNT_ELEMENTS_FILTER под ваш кейс.
- Для меню доработайте bitrix:menu.sections, подключив подсчёт через CIBlockSection::GetList() с bIncCnt = true и нужными флагами (ELEMENT_SUBSECTIONS, CNT_ALL, CNT_ACTIVE) - так пустые ветки не попадут в навигацию.
Результат чистая, честная навигация: пользователи видят только то, где действительно есть контент или товар, а вы получаете аккуратный интерфейс без «мёртвых» разделов.