76846_(www.Gde-Fon.com)

Довольно часто в CMS 1c-bitrix требуется создать новый тип свойств как для элементов так и для разделов. И если для элементов создать новый тип свойств не такая сложная задача для программиста, так как материалов я нашел на эту тему в интернете уйма, то создать новый тип свойств для разделов, а именно новый тип пользовательских полей — оказалось куда сложней. Информацию найти можно, но все как-то кусками и полная картина все равно не складывается. Попробую дать полный ответ по этому вопросу исходя из своего опыта. В общем напишу что нарыл).

1. Теоретическая часть создания нового типа пользовательского поля

Вся суть кастомизации пользовательских полей в битрикс сводится к тому, что мы наследуемся от класса, описывающего соответсвующий тип поля. А потом вешаем этот класс на событие, которое вызывается перед построением списка пользовательских полей. На этом в принципе всё. По идее всё логично и доступно для понимания. Все эти классы, от которых мы можем наследоваться можно подсмотреть в этой папке /bitrix/modules/main/classes/general/. Собственно вот они:

Screenshot at мая 13 21-15-00

По названию в принципе понятно какой класс за какой тип поля отвечает. Дальше давайте разберем методы конкретного класса.

2. Разбираем методы класса CUserTypeInteger

  • Метод GetUserTypeDescription() — отвечает за инициализацию пользовательского поля для главного модуля
  • Метод GetEditFormHTML() — редактирование свойства в форме (главный модуль)
  • Метод GetAdminListEditHTML() — редактирование свойства в списке (главный модуль)
  • Метод GetAdminListViewHTML() — представление свойства в списке главного модуля

Пере-определив эти или другие методы в нашем классе мы можем полностью менять логику отображения, сохранения и представления нашего свойства. Опять же, некоторые принципы работы класса свойства можно подсмотреть в стандартных классах для типов полей bitrix.

Перейдем к конкретики. Приведу несколько примеров создания новых типов пользовательских полей.

3. Тип пользовательского поля для выбора цвета

Код нашел на просторах интернета, но он неплохо демонстрирует возможности создания типа поля. В итоге у нас должно получиться, что то типа этого:

Screenshot at мая 13 21-40-47

С помощью ползунков мы сможем настраивать свойство цвета. В приведенном ниже коде также будет и код для создания такого же типа свойства, но уже для элемента инфоблока. А вот и сам код:

Весь этот код можно просто вставить в файл init.php в вашей системе bitrix и все должно заработать.

Ну и приведу пример своего гавнокода, который вроде бы работает. Изначально у меня стояла следующая задача:

Нужно придумать механизм привязки свойств инфоблока для отображения в умном фильтре для раздела. То есть на странице каждого раздела должен отображаться свой список свойств для фильтрации. Было решено создать пользовательское поле нового типа, в котором выводились бы все свойства нужного инфоблока, а представляло бы это все из себя просто select с множественным выбором. Задача была решена следующим образом:

По сути я просто взял класс отвечающий за пользовательское поле типа «Список» и пере-определил пару методов, которые отвечают за вывод селекта с множественным выбором. Тем самым задача была успешно решена.

4. Тип пользовательского поля — множественная строка с описанием

И еще один пример. Вообще битрикс мягко говоря странная система…Почему у инфоблока есть множественное свойство строка с описанием, а у раздела нет? Почему у инфоблока есть свойство html-текст (с визуальным редактором), а у раздела нет? Почему свойство привязки у раздела можно вывести только мультиселектом? Ответа на эти вопрос я думаю не получу, может и есть какие-то веские причины. Но не будем о грустном).

Вот таким образом можно реализовать множественное свойство для раздела строка с описанием (пользовательское поле). Сразу говорю, что реализация кривая, так как переделывалось все на скорую руку и из свойства другого типа. Просто добавьте этот код в init.php и в списке выбора типа пользовательских полей появится новый тип свойства «Строка с описанием».