Задача: есть сущность специалист, специалист имеет квалификации. Для того, чтобы оценить квалификацию специалиста, к ней должна быть привязана дата её получения. В итоге, в одном поле должны храниться пары вида:
1С-Профессионал 15.01.2005 1С-Специалист 09.06.2011 и т.д.
На схеме данных это выглядит так:
Понятно, что хранить лишний инфоблок для такого пустяка избыточно, и был найден другой способ.
Некоторые типы свойств (строка, число, файл, дата, и т.д.) позволяют отдельно хранить поле для описания значения свойства. По умолчанию это просто текстовое поле, что не совсем подходит — вбивать руками дату пользователя не заставишь.
Задача свелась к следующему: создать такой тип свойства ИБ, который бы позволял в поле VALUE хранить ID элемента ИБ Квалификации, а в поле DESCRIPTION — дату её получения. При этом выводиться список Квалификаций должен в селекте, дату же будем выбирать с помощью стандартного bitrix:main.calendar.
К счастью, разработчики из Bitrix оставили некоторые указания на этот счёт[4].
Каждый тип свойства описывается набором методов:
Кроме того, в файле /bitrix/modules/main/classes/general/usertypestr.php достаточно комментариев, описывающих каждый метод.
Реализация
Создаём класс, в котором описываем тип свойства. Методы, которые понадобились мне:
Романов Александр, в данном примере дейтсвительно ее нет, но на деле, с помощью этих функции можно сохранять одно, а показывать другое.
Например у меня есть кастомное поле "Товар" типа E (привзяка к элементам), понятно, что для лучшего отображения и работы с ним нужно знать id элемента, но они достаточно часто меняются при выгрузке, а вот артикул остается всегда одинаковым (идет из 1С).
Поэтому я с помощью ConvertFromDB по артикулу ищу id, а при сохранении элемента id опять перевожу в артикул с помощью ConvertToDB. Т.е. в админке выводится ID, а в БД хранится артикул.
В приведенном примере ф-ия GetPropertyFieldHtml отдает вывод echo. Обязательно надо отдавать результат работы через return, иначе не будет работать добавление множественных свойств.
Всё бы хорошо, но DESCRIPTION не всегда рекомендуется к применению, если хотите работать с этим в публичке, так как в ряде методов пользовательских свойств инфоблоков он опущен, те же GetPublicViewHTML, GetSearchContent (хотя почему - не понятно). Ну или если нужен более универсальный с пользовательскими полями главного модуля код.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».