Левое меню из разделов с кнопкой назад. news + catalog.section.list


Используем связку news +catalog.section.list отсюда

Дорабатываем код для catalog.section.list т.к. он не выводит разделы на последнем уровне.

result_modifier.php

<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) {
    die();
}

/**
 * @var array $arParams
 * @var array $arResult
 */

use \Bitrix\Iblock\SectionTable;

if ($arResult["SECTIONS_COUNT"] === 0) {
    $parent = SectionTable::getList([
        'select' => ['IBLOCK_SECTION_ID'],
        'filter' => ['ID' => $arParams['SECTION_ID']],
        'cache' => ["ttl" => 3600],
    ])->fetch();

    if ($parent) {
        $filter = [
            'IBLOCK_ID' => $arParams['IBLOCK_ID'],
            'ACTIVE' => 'Y',
            'SECTION_ID' => $parent['IBLOCK_SECTION_ID'],
        ];
        $sections = CIBlockSection::GetList(['SORT' => 'ASC'], $filter, true, ['*']);
        while ($section = $sections->GetNext()) {
            $arResult['SECTIONS'][] = $section;
        }

        $arResult["SECTIONS_COUNT"] = count($arResult['SECTIONS']);
    }
}

foreach ($arResult['SECTIONS'] as $k => $section) {
    if ($section['ELEMENT_CNT'] === '0') {
        unset($arResult['SECTIONS'][$k]);
    }
}

if ($arResult['SECTIONS'][0]['IBLOCK_SECTION_ID']) {
    $filter = [
        'IBLOCK_ID' => $arParams['IBLOCK_ID'],
        'ACTIVE' => 'Y',
        'ID' => $arResult['SECTIONS'][0]['IBLOCK_SECTION_ID'],
    ];
    $sections = CIBlockSection::GetList(['SORT' => 'ASC'], $filter, true, ['*']);
    while ($section = $sections->GetNext()) {
        $arResult['SECTIONS'][] = [
            'NAME' => 'Назад',
            'SECTION_PAGE_URL' => $section['SECTION_PAGE_URL'],
        ];
    }
} elseif (!$arResult['SECTIONS'][0]['RELATIVE_DEPTH_LEVEL']) {
    $arResult['SECTIONS'][] = [
        'NAME' => 'Назад',
        'SECTION_PAGE_URL' => '/documents/',
    ];
}

template.php

<? use Bitrix\Main\Application;
use Bitrix\Main\Web\Uri;

if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) {
    die();
}
/** @var array $arParams */
/** @var array $arResult */
/** @global CMain $APPLICATION */
/** @global CUser $USER */
/** @global CDatabase $DB */
/** @var CBitrixComponentTemplate $this */
/** @var string $templateName */
/** @var string $templateFile */
/** @var string $templateFolder */
/** @var string $componentPath */
/** @var CBitrixComponent $component */
$this->setFrameMode(true);

$strSectionEdit = CIBlock::GetArrayByID($arParams["IBLOCK_ID"], "SECTION_EDIT");
$strSectionDelete = CIBlock::GetArrayByID($arParams["IBLOCK_ID"], "SECTION_DELETE");
$arSectionDeleteParams = ["CONFIRM" => GetMessage('CT_BCSL_ELEMENT_DELETE_CONFIRM')];

$APPLICATION->SetTitle($arResult['SECTION']['NAME'] ?: $APPLICATION->GetTitle());

if (0 < $arResult["SECTIONS_COUNT"]) {
    ?>
    <div class="aside_menu d-none d-xl-block">
        <ul class="menu_ul _clean">
            <?
            foreach ($arResult['SECTIONS'] as &$arSection) {
                if ($arSection['ELEMENT_CNT'] === '0') {
                    continue;
                } ?>
                <li class="menu_li">
                    <a class="menu_link<?=$APPLICATION->GetCurPage(false) === $arSection['SECTION_PAGE_URL'] ? ' active'
                        : ''?>"
                       href="<? echo $arSection['SECTION_PAGE_URL']; ?>"><? echo $arSection['NAME']; ?></a>
                </li>
            <? }
            unset($arSection);
            ?>
        </ul>
    </div>
<? } ?>