На последних проектах я столкнулся с тем, что к контенту на сайте прилагается значительное количество изображений с различными размерами. Обойтись стандартными полями превью и детального изображения для элементов и разделов инфоблоков с их настройками уменьшения изображения не получилось. Поэтому мы с коллегами пошли по простому пути и стали использовать стандартные свойства типа “файл” как для элементов инфоблоков, так и для пользовательских свойств для разделов инфоблоков. Далее, конечно же, создали обработчики событий для того, чтобы обработать изображения в то состояние, которое требуется для отображения на сайте. Под обработкой изображения я подразумеваю пропорциональный ресайзинг или кроп (ресайзинг по одному размеру и дальнейшая обрезка лишнего), чего можно добиться стандартными средствами Битрикса (методы CFile::ResizeImage и др.). Сделали один проект таким образом… А потом второй, третий… Конечно, такой подход имеет право на жизнь, но он очень неудобен.
[spoiler]
К разработке своего модуля меня подтолкнул рассказ коллеги об удачном опыте создания кастомного свойства инфоблока. Вдохновившись его примером и я приступил к разработке.
Суть создания кастомных свойств заключается в создании определенных обработчиков событий для событий для свойств элементов инфоблока. Пример такого обработчика:
для пользовательских свойств. Пример такого обработчика:
В этих обработчиках содержится описание кастомных свойств и стандартные методы, которые могут быть вызваны при работе со свойством. Например, html-представление настроек для свойства элемента инфоблока определяется реализацией метода . Результаты работы этого метода можно увидеть на следующем скриншоте:

Для пользовательских свойств страница настройки выглядит так:

Что еще позволяют делать эти методы? Обрабатывать значения перед сохранением в БД, создавать html-представления в формах редактирования админки и публичной части, обрабатывать значения настроек свойств и др.
Расскажу о некоторых проблемах в разработке. При создании кастомного свойства указывается базовый тип свойства (строка, файл, список и др.). Метод CFileInput::Show позволяет создать стандартное html-представление контрола для загрузки изображений. Если указать базовый тип свойства “файл” для пользовательских типов свойств, то никаких проблем не возникает. Но для свойств элемента инфоблока это стало проблемой, т.к. используя стандартное html-представление крайне трудно без костылей удалить уже загруженное в свойство изображение. В связи с этим я отказался от использования базового типа “файл” и стал использовать “строку”, куда помещаю идентификатор файла в таблице, регистрирующей файлы в БД Битрикс.
Код модуля можно увидеть на . Помимо стандартной установки модуля доступна установка с использованием Composer, о которой я рассказывал в своем предыдущем .
Важно! В модуле используется API ядра D7, поэтому рекомендуется использовать его только для версий Битрикса от 14 и выше. Модуль находится в beta-версии и, если вы решите использовать его в своих проектах, о найденных багах сообщайте, пожалуйста, в репозитория.
Хотелось бы подвести небольшой итог этого поста. На мой взгляд, создание собственных свойств открывает множество возможностей, потому что обработка изображений - это, конечно же, не единственное применение. Созданные командой Битрикса свойства такие как, например, привязка к карте Google Maps - отличный тому пример.
[spoiler]
К разработке своего модуля меня подтолкнул рассказ коллеги об удачном опыте создания кастомного свойства инфоблока. Вдохновившись его примером и я приступил к разработке.
Суть создания кастомных свойств заключается в создании определенных обработчиков событий для событий для свойств элементов инфоблока. Пример такого обработчика:
public static function getPictureResizerTypeDescription()
{
return array(
'PROPERTY_TYPE' => 'S',
'USER_TYPE' => 'ImageResizingProperty',
'DESCRIPTION' => 'Картинки с ресайзом',
'GetPropertyFieldHtml' => array(
'CustomPropertiesModule\\CustomProperties\\PictureResizerIblockElementProperty',
'getPropertyFieldHtml'
),
'GetPropertyFieldHtmlMulty' => array(
'CustomPropertiesModule\\CustomProperties\\PictureResizerIblockElementProperty',
'getMultiplePropertyFieldHtml'
),
'ConvertToDB' => array(
'CustomPropertiesModule\\CustomProperties\\PictureResizerIblockElementProperty',
'prepareValues'
),
'GetSettingsHTML' => array(
'CustomPropertiesModule\\CustomProperties\\PictureResizerIblockElementProperty',
'getResizeSettingsHtml'
),
'PrepareSettings' => array(
'CustomPropertiesModule\\CustomProperties\\PictureResizerIblockElementProperty',
'prepareResizeSettings'
),
);
} |
public static function getPictureResizerUserTypeDescription()
{
return array(
'USER_TYPE_ID' => 'resize_file',
'CLASS_NAME' => 'CustomPropertiesModule\\CustomProperties\\PictureResizerUserTypeProperty',
'DESCRIPTION' => 'Картинки с ресайзом',
'BASE_TYPE' => 'file',
);
} |
В этих обработчиках содержится описание кастомных свойств и стандартные методы, которые могут быть вызваны при работе со свойством. Например, html-представление настроек для свойства элемента инфоблока определяется реализацией метода . Результаты работы этого метода можно увидеть на следующем скриншоте:

Для пользовательских свойств страница настройки выглядит так:

Что еще позволяют делать эти методы? Обрабатывать значения перед сохранением в БД, создавать html-представления в формах редактирования админки и публичной части, обрабатывать значения настроек свойств и др.
Расскажу о некоторых проблемах в разработке. При создании кастомного свойства указывается базовый тип свойства (строка, файл, список и др.). Метод CFileInput::Show позволяет создать стандартное html-представление контрола для загрузки изображений. Если указать базовый тип свойства “файл” для пользовательских типов свойств, то никаких проблем не возникает. Но для свойств элемента инфоблока это стало проблемой, т.к. используя стандартное html-представление крайне трудно без костылей удалить уже загруженное в свойство изображение. В связи с этим я отказался от использования базового типа “файл” и стал использовать “строку”, куда помещаю идентификатор файла в таблице, регистрирующей файлы в БД Битрикс.
Код модуля можно увидеть на . Помимо стандартной установки модуля доступна установка с использованием Composer, о которой я рассказывал в своем предыдущем .
Важно! В модуле используется API ядра D7, поэтому рекомендуется использовать его только для версий Битрикса от 14 и выше. Модуль находится в beta-версии и, если вы решите использовать его в своих проектах, о найденных багах сообщайте, пожалуйста, в репозитория.
Хотелось бы подвести небольшой итог этого поста. На мой взгляд, создание собственных свойств открывает множество возможностей, потому что обработка изображений - это, конечно же, не единственное применение. Созданные командой Битрикса свойства такие как, например, привязка к карте Google Maps - отличный тому пример.