Дата последнего изменения: 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.