?

Log in

DMakeev

dmakeev in webdistortion

Битрикс. Массовая загрузка фотографий в админке

Задача: сделать малой кровью возможность загрузки пачки фотографий в админке Битрикса.

Суть: грузим архив, распаковываем и вставляем. Можно грузить несколько архивов параллельно.

Почему так хреново: да, конечно лучше было бы прикрутить хороший мультизагрузчик, но а) не до того б) есть ощущение что Битриксы когда-нибудь это сделают стандартным функционалом.

Итак, собсно
Файл с этой функцией подцепляется в свойствах инфоблока как "обработчик перед сохранением.". В самой функции прописываются ID свойства с архивом и со списком фотографий.


Fetch())) {
            // Выдергиваем файлы из архива
            $hash = time();
            $dir = '/tmp/bitrixUpload_' . $hash;
            mkdir($dir, 0777);
            $zip = new ZipArchive;
            if($zip->open($_FILES['PROP']['tmp_name'][$fieldArchive][$key]) === TRUE) {
                $zip->extractTo($dir);
                $zip->close();
            } else {
                rmdir($dir);
                return false;
            }

            $arFiles = array();
            // Проходимся по файлам и готовим добавление
            if ($dh = opendir($dir)) {
                while (($file = readdir($dh)) !== false) {
                  if($file == '.' || $file == '..') continue;
                  if(!preg_match('!\.jpg$!si', $file)) continue;
                    $arFiles[] = CFile::MakeFileArray($dir . '/' . $file);
                }
                closedir($dh);
            }

            // Добавляем
            CIBlockElement::SetPropertyValues($arFields['ID'], $iblockId, $arFiles, $fieldPhotos);
            CIBlockElement::SetPropertyValues($arFields['ID'], $iblockId, $arFiles[0], $fieldArchive);
            CIBlockElement::SetPropertyValues($arFields['ID'], $iblockId, array(), $fieldArchive);
            // Проходимся по файлам и удаляем их
            if ($dh = opendir($dir)) {
                while (($file = readdir($dh)) !== false) {
                    @unlink($dir . '/' . $file);
                }
                closedir($dh);
            }
            rmdir($dir);
            BXClearCache(true, "/");
        }
    }
}
?>


PS: Использует библитоечку Zip (класс ZipArchive)..

PPS: Косяк, до которого руки не дошли: для удаления архива после обработки свойству присваивается первая из загруженных фотографий. Не бог весть какое решение, но в качестве костыля попрет. Кто поправит - скажу спасибо.

Comments