Документация

Свои типы свойств

В DevBx\Core\IblockProperty лежат семь пользовательских типов свойств инфоблока. Каждый — это класс с методом GetUserTypeDescription, который Битрикс спрашивает по событию iblock::OnIBlockPropertyBuildList.

Класс Название в админке USER_TYPE
PropertySite DEV-BX Привязка к сайту DEVBX_PROPERTY_SITE
PropertyMarkdown DEV-BX Markdown DEVBX_PROPERTY_MARKDOWN
PropertyLocation DEV-BX Местоположение DEVBX_PROPERTY_LOCATION
PropertyIbFilter DEV-BX Фильтр инфоблока DEVBX_PROPERTY_FILTER
PropertyStructured DEV-BX Структурированное поле DEVBX_PROPERTY_STRUCTURED
PropertyCheckbox DEV-BX Простой Checkbox DEVBX_PROPERTY_CHECKBOX
PropertyUtEnum DEV-BX Список пользовательского свойства DEVBX_PROPERTY_UT_ENUM

Какие включены сразу

Установщик модуля подписывает четыре типа, и часть — по наличию соседних модулей:

Тип Условие
Привязка к сайту, Markdown установлен iblock
Местоположение дополнительно установлен sale
Фильтр инфоблока дополнительно установлен catalog

Остальные три — структурированное поле, простой флажок и список пользовательского свойства — установщик не подписывает. Их подключает тот модуль, которому они понадобились:

php
\Bitrix\Main\EventManager::getInstance()->registerEventHandlerCompatible(
    'iblock',
    'OnIBlockPropertyBuildList',
    'my.module',
    \DevBx\Core\IblockProperty\PropertyStructured::class,
    'GetUserTypeDescription',
    1000,
);

Снимать подписку нужно в удалении своего модуля: тип, оставшийся без класса, ломает форму редактирования свойства.

У типов, которым нужен соседний модуль, есть isSupported() — им удобно проверять условие до подписки.

Что делает каждый

Привязка к сайту. Выбор сайта из списка. Прочитанные сайты держатся в памяти запроса, так что список из сотни элементов не превращается в сотню запросов.

Markdown. В базе лежит исходник разметки. В админке его правят в редакторе, а на публичной части сервер отдаёт готовый HTML через DevBx\Core\Markdown\Renderer: он экранирует сырую разметку внутри значения и отсекает опасные ссылки. Браузеру остаются формулы и подсветка кода. Свойство может быть множественным.

Местоположение. Значение — символьный код узла местоположений модуля sale. На публичной части показывается весь путь до узла, а не одно название.

Фильтр инфоблока. Значение — условия отбора товаров, которые собирают конструктором в админке. В настройках свойства выбирается инфоблок, по которому строятся условия. Свойство принудительно одиночное, не фильтруемое и не участвующее в поиске; на публичной части не показывается — это настроечное поле, а не текст для витрины.

Структурированное поле. Несколько полей в одном значении. В настройках задаётся список: код, название и тип поля — текст или «да/нет». В базе значение лежит одной строкой JSON. При чтении возвращается массив по кодам полей, причём всегда по всем полям из текущих настроек: убранное из настроек поле перестаёт читаться, добавленное приходит пустым у всех ранее заполненных элементов.

Простой флажок. Одно значение Y или пусто. Свойство принудительно одиночное, значение по умолчанию задаётся в настройках. В списке админки показывается «Да» или «Нет».

Список пользовательского свойства. Значения берутся из чужого пользовательского поля типа «список»: в настройках указываются объект (ENTITY_ID) и имя поля (FIELD_NAME). Удобно, когда один и тот же перечень уже описан пользовательским полем и заводить его копию в свойстве инфоблока не хочется.