Дата последнего изменения: 09.11.2023
Начиная с версии 14.0.0, в форме редактирования инфоблока, его разделов и элементов доступна вкладка SEO. Данный функционал основан на паре следующих технологий:
Рассмотрим детально каждую из этих технологий.
Все шаблоны, которые наследуются для вычисляемых наследуемых свойств, хранятся в таблице b_iblock_iproperty. Таблица одна, но в ней хранятся шаблоны для трех сущностей: для элементов, для разделов и для инфоблоков.

Шаблоны привязываются к инфоблоку, разделу или элементу через пару полей: ENTITY_TYPE и ENTITY_ID. Чтобы определить какие шаблоны для какой сущности находятся, происходит внутренний поиск, используя существующие таблицы инфоблоков. Вычисленные значения хранятся в трех разных табличках: отдельно для элементов, отдельно для разделов и отдельно для инфоблоков.
При манипуляциях с данными таблички b_iblock_iproperty (когда мы шаблон изменяем, удаляем, добавляем) никаких вычислений не производится, выполняется только сброс вычисленных ранее дочерних значений. Операция вычисления откладывается до момента востребования (чтения) значений. В этот момент происходит поиск шаблонов снизу вверх по иерархии инфоблоков (для элемента это будут шаблоны собственно элемента, его разделов вверх до корневого и шаблоны инфоблока). Затем шаблоны вычисляются и полученные значения сохраняются в таблицы кеша, откуда и будут браться при последующих операциях чтения.
Классы наследуемых свойств используют всю мощь ООП и принадлежат новому ядру D7. Они лежат в пространстве имён Bitrix\Iblock\InheritedProperty. Пользоваться ими достаточно просто:
use Bitrix\Iblock\InheritedProperty;
//ООП ElementTemplates или SectionTemplates или IblockTemplates ))
$ipropTemplates = new InheritedProperty\ElementTemplates($IBLOCK_ID, $ELEMENT_ID);
//Установить шаблон для элемента
$ipropTemplates->set(array(
"MY_PROP_CODE" => "{=this.Name}",
"SOME_CODE" => "", //Удалить шаблон
));
//Получить шаблоны для "редактирования"
$templates = $ipropTemplates->findTemplates();
//Удалить все собственные шаблоны элемента
$ipropTemplates->delete();
//ООП ElementValues или SectionValues или IblockValues ))
$ipropValues = new InheritedProperty\ElementValues($IBLOCK_ID, $ELEMENT_ID);
//Получить значения
$values = $ipropValues->getValues();
echo $values [" MY_PROP_CODE "];
//Сбросить кеш
$ipropValues->clearValues();
Шаблоны строятся независимо от механизма хранения, что позволяет использовать динамичные формы. Для построения шаблона используются следующие составляющие:
{=this.Name}). Такой псевдообъектный синтаксис позволил реализовать экономную модель с отложенными запросами данных. В шаблоне могут использоваться следующие области: this, parent, sections, iblock, property или catalog. Поля могут быть самыми разными: name, code, previewtext, detailtext, property_CODE и т.д. (см. файлы с классами в папке /bitrix/modules/iblock/lib). Количество запросов к БД напрямую зависит от количества областей, использованных в шаблоне.{=concat " \ " "!" iblock.name sections.name this.name}). Есть набор встроенных функций (upper, lower, translit, concat, limit, contrast, min, max и distinct) и событие OnTemplateGetFunctionClass, которое позволяет написать собственную функцию (см. пример функции).Шаблоны могут иметь модификаторы: приведение к нижнему регистру (/l) и транслитерация (/t-). В интерфейсе вкладки SEO они представлены отдельными чекбоксами.
Кроме того, все шаблоны поддерживают вложенность. Например:
//Для элемента берутся анонсовый и детальный тексты его раздела, соединяются вместе, затем выбираются
//первые 50 слов. После чего они соединяются с первыми 50 словами текста анонса элемента.
//Из них выбирается 20 самых контрастных и все они приводятся к нижнему регистру.
{=lower {=contrast 20 " .,?!" {=limit 50 " .,?!" this.previewtext} {=limit 50 " .,?!" parent.previewtext parent.detailtext}}}
Рассмотрим пример кода шаблона:
use Bitrix\Iblock\Template;
//Подключение модуля инфоблоков.
if (\Bitrix\Main\Loader::includeModule('iblock'))
{
//Задаём шаблон.
$template = "Name: {=this.Name}. Code:{=this.code}";
//Исходные данные будем брать из элемента.
$entity = new Template\Entity\Element($ELEMENT_ID);
//Не забываем про безопасность.
echo \Bitrix\Main\Text\HtmlFilter::encode(
//Вычисляем значение по шаблону.
Template\Engine::process($entity, $template)
);
}
Должен быть создан объект entity. Парсинг и вычисление шаблона обернуто статическим методом process, в который передаются entity и template. Кроме того, метод process можно использовать в цикле с одним entity по разным template, причем данные будут «переиспользованы», т.е. лишних запросов не будет. Также обратите внимание на метод htmlEncode, который используется для формирования безопасного html.