пятница, 7 февраля 2014 г.

Кастомный тип свойства инфоблока

Привет, котаны! Сегодня я расскажу вам как запилить собственный тип для свойства для инфоблоков Битрикса.
Вообще, в битриксовых инфоблоках уже достаточно типов свойств - и числа, и строки, и привязки к пользователям, форумным темам и прочему. Но может случиться так, что потребуется совершенно иной тип свойства, ранее не поддерживаемый битриксом. Такой тип можно создать.
Например, может потребоваться привязать к каждому элементу инфоблока почтовый шаблон битрикса.

Делаем следующие шаги:
1. Вмешиваемся в процесс генерации списка доступных типов свойств для инфоблока:
RegisterModuleDependences('iblock', 'OnIBlockPropertyBuildList', '#MODULE_NAME#', '#MODULE_CLASS#', '#MODULE_METHOD#');
Событие OnIBlockPropertyBuildList происходит перед созданием полного списка доступных типов свойства иноблока.
 В этот список и будет добавлен наш кастомный тип свойства.

Шаблоном #MODULE_NAME# я заменил название нашего модуля, в котором в классе #MODULE_CLASS# будет содержаться  подключаемая функция #MODULE_METHOD#, которая в свою очередь сгенерирует описание типа свойства, об этом далее.
Например, вызов может выглядеть так: RegisterModuleDependences('iblock', 'OnIBlockPropertyBuildList', 'vendor_module', 'vendorPropType', 'GetUserTypeDescription');
Справка по RegisterModuleDependences.

2. Создаем класс (в нашем случае vendorPropType) . Определяем в нем следующий метод:
* GetUserTypeDescription
Функция возвращает массив следующей структуры:
// тип свойства в БД, S - строка
"PROPERTY_TYPE"  =>"S",
// идентификатор типа свойства
"USER_TYPE"      =>"customVendorID",
// название типа свойства, появляется в выпадающем списке
"DESCRIPTION"    => "Мое кастомное свойство",
// функция, генерирующая визуальное представление поля с нашим типом
"GetPropertyFieldHtml" => array(__CLASS__, "GetPropertyFieldHtml"),
// функция, производящая какие-либо операции над значением перед записью в БД
"ConvertToDB"    =>array(__CLASS__, "ConvertToDB"),
// функция, производящая какие-либо операции над значением после получения из БД перед выводом
"ConvertFromDB"  =>array(__CLASS__, "ConvertFromDB"),

Соответственно, требуется определить в классе следующие функции:
* GetPropertyFieldHtml
Функция генерирует визуальное представление нашего поля на странице редактирования инфоблока. Например, генерирует текстовое поле или выпадающий список.

* ConvertToDB
Функия производит необходимые операции перед записью значения в БД, например, сериализацию данных.

* ConvertFromDB
Функция производит необходимые операции после извлечения значения ид БД, например, десериализацию данных.

3. Это все, можно переходить в админку и редактировать свойства.

4. Пример реализации и параметры методов класса можно подглядеть в стандартном битриксовом модуле main в файле /tools/prop_userid.php (12-я версия битрикс).
Вышеуказанный подход работает и в 14-ой версии Битрикс, пользуйтесь.

3 комментария:

  1. фон ужасный уберите эти книги в глазах рябит

    ОтветитьУдалить
  2. Можете подсказать как добавить пользовательский тип Привязка к складу, Привязка к заказу, Привязка к отгрузке? Версия битрикса 17

    ОтветитьУдалить
    Ответы
    1. Аналогично описанному выше, только в качестве списка элементов надо получить Склады/Заказы/Отгрузки. И в `GetPropertyFieldHtml` вывести селект с полученными данными.

      Удалить