Битрикс: API D7 SEO-шаблоны Title

В битриксе есть встроенная гибкая система управления SEO-данными страниц, основанных на инфоблоках. По традиции куцая документация для разработчика. Хотя есть и более продуманная документация для пользователя. В этой заметке опишу на примере одного поля - Title (заголовок окна браузера) - как управляться с этими шаблонами из кода.

Есть возможность дать шаблоны на разных уровнях - будет взят первый из наиболее приоритетных. Самый общий шаблон, который есть - шаблон Title на уровне инфоблока.

Если для раздела не найдётся ничего более точного, то Title будет формироваться на базе этого шаблона из инфоблока.

Получить установленное значение шаблона для Title разделов в инфоблоке можно так:

if ($iblockId > 0 && \Bitrix\Main\Loader::includeModule('iblock')) {
    $ipropTemplates = new \Bitrix\Iblock\InheritedProperty\IblockTemplates($iblockId);
    $templates = $ipropTemplates->findTemplates();
    if (isset($templates['SECTION_META_TITLE'])) {
        echo '<pre>';
        print_r($templates['SECTION_META_TITLE']);
        echo '</pre>';
    }
}

Это выведет массив данных вида:

Array
(
    [ID] => 2175
    [CODE] => SECTION_META_TITLE
    [TEMPLATE] => Мой шаблон Title из настроек инфоблока
    [ENTITY_TYPE] => B
    [ENTITY_ID] => 12
    [INHERITED] => N
)

Но если шаблон не задан, то ничего не выведется. 

Задать значение шаблона Title для всех разделов в инфоблоке в коде можно так:

if ($iblockId > 0 && \Bitrix\Main\Loader::includeModule('iblock')) {
    $ipropTemplates = new \Bitrix\Iblock\InheritedProperty\IblockTemplates($iblockId);
    $ipropTemplates->set(['SECTION_META_TITLE' => 'Новый шаблон Title разделов в инфоблоке']);
}

Следующий уровень, на котором можно работать с шаблоном Title для разделов - это на уровне самого раздела инфоблока. 

if ($iblockId > 0 && $sectionId > 0 && \Bitrix\Main\Loader::includeModule('iblock')) {
    $ipropTemplates = new \Bitrix\Iblock\InheritedProperty\SectionTemplates($iblockId, $sectionId);
    $templates = $ipropTemplates->findTemplates();
    if (isset($templates['SECTION_META_TITLE'])) {
        echo '<pre>';
        print_r($templates['SECTION_META_TITLE']);
        echo '</pre>';
    }
}

Выхлоп будет в аналогичном виде, как было для инфоблока:

Array
(
    [ID] => 2173
    [CODE] => SECTION_META_TITLE
    [TEMPLATE] => {=this.Name}, цены в Магазин.Ру
    [ENTITY_TYPE] => S
    [ENTITY_ID] => 24
    [INHERITED] => N
)

В этих шаблонных данных ENTITY_TYPE может быть одним из следующих значений:

  • B - инфоблок
  • S - раздел инфоблока
  • E - элемент инфоблока

Для шабона Title в разделе появляется смысл в параметре INHERITED - переключает сферу применения шаблона - либо только на текущий раздел (N), либо также на все его дочерние подразделы (Y)

Задать значение шаблона Title для разделов в инфоблока в коде можно так:

if ($iblockId > 0 && \Bitrix\Main\Loader::includeModule('iblock')) {
    $ipropTemplates = new \Bitrix\Iblock\InheritedProperty\SectionTemplates($iblockId, $sectionId);
    $ipropTemplates->set([
        'SECTION_META_TITLE' => 'Новый шаблон Title раздела и всех подразделов',
        'INHERITED' => 'Y',
    ]);
}

Дале по иерархии можно посмотреть и задать шаблон Title для элементов инфоблока - по аналогии, как это делается для раздела.

if ($iblockId > 0 && $elementId > 0 && \Bitrix\Main\Loader::includeModule('iblock')) {
    $ipropTemplates = new \Bitrix\Iblock\InheritedProperty\ElementTemplates($iblockId, $elementId);
    $templates = $ipropTemplates->findTemplates();
    if (isset($templates['SECTION_META_TITLE'])) {
        echo '<pre>';
        print_r($templates['SECTION_META_TITLE']);
        echo '</pre>';
    }
} 

Если у элемента нет своего собственного шаблона - ищется шаблон у раздела; если у раздела (или любого родительского раздела) нет шаблона, ищется шаблон в инфоблоке.

Комментарии

Популярные сообщения из этого блога

Пропорциональное распределение суммы

Битрикс: своя геолокация

Bitrix24 API - разбор демо приложения третьего типа