Свои типы свойств
В 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 |
Остальные три — структурированное поле, простой флажок и список пользовательского свойства — установщик не подписывает. Их подключает тот модуль, которому они понадобились:
\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). Удобно, когда
один и тот же перечень уже описан пользовательским полем и заводить его копию в свойстве
инфоблока не хочется.