Свойства страницы и раздела
Свойства страницы и раздела хранят служебные значения для шаблона сайта, компонентов и кода страницы. Через свойства задают SEO-метаданные, заголовок окна браузера и другие значения, которые отличаются на страницах и в разделах сайта.
Свойства страницы действуют только на текущей странице. Свойства раздела задают значения для папки сайта и наследуются вложенными страницами и подразделами, если у них нет собственных значений.
Как устроены свойства
Свойство страницы. Относится к одному файлу страницы. Например, страница каталога хранит значение свойства description, которое шаблон выводит в HTML-метатег.
Свойство раздела. Относится к папке сайта и хранится в файле .section.php этой папки. Если вложенная страница не задает собственное значение, система берет значение из ближайшего раздела выше.
Тип свойства. Это код, по которому система записывает, читает и выводит значение. Администратор настраивает набор типов свойств отдельно для каждого сайта.
Добавить тип свойства
Чтобы редакторы могли заполнять свойства через интерфейс, добавьте нужные типы свойств в настройках модуля Управление структурой.
-
В административном разделе откройте страницу Настройки > Настройки продукта > Настройки модулей > Управление структурой.
-
На вкладке Настройки в секции Настройки для сайтов найдите параметр Типы свойств.
-
В колонке Тип введите код свойства латинскими буквами. В колонке Название укажите понятное название. Например, для SEO добавьте
keywords— Ключевые слова иdescription— Описание страницы.
Для SEO-метаданных тип свойства должен совпадать с именем HTML-метатега:
-
keywordsдля тега<meta name="keywords">, -
descriptionдля тега<meta name="description">.
Чем свойства отличаются от заголовка страницы
Основной заголовок страницы хранится отдельно от свойств страницы и раздела. Его задают методом SetTitle() и получают методом GetTitle().
Свойство title — зарезервированное свойство страницы. Обычно его используют для заголовка окна браузера, который выводится в теге <title> шаблона сайта. Это не второй самостоятельный заголовок, а обычное свойство страницы с особым назначением.
Подробнее о разнице между основным заголовком и свойством title читайте в статье Заголовки страницы: на сайте и в браузере.
Задать свойства страницы
Свойства страницы задают через интерфейс или в коде. Значение страницы имеет приоритет над значением раздела с таким же типом свойства.
Свойства страницы через публичную часть
-
Откройте страницу на просмотр в публичном разделе сайта.
-
Нажмите Изменить страницу > Заголовок и свойства страницы на административной панели.

-
Заполните свойства и сохраните страницу.

Свойства страницы через административную часть
-
Откройте Контент > Структура сайта > Файлы и папки.
-
Перейдите в папку, в которой размещена страница.
-
Нажмите Редактировать как HTML или Редактировать как текст в меню нужной страницы.

-
Заполните свойства и сохраните страницу.

Свойства страницы через API
Чтобы задать свойство текущей страницы, вызовите SetPageProperty(property_id, property_value, Options) в коде страницы или компонента.
-
property_id— код свойства. -
property_value— значение свойства. -
Options— массив с дополнительными настройками свойства, необязательный параметр.
Чтобы форма Заголовок и свойства страницы могла прочитать и изменить свойства, разместите вызовы в первом PHP-блоке файла страницы. Запишите каждый вызов на одной строке и передайте код и значение свойства строковыми литералами, без переменных, конкатенации и третьего аргумента.
Добавьте свойства после подключения /bitrix/header.php, до закрывающего ?> первого PHP-блока.
<?php
require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php');
$APPLICATION->SetPageProperty('keywords', 'Ключевые слова');
$APPLICATION->SetPageProperty('description', 'SEO описание');
$APPLICATION->SetPageProperty('title', 'Заголовок окна браузера');
?>
Свойства страницы можно задавать динамически в коде страницы или компонента. Такие вызовы работают при выполнении PHP, но форма редактирования не извлекает из них значения. Управляйте ими в коде.
Пример. Компонент передает в description значение свойства элемента инфоблока с кодом META_DESCRIPTION. Массив $arIBlockElement содержит данные элемента и его свойства.
<?php
$APPLICATION->SetPageProperty(
'description',
$arIBlockElement['PROPERTIES']['META_DESCRIPTION']['VALUE']
);
?>
Задать свойства раздела
Свойства раздела задают значения по умолчанию для страниц и подразделов внутри папки. Если на странице нет собственного свойства, система использует значение ближайшего вышестоящего раздела.
Свойства раздела через публичную часть
-
Откройте раздел в публичной части сайта.
-
Нажмите Изменить раздел > Заголовок и свойства страницы на административной панели.

-
Заполните свойства и сохраните изменения.

Свойства раздела через административную часть
-
Откройте Контент > Структура сайта > Файлы и папки в административном разделе.
-
Перейдите к папке, которая содержит ваш раздел.
-
Нажмите Свойства папки в меню раздела.

-
Заполните свойства и сохраните изменения.

Свойства раздела через API
Чтобы сохранить свойства раздела для следующих запросов, отредактируйте файл .section.php соответствующей папки или сохраните свойства через интерфейс. В файле массив $arDirProperties задает свойства, а переменная $sSectionName — название раздела для навигационной цепочки. Форма Свойства папки записывает в $sSectionName значение поля Заголовок. Эта переменная не заменяет свойство title для окна браузера.
Создайте файл /products/.section.php со свойствами и названием раздела.
<?php
$sSectionName = 'Продукция';
$arDirProperties = [
'description' => 'SEO описание для всего раздела',
'keywords' => 'Ключевые слова для всего раздела',
'title' => 'Заголовок окна браузера для всего раздела',
];
?>
Метод SetDirProperty(property_id, property_value, path) меняет значение только в памяти на время текущего запроса. Он не записывает данные в .section.php. Используйте его, чтобы временно переопределить свойство раздела перед чтением или выводом, например задать описание из данных компонента.
-
property_id— код свойства. -
property_value— значение свойства. -
path— путь к разделу. Если путь не передан, метод использует текущий раздел.
Задайте описание текущего раздела без параметра path.
<?php
$APPLICATION->SetDirProperty('description', 'Описание раздела для текущего запроса');
?>
Методы GetProperty(), ShowProperty() и ShowMeta() учтут это значение, если страница не задает собственное свойство description.
Если передаете путь другого раздела в SetDirProperty(), передайте тот же путь в GetDirProperty() при чтении. Без пути GetDirProperty() читает текущий раздел, поэтому установка значения для /products/ не меняет описание страницы из другого раздела.
Пример. Код задает и получает временное описание раздела /products/ независимо от расположения текущей страницы.
<?php
$APPLICATION->SetDirProperty('description', 'Временное описание продукции', '/products/');
$description = $APPLICATION->GetDirProperty('description', '/products/');
?>
Получить свойства в коде
Если значение используется в логике страницы или компонента, получите его одним из методов чтения.
GetPageProperty()
Метод GetPageProperty(property_id, default_value) возвращает свойство страницы.
-
property_id— код свойства. -
default_value— значение по умолчанию. Метод возвращает его, если свойство страницы не найдено.
<?php
$keywords = $APPLICATION->GetPageProperty('keywords');
$description = $APPLICATION->GetPageProperty('description', 'Значение по умолчанию');
$title = $APPLICATION->GetPageProperty('title');
?>
GetDirProperty()
Метод GetDirProperty(property_id, path, default_value) возвращает свойство раздела.
-
property_id— код свойства. -
path— путь к разделу. Если путь не передан, метод использует текущий раздел. -
default_value— значение по умолчанию.
<?php
$keywords = $APPLICATION->GetDirProperty('keywords');
$description = $APPLICATION->GetDirProperty('description', false, 'Значение по умолчанию');
$title = $APPLICATION->GetDirProperty('title');
?>
GetProperty()
Метод GetProperty(property_id, default_value) сначала проверяет свойство текущей страницы. Если свойство не найдено, метод ищет свойство раздела с учетом наследования.
-
property_id— код свойства. -
default_value— значение по умолчанию. Метод возвращает его, если свойство не найдено ни на странице, ни в разделе.
<?php
$keywords = $APPLICATION->GetProperty('keywords');
$description = $APPLICATION->GetProperty('description', 'Значение по умолчанию');
$title = $APPLICATION->GetProperty('title');
?>
Вывести свойства в шаблоне сайта
Выберите способ вывода по назначению свойства. ShowProperty() выводит само значение, а ShowMeta() формирует HTML-метатег.
Вывод значения свойства
Чтобы вывести свойство, используйте ShowProperty(property_id, default_value). Метод отображает значение свойства страницы с учетом свойств раздела.
-
property_id— код свойства. -
default_value— значение по умолчанию. Система выведет его, если свойство не найдено.
<?php $APPLICATION->ShowProperty('description', 'Описание по умолчанию'); ?>
Отдельных методов вывода только свойства страницы или только свойства раздела нет. Метод ShowProperty() работает с общим результатом: сначала учитывает свойство страницы, затем свойство раздела и значение по умолчанию.
ShowProperty() выводит значение без HTML-экранирования. Для вывода обычного текста экранируйте значение через htmlspecialcharsbx(). Если свойство задают ниже по коду страницы, выполните чтение и экранирование в отложенной функции через AddBufferContent(), как в примере ниже.
Вывод свойства в виде метатега
Для SEO-метаданных используйте ShowMeta(id, meta_name, bXhtmlStyle).
-
id— код свойства. По умолчанию метод использует код как значение атрибутаnameв HTML-метатеге. -
meta_name— другое значение для атрибутаname. -
bXhtmlStyle— признак использования XHTML-формата для тега.
В шаблоне с ShowHead() метатеги keywords и description уже входят в общий вывод содержимого <head>. Дополнительные вызовы ShowMeta() для этих свойств создадут дубли. Используйте отдельные вызовы, если шаблон формирует содержимое <head> без ShowHead().
Разместите отдельные вызовы внутри тега <head> в файле шаблона header.php.
<head>
<?php $APPLICATION->ShowMeta('keywords'); ?>
<?php $APPLICATION->ShowMeta('description'); ?>
</head>
Система сформирует HTML-метатеги:
<meta name="keywords" content="женская одежда, мужская одежда, доставка" />
<meta name="description" content="Мы доставляем нашу продукцию собственной службой доставки" />
ShowMeta() экранирует значение свойства для атрибута content и имя метатега для атрибута name. Если значение свойства не задано или пустое, метод не выведет метатег.
Учесть отложенный вывод
Методы GetPageProperty(), GetDirProperty() и GetProperty() сразу возвращают значение свойства в момент вызова. Если компонент установит свойство позже через SetPageProperty(), ранний вызов GetPageProperty() вернет значение по умолчанию или false. В тех же условиях GetProperty() в header.php вернет значение раздела с учетом наследования, а если его нет — значение по умолчанию. После SetPageProperty() новый вызов GetProperty() вернет значение страницы.
Для вывода в шаблоне используйте ShowProperty() и ShowMeta(). Эти методы откладывают чтение свойства до завершения формирования страницы, поэтому учитывают значения, которые компонент задает после подключения header.php.
Как работает буферизация
В обычном запросе публичной страницы Bitrix Framework накапливает HTML в буфере вывода PHP. Буфер хранит результат выполнения шаблона и страницы до отправки в браузер.
Метод AddBufferContent(callback, ...args) регистрирует отложенную функцию в месте вызова. Первый аргумент — вызываемая функция или метод, остальные аргументы система передает этой функции при выполнении.
-
AddBufferContent()сохраняет накопленный HTML, место для результата функции и ее аргументы. -
PHP продолжает выполнять страницу и компоненты. Они могут установить или изменить свойства.
-
При завершении буферизации
EndBufferContent()вызывает зарегистрированные функции и вставляет возвращенные строки на сохраненные места. -
Система объединяет фрагменты HTML и отправляет готовую страницу в браузер.
ShowProperty() регистрирует через AddBufferContent() вызов GetProperty(), а ShowMeta() — вызов GetMeta(), который читает свойство и формирует метатег. ShowHead() также использует этот механизм для метатегов.
Если константа BX_BUFFER_USED не определена или не равна true, AddBufferContent() выполняет функцию сразу. Значения, которые код задаст позже, в таком режиме не попадут в ранний вывод.
В header.php вызовите ShowHead() внутри <head>.
<head>
<?php $APPLICATION->ShowHead(); ?>
</head>
В файле страницы после подключения /bitrix/header.php задайте описание.
<?php
$APPLICATION->SetPageProperty('description', 'SEO описание из компонента');
?>
При включенной буферизации метатег description получит значение SEO описание из компонента, хотя вызов ShowHead() расположен выше установки свойства.
Вывести свойство с экранированием
Для обычного текста зарегистрируйте свою функцию через AddBufferContent(). Функция должна возвращать готовую строку, а не выводить ее через echo. Читайте свойство внутри функции, чтобы получить его значение после выполнения компонентов.
Добавьте в header.php отложенный вывод описания с HTML-экранированием.
<?php
$APPLICATION->AddBufferContent(function () use ($APPLICATION)
{
return htmlspecialcharsbx($APPLICATION->GetProperty('description', ''));
});
?>
Если получить значение через GetProperty() заранее и передать готовую строку в отложенную функцию, последующая установка свойства не изменит эту строку.
Учесть приоритет значений
Для одного типа свойства система использует самое близкое значение к текущей странице.
-
Если значение задано на странице, оно имеет наивысший приоритет.
-
Если на странице значения нет, система проверяет свойства текущего раздела.
-
Если в текущем разделе значения нет, система проверяет вышестоящие разделы до корня сайта.
-
Если значение не найдено, система использует значение по умолчанию, которое передают в метод.
-
Если значение по умолчанию не передали, свойство остается незаданным.
Такой порядок позволяет задать общие свойства для раздела и переопределить их на отдельных страницах.