Оно и понятно, что в плане производительности лучше грузить с других сайтов. Просто тут есть свои минусы. Основной - тот о котором вы упомянули, что картинка может поменяться, а URL у нас на сайте нет. Ну и второе - на разных сайтах картинки могут загружаться по-разному быстро, на некоторых - могут вообще не загрузиться с первого раза.
Но тут другое. Я, когда осмысливал задачу, вообще не думал о чем-либо то в направлении «тырить картинки». Я являюсь разработчиком модулей импорта (в т.ч. Импорт данных) и вопрос я рассматривал как загрузку товаров от какого-либо поставщика, который обычно отдает пользователям XML либо Excel. Хотя, в таких случаях, грузить с их серверов иногда запрещают, но не всегда - и если учитывать что картинки могут занимать несколько гигабайт, то такой способ в некоторых случаях может позволить сэкономить как время, так и деньги. Поэтому, мой код это просто ответ на поставленный в топике вопрос.
Екатерина Шелест написал: Меня вот тоже одно время интересовал вопрос - хорошо бы сделать поддомен и с него грузить все картинки на основной сайт. Но все остановилось именно на DETAIL_PICTURE.Думаю, в таком случае, если свой root сервер, то можно грузить картинки как обычно, а папку upload сделать символьной ссылкой для поддомена. Останется только в шаблоне вывода элементов - поправить вывод картинок. Наверное, так.
Те события, на основе которых я сделал код, как раз позволяют использовать внешние картинки, без необходимости доработки шаблонов. Т.е. можно вообще любые загружаемые файлы, которые сохраняются в b_file, уносить на хранение хоть на свой домашний сервер, хоть в CDN, хоть на поддомен - и загружать уже оттуда. Таким образом можно реализовать любые «хотелки» в плане хранения файлов.
Роман Семёнов написал: они каждый раз на лету отрабатывают (при чтении из БД информации о картинке)? или только при обновлении создании изображения?
Liveapi в помощь. OnGetFileSRC срабатывает при получении массива, описывающего имеющийся в БД файл, т.е. каждый раз. OnMakeFileArray - при получении массива, описывающего сахраняемый файл, для сохранения, т.е. только однажды.
b7music написал: DETAIL_PICTURE битрикс берет из локального каталога, по дефолту.
Скорее взять то ее можно хоть откуда, только сохранит он картинку для элемента инфоблока в локальной файловой системе по своим правилам, а в базе данных для DETAIL_PICTURE запишет путь к этой картинке относительно корня сайта.
Небольшое дополнение к теме.
Есть возможность хранить картинки для всего сайта или для отдельных модулей, например для модуля инфоблоков, на удаленном сервере, когда используются Облачные хранилища (стандартный функционал Битрикс, кроме Первого сайта). В админке и в публичной части, ссылки будут на облачное хранилище. В таблице b_file видимых изменений нет при этом, т.е. также прописывается относительный путь внутри upload. А картинки отдаются с облака. На облаке "зеркалится" папка upload c подкаталогами.
Подключил в качестве эксперимента Selectel как облачное хранилище, перенес 4 гига картинок туда, стоимость хранения, по сравнению с Таймвебом просто смешная.
Ну и не совсем понятно, как влияет на СЕО, когда сайт работает по https, а картинки с товарами отдаются с другого домена и по http.
Дмитрий Чебыкин написал: когда сайт работает по https, а картинки с товарами отдаются с другого домена и по http.
Насколько я понимаю, даже браузер покажет ошибку в этом случае - т.е. картинки просто не загрузятся, пока не подтвердишь браузеру что ты знаешь что делаешь.
Денис Сон написал: Если уж очень нужно, то можно сделать и без переработки шаблонов. Потратил пару часов, но у меня получилось. В Битрикс для работы с изображениями есть три очень интересных события, при использовании их вместе можно добиться желаемого результата. В качестве примера для изучения скопируйте нижеприведенный код в отдельный php-файл на сайте и в браузере откройте.