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