Битрикс. Пользовательские поля раздела инфоблока

17.10.2018

Теги: CMScomponent_epilog.phpWeb-разработкаБитриксИнфоблокОтложенныеФункцииПользовательскиеСвойстваРазделИнфоблока

Битрикс позволяет создавать пользовательские свойства для элементов инфоблока и пользовательские поля для разделов инфоблока, кроме тех, что доступны изначально. Давайте создадим два пользовательских поля для разделов инфоблока и посмотрим, как их можно получить, чтобы в дальнейшем использовать в шаблоне.

Это будут свойства для хранения мета-тегов description и keywords. В панели управления переходим на страницу управления разделами и элементами инфоблока

И вызываем форму редактирования какого-нибудь раздела. Переходим на вкладку «Доп.поля»:

Создаем два поля:

  • UF_SECT_DESCR — для хранения мета-тега description
  • UF_SECT_KEYWRD — для хранения мета-тега keywords

Чтобы получить пользовательские поля в коде компонента:

/*...*/
if ($this->StartResultCache(false, $cacheDependence)) {
    // какие поля раздела инфоблока выбираем
    $arSelect = array(
        'ID',
        'NAME',
        'DESCRIPTION',
        'UF_*' // получаем пользовательские поля
    );

    // условия выборки раздела инфоблока
    $arFilter = array(
        'IBLOCK_ID' => $arParams['IBLOCK_ID'],
        'ACTIVE' => 'Y',
        'ID' => $arParams['SECTION_ID']
    );

    // выполняем запрос к базе данных
    $rsSection = CIBlockSection::GetList(array(), $arFilter, false, $arSelect);
    // устанавливаем шаблон пути для раздела, вместо того,
    // который указан в настройках информационного блока
    $rsSection->SetUrlTemplates('', $arParams['SECTION_URL']);
    $arResult = $rsSection->GetNext();
    
    if (isset($arResult['ID'])) { // данные получены успешно?
        /*...*/
        $this->SetResultCacheKeys(
            array(
                'ID',
                'UF_SECT_DESCR',
                'UF_SECT_KEYWRD'
            )
        );
        $this->IncludeComponentTemplate();
    } else { // какие-то проблемы
        $this->AbortResultCache();
        \Bitrix\Iblock\Component\Tools::process404(
            trim($arParams['MESSAGE_404']) ?: 'Раздел инфоблока не найден',
            true,
            $arParams['SET_STATUS_404'] === 'Y',
            $arParams['SHOW_404'] === 'Y',
            $arParams['FILE_404']
        );
    }
}
/*...*/

Теперь можем установить значения мета-тегов для страницы раздела инфоблока — либо ниже по коду компонента:

/*...*/
if ($this->StartResultCache(false, $cacheDependence)) {
    /*
     * Здесь код, который получает данные о разделе инфоблока из базы данных
     */

    if (isset($arResult['ID'])) { // данные получены успешно?
        /*...*/
        $this->SetResultCacheKeys(
            array(
                'ID',
                'UF_SECT_DESCR',
                'UF_SECT_KEYWRD'
            )
        );
        $this->IncludeComponentTemplate();
    } else { // какие-то проблемы
        $this->AbortResultCache();
        \Bitrix\Iblock\Component\Tools::process404(/*...*/);
    }
}

// кэш не затронет все действия ниже, здесь работаем уже с другим $arResult
if (isset($arResult['ID'])) {
    // устанавливаем мета-теги с помощью отложенной функции
    $GLOBALS['APPLICATION']->SetPageProperty('description', $arResult['UF_SECT_DESCR']);
    $GLOBALS['APPLICATION']->SetPageProperty('keywords', $arResult['UF_SECT_KEYWRD']);
}

либо в файле component_epilog.php, который никогда не кешируется:

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

// устанавливаем мета-теги с помощью отложенной функции
$GLOBALS['APPLICATION']->SetPageProperty('description', $arResult['UF_SECT_DESCR']);
$GLOBALS['APPLICATION']->SetPageProperty('keywords', $arResult['UF_SECT_KEYWRD']);

Отложенные функции — технология, позволяющая задавать заголовок страницы, пункты навигационной цепочки, CSS стили, дополнительные кнопки в панель управления, мета-теги и т.п. с помощью функций, используемых непосредственно в теле страницы. Соответствующие результаты работы этих функций выводятся в прологе, то есть выше по коду, чем они были заданы.

Технология была создана в первую очередь для использования в компонентах, которые, как правило, выводятся в теле страницы, но при этом внутри них могут быть заданы заголовок страницы, добавлен пункт в навигационную цепочку, добавлена кнопка в панель управления и так далее. Отложенные функции нельзя использовать в файлах шаблона компонента template.php и result_modifier.php (так как результаты их выполнения кешируются).

Обратите внимание, что нативные компоненты Битрикс могут сами устанавливать мета-теги descriptoin и keywords. И тем самым переопределять значения, установленные в component_epilog.php. Вот типичный код нативного компонента:

/*...*/
if ($this->StartResultCache(false, $cacheDependence)) {
    /*...*/
    $this->SetResultCacheKeys(
        array(
            'ID',
            'IBLOCK_ID',
            'NAME',
            'PATH',
            'IPROPERTY_VALUES'
        )
    );
    // подключаем шаблон компонента
    $this->IncludeComponentTemplate();
}

// этот код отработает уже после кода component_epilog.php
if (isset($arResult['ID'])) {
    /*...*/
    // установить мета-тег keywords?
    if ($arParams['SET_META_KEYWORDS'] == 'Y' && $arResult['IPROPERTY_VALUES']['SECTION_META_KEYWORDS'] != '') {
        $APPLICATION->SetPageProperty('keywords', $arResult['IPROPERTY_VALUES']['SECTION_META_KEYWORDS']);
    }
    // установить мета-тег description?
    if ($arParams['SET_META_DESCRIPTION'] == 'Y' && $arResult['IPROPERTY_VALUES']['SECTION_META_DESCRIPTION'] != '') {
        $APPLICATION->SetPageProperty('description', $arResult['IPROPERTY_VALUES']['SECTION_META_DESCRIPTION']);
    }
    /*...*/
}

Пользовательские поля других объектов

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

Необходимо отличать Пользовательские поля в модулях Битрикс и свойства, используемые в рамках инфоблоков, хотя для обозначения этих сущностей используется один термин — пользовательские свойства. Пользовательское поле — сущность более универсальная, так как их можно задать для разных объектов системы (в отличие от свойств элементов инфоблока). Но более ограниченная по возможностям, так как имеет небольшое число типов данных.

Применение пользовательских полей в Битрикс в привязке к тем или иным модулям, задаётся с помощью объектов, которые необходимо указать при создании поля. Не все модули имеют объекты для пользовательских полей по умолчанию. Разработчик может создавать собственные объекты, но надо понимать, что в методах GetList() поддерживаются только системные объекты:

Штатные объекты пользовательских полей
Модуль Объект Описание
Главный модуль USER для пользователя
Блоги BLOG_BLOG для блога
BLOG_POST для сообщения в блоге
BLOG_COMMENT для комментария сообщения
Задачи TASKS_TASK для задач
Информационные блоки IBLOCK_N_SECTION для секций инфоблока с ID=N
IBLOCK_N Для инфоблока с ID=N
Календарь CALENDAR_EVENT для событий календаря
Обучение LEARN_ATTEMPT для попыток теста
Социальная сеть SONET_GROUP для групп соцсети
Библиотека документов WEBDAV для библиотек документов
Форум FORUM_MESSAGE для сообщений форума
Highload-блоки HLBLOCK_N для highload-блока с ID=N

Поиск: CMS • Web-разработка • Битрикс • Инфоблок • Пользовательские свойства • Раздел инфоблока • result_modifier.php • component_epilog.php • SetResultCacheKeys • Отложенные функции

Каталог оборудования
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.