Немного теории
Когда может потребоваться создание своего типа поля.
- Если требуется отображать что-то, что не умеют стандартные типы полей (валюта, выбор цвета, привязка только к компаниям одного типа).
- Если требуется применить дополнительную логику для поля (связанные поля).
Как создать собственный тип.
- Создать класс для своего типа поля. Может быть унаследован от одного из стандартных типов или напрямую от Bitrix\Main\UserField\Types\BaseType.
- В классе обязательно объявить константу USER_TYPE_ID, она будет содержать в себе уникальный код типа поля.
- Должен присутствовать метод getDescription. Метод возвращает массив, описывающий тип поля.
- Зарегистрировать обработчик события main:OnUserTypeBuildList на GetUserTypeDescription. Метод существует в родительском классе и возвращает объединенный результат из методов getDescription и getBaseUserTypeDescription.
Можно задать свои настройки для поля, заменяя стандартные классы, отвечающие за ту или иную функциональность.
Какие методы могут быть в классе типа поля.
- указание типа поля для базы данных (getDbColumnType);
- подготовка перед сохранением настроек поля (prepareSettings);
- валидация значения (checkFields);
- установка значения по умолчанию (getDefaultValue);
- отрисовка поля в момент просмотра (getPublicView);
- отрисовка поля в момент редактирования (getPublicEdit);
- получение строкового значения (getPublicText);
- отрисовка дополнительных настроек поля (getSettingsHtml).
Чтобы написать свою верстку для поля, можно передавать ее напрямую из методов, перечисленных выше, но это не очень приветствуется. Верстку полей принято хранить в компонентах. Название используемого компонента должно храниться в константе класса RENDER_COMPONENT.
В компоненте будет несколько шаблонов и их названия фиксированы. Платформа сообщает контекст, исходя из которого отрисовывается нужный шаблон компонента. Под каждый описанный выше метод в классе есть свой шаблон.
Основные шаблоны:
- main.admin_settings - для отображения extra настроек поля (например, минимальное/максимальное значение для числовых полей);
- main.edit - вид поля при его редактировании;
- main.view - вид поля при его просмотре;
- main.public_text - возвращает текстовое представление сохраненного значения, используется при экспорте.
class.php компонента должен быть унаследован BaseUfComponent и минимально содержать только один метод getUserTypeId, возвращающий код типа поля. Любые вычисления и логика в данном случае будут располагаться в result_modifier.php конкретных шаблонов.
Стандартно нет поддержки кастомных типов полей в фильтре списка у любой сущности.
ККроме того, можно подменять стандартные типы полей на свои через регистрацию обработчика на заменяемый тип поля до того, как это сделает ядро (решается через сортировку обработчиков). Но так делать нежелательно из-за возможных потенциальных ошибок, связанных с обновлением портала в будущем.
Практика
Типовые задачи, решаемые созданием своего типа пользовательского поля
Вывести что-то, чего нет в стандартных типах. Например:
- Поле привязки к компаниям только определенного типа.
- Поле валюты. Стандартного поля валюты нет, можно реализовать через списки, но если нужно смотреть в справочник валют, то реализация только через свой тип поля.
- Составное денежное поле. Одно поле валюты, несколько полей с суммами. Ко всем денежным автоматически присваивается нужная валюта.
Пример: добавить тип пользовательского поля "валюта".
Свой тип данных позволяет оформлять ввод/вывод информации в самом разном виде.
Решим задачу – предоставить возможность указывать предпочитаемую валюту у CRM-сущностей. Список доступных для выбора валют должен формироваться из списка валют модуля «Валюты».
Также реализуем возможность управлять форматом отображения валют.
Для решения необходимо:
- Создать класс для своего типа поля.
- Зарегистрировать обработчик на GetUserTypeDescription.
- Создать компонент для типа поля, ряд шаблонов для его отображения.
- Выполнить миграцию :).
- Для проверки - создать пользовательское поле с созданным типом.
Добавить тип поля "валюта"
21 мин
Список ресурсов
Материалы для выполнения практики
- Исходный код примера (.zip)