Пользовательские свойства раздела инфоблока
Битрикс позволяет создавать пользовательские свойства для элементов инфоблока и пользовательские поля для разделов инфоблока, кроме тех, что доступны изначально. Давайте создадим два пользовательских поля для разделов инфоблока и посмотрим, как их можно получить, чтобы в дальнейшем использовать в шаблоне.
Это будут свойства для хранения мета-тегов 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']);
// массив значений полей приведенный в HTML безопасный вид
$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(
'Страница не найдена',
true,
true
);
}
// кэш не затронет все действия ниже, здесь работаем уже с другим $arResult
if (isset($arResult['ID'])) {
// устанавливаем мета-теги с помощью отложенной функции
$GLOBALS['APPLICATION']->SetPageProperty('description', $arResult['UF_SECT_DESCR']);
$GLOBALS['APPLICATION']->SetPageProperty('keywords', $arResult['UF_SECT_KEYWRD']);
}
}
Обратите внимание, что нативные компоненты Битрикс могут сами устанавливать мета-теги 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']);
}
/*...*/
}