Битрикс. Простой компонент «Структура разделов»

06.07.2018

Теги: $arResultCMSWeb-разработкаБитриксИнфоблокКомпонентМенюНавигацияРазделИнфоблокаСтруктура

На главной странице сайта, в правой колонке, надо вывести список категорий блога. Для решения это задачи используем простой компонент «Структура разделов», который предназначен для вывода списка разделов инфоблока. Как обычно, чтобы получить код вызова компонента со всеми параметрами, переходим на тестовую страницу и вызываем визуальный редактор. Выбираем в правой колонке компонент «Контент • Каталог • Структура разделов».

В настройках

  • оставляем шаблон по умолчанию .default
  • выбираем тип информационного блока
  • выбираем код информационного блока
  • задаем максимальную глубину разделов
  • не включать раздел в цепочку навигации
  • Копируем код вызова компонента и выходим без сохранения:

    <?php
    $APPLICATION->IncludeComponent(
        "bitrix:catalog.section.list",
        "",
        array(
            "ADD_SECTIONS_CHAIN" => "N",
            "CACHE_GROUPS" => "Y",
            "CACHE_TIME" => "36000000",
            "CACHE_TYPE" => "A",
            "COUNT_ELEMENTS" => "Y",
            "IBLOCK_ID" => "1",
            "IBLOCK_TYPE" => "content",
            "SECTION_CODE" => "",
            "SECTION_FIELDS" => array("", ""),
            "SECTION_ID" => $_REQUEST["SECTION_ID"],
            "SECTION_URL" => "",
            "SECTION_USER_FIELDS" => array("", ""),
            "SHOW_PARENT_NAME" => "Y",
            "TOP_DEPTH" => "2",
            "VIEW_MODE" => "LINE"
        )
    );
    ?>

    Комментируем в шаблоне local/templates/voguis_index/footer.php HTML-код вывода списка последних постов блога и вставляем на это место вызов компонента:

    <h3>Категории блога</h3>
    <ul class="blo-top">
        <li><a href="#">|| Lorem Ipsum passage</a></li>
        <li><a href="#">|| Finibus Bonorum et</a></li>
        <li><a href="#">|| Treatise on the theory</a></li>
        <li><a href="#">|| Characteristic words</a></li>
        <li><a href="#">|| combined with a handful</a></li>
        <li><a href="#">|| which looks reasonable</a></li>
    </ul>

    Переходим на главную страницу сайта, включаем режим правки и копируем шаблон компонента:

    Задаем имя шаблона blog_ctgs и выбираем куда копировать:

    Файл шаблона local/templates/voguis_index/footer.php был перезаписан, теперь вызов компонента выглядит так:

    <?php
    $APPLICATION->IncludeComponent(
        "bitrix:catalog.section.list",
        "blog_ctgs",
        array(
            "ADD_SECTIONS_CHAIN" => "N",     // Включать раздел в цепочку навигации
            "CACHE_GROUPS" => "Y",           // Учитывать права доступа
            "CACHE_TIME" => "36000000",      // Время кеширования (сек.)
            "CACHE_TYPE" => "A",             // Тип кеширования
            "COUNT_ELEMENTS" => "Y",         // Показывать количество элементов в разделе
            "IBLOCK_ID" => "1",              // Инфоблок
            "IBLOCK_TYPE" => "content",      // Тип инфоблока
            "SECTION_CODE" => "",            // Код раздела
            "SECTION_FIELDS" => array(       // Поля разделов
                0 => "",
                1 => "",
            ),
            "SECTION_ID" => $_REQUEST["SECTION_ID"], // ID раздела
            "SECTION_URL" => "",             // URL, ведущий на страницу с содержимым раздела
            "SECTION_USER_FIELDS" => array(  // Свойства разделов
                0 => "",
                1 => "",
            ),
            "SHOW_PARENT_NAME" => "Y",       // Показывать название раздела
            "TOP_DEPTH" => "2",              // Максимальная отображаемая глубина разделов
            "VIEW_MODE" => "LINE",           // Вид списка подразделов
        ),
        false
    );
    ?>

    Скопированный шаблон у нас теперь в директории local/templates/voguis_index/components/bitrix/catalog.section.list/blog_ctgs. Удаляем файл стилей style.css и открываем шаблон template.php на редактирование.

    Перед тем, как удалить из файла шаблона весь мусор, который напихали в него разработчики Битрикс, сохраним несколько полезных фрагментов:

    <?php
    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);
    // Вид списка подразделов из настроек компонента
    $arViewModeList = $arResult['VIEW_MODE_LIST'];
    
    // Все доступные варианты вывода списка
    $arViewStyles = array(
        'LIST' => array(
            // ..........
        ),
        'LINE' => array(
            // ..........
        ),
        'TEXT' => array(
            // ..........
        ),
        'TILE' => array(
            // ..........
        )
    );
    
    // Как будем выводить список: LIST, LINE, TEXT, TILE
    $arCurView = $arViewStyles[$arParams['VIEW_MODE']];
    
    // Редактировать или удалить раздел с морды сайта
    $strSectionEdit = CIBlock::GetArrayByID($arParams["IBLOCK_ID"], "SECTION_EDIT");
    $strSectionDelete = CIBlock::GetArrayByID($arParams["IBLOCK_ID"], "SECTION_DELETE");
    $arSectionDeleteParams = array("CONFIRM" => GetMessage('CT_BCSL_ELEMENT_DELETE_CONFIRM'));
    
    // Код ниже отвечает за вывод списка
    ?><ul class="<?php echo $arCurView['LIST']; ?>">
    <?php
        switch ($arParams['VIEW_MODE'])
        {
            case 'LINE':
                foreach ($arResult['SECTIONS'] as &$arSection)
                {
                    $this->AddEditAction($arSection['ID'], $arSection['EDIT_LINK'], $strSectionEdit);
                    $this->AddDeleteAction($arSection['ID'], $arSection['DELETE_LINK'], $strSectionDelete, $arSectionDeleteParams);
                    ?><li id="<?php echo $this->GetEditAreaId($arSection['ID']); ?>">
                    <a href="<?php echo $arSection['SECTION_PAGE_URL']; ?>" title="<?php echo $arSection['PICTURE']['TITLE']; ?>"></a>
                        <h2><a href="<?php echo $arSection['SECTION_PAGE_URL']; ?>"><?php echo $arSection['NAME']; ?></a><?
                    if ($arParams["COUNT_ELEMENTS"]) {
                        ?> <span>(<? echo $arSection['ELEMENT_CNT']; ?>)</span><?
                    }
                    ?></h2>
                    </li><?php
                }
                unset($arSection);
                break;
            case 'TEXT':
                foreach ($arResult['SECTIONS'] as &$arSection) { /* ... */ }
                unset($arSection);
                break;
            case 'TILE':
                foreach ($arResult['SECTIONS'] as &$arSection) { /* ... */ }
                unset($arSection);
                break;
            case 'LIST':
                foreach ($arResult['SECTIONS'] as &$arSection) { /* ... */ }
                unset($arSection);
                break;
        }
    ?>
    </ul>

    И пишем свой код

    <?php
    /*
     * Файл local/templates/voguis_index/components/bitrix/catalog.section.list/blog_ctgs/template.php
     */
    
    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 = array('CONFIRM' => GetMessage('CT_BCSL_ELEMENT_DELETE_CONFIRM'));
    ?>
    
    <ul class="blo-top">
    <?php foreach ($arResult['SECTIONS'] as $arSection): ?>
        <?php
        $this->AddEditAction($arSection['ID'], $arSection['EDIT_LINK'], $strSectionEdit);
        $this->AddDeleteAction($arSection['ID'], $arSection['DELETE_LINK'], $strSectionDelete, $arSectionDeleteParams);
        ?>
        <li id="<?php echo $this->GetEditAreaId($arSection['ID']); ?>">
            <a href="<?php echo $arSection['SECTION_PAGE_URL']; ?>">||
                <?php echo $arSection['NAME']; ?>
                <?php if ($arParams['COUNT_ELEMENTS']): /* показывать кол-во элементов в разделе? */ ?>
                    <span>(<?php echo $arSection['ELEMENT_CNT']; ?>)</span>
                <?php endif; ?>
            </a>
        </li>
    <?php endforeach; ?>
    </ul>

    Дополнительно

    Поиск: $arResult • CMS • IncludeComponent • Web-разработка • catalog.section.list • Битрикс • Инфоблок • Компонент • Меню • Навигация • Простой компонент • Раздел инфоблока • Структура • Структура разделов

    Каталог оборудования
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
    Производители
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
    Функциональные группы
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.