Возникла необходимость хранить файлы-изображения определённого ИБ, который используется для фотогалереи, в облачном хранилище. Файлы других ИБ должны храниться на хостинге.
Настройкой правил в Битриксе, по которым будет происходить отбор файлов, загружаемых в облачное хранилище, такую задачу не решить. К сожалению, стандартный функционал позволяет сортировать файлы только по названию модуля, расширению и размеру, а вот выбрать нужный мне инфоблок нельзя.
Но задачу надо решать и решение было найдено, после часового поиска и разбора кода стандартных компонентов. Често говоря, на путь истинный подтолкнул один из комментариев в блогах, который теперь я найти не могу.
Для решения данной задачи нужно в событии OnFileSave главного модуля при сохранении файлов из нужно инфоблока в массиве описания файла arFile подменить MODULE_ID на свой. Для этого в файле init.php:
Объявляем глобальную переменную
В событиях OnBeforeIBlockElementAddHandler и OnBeforeIBlockElementUpdateHandler для нужного нам ИБ инициализируем глобальную переменную
В событии OnFileSave проверяем глобальную переменную и, если она проинициализирована, заменяем MODULE_ID на свой
Далее, в правилах для отбора файлов в облачное хранилище пишем свой модуль, в моём случае это iblock_upload1
Всё, все фотографии из фотогалереи хранятся в облаке, а фотографии из других ИБ хранятся на хостинге.
В целом, хотелось бы конечно иметь возможность выбора ИБ в стандартном функционале, ведь большинство сайтов сделаны на ИБ и думаю задача хранения файлов в облаке из определённых Иб возникнет не только у меня.
Настройкой правил в Битриксе, по которым будет происходить отбор файлов, загружаемых в облачное хранилище, такую задачу не решить. К сожалению, стандартный функционал позволяет сортировать файлы только по названию модуля, расширению и размеру, а вот выбрать нужный мне инфоблок нельзя.
Но задачу надо решать и решение было найдено, после часового поиска и разбора кода стандартных компонентов. Често говоря, на путь истинный подтолкнул один из комментариев в блогах, который теперь я найти не могу.
Для решения данной задачи нужно в событии OnFileSave главного модуля при сохранении файлов из нужно инфоблока в массиве описания файла arFile подменить MODULE_ID на свой. Для этого в файле init.php:
Объявляем глобальную переменную
global $IBLOCK_STORAGE_CODE; |
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", Array("MyIBClass", "OnBeforeIBlockElementAddHandler")); AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("MyIBClass", "OnBeforeIBlockElementUpdateHandler")); function OnBeforeIBlockElementAddHandler(&$arFields) { global $IBLOCK_STORAGE_CODE; if ($arFields['IBLOCK_ID']==24) { $IBLOCK_STORAGE_CODE = "iblock_upload1"; } } function OnBeforeIBlockElementUpdateHandler(&$arFields) { global $IBLOCK_STORAGE_CODE; if ($arFields['IBLOCK_ID']==24) { $IBLOCK_STORAGE_CODE = "iblock_upload1"; } } |
AddEventHandler("main", "OnFileSave", Array("MyIBClass", "OnFileSave"), 0); function OnFileSave(&$arFile, $strFileName, $strSavePath) { global $IBLOCK_STORAGE_CODE; if ($IBLOCK_STORAGE_CODE) { $arFile["MODULE_ID"] = "iblock_upload1"; } return false; } |
Всё, все фотографии из фотогалереи хранятся в облаке, а фотографии из других ИБ хранятся на хостинге.
В целом, хотелось бы конечно иметь возможность выбора ИБ в стандартном функционале, ведь большинство сайтов сделаны на ИБ и думаю задача хранения файлов в облаке из определённых Иб возникнет не только у меня.