Плагин ResizeImageOnUpload для MODX Revo
- 08.10.2012
- MODx, Дополнение, Плагины, Работа с изображениями, Трюки
Этот небольшой плагин может оказаться очень полезным для вашего сайта и сильно упростить работу менеджерам сайта.
Плагин позволяет автоматически ресайзить изображения до нужного размера при загрузке в определенные каталоги на сервере.
Проблема
В определенном разделе сайта выводится контент, в котором очень важно, что бы изображения, составляющие часть этого контента, были строго определенного размера. Одни из самых очевидных примеров - это слайдеры, баннеры или галлереи.
Очень хорошо, если администратор сайта технически подкован и владеет Photoshop или иным графическим редактором и может обработать изображение перед загрузкой на сайт должным образом: задать размеры, установить подходящую степень сжатия для jpg файлов. Идеальный администратор! Но, к сожалению, не очень часто встречается и в итоге мы видим картину, когда на сайт загружены фотографии размером в несколько мегапикселей и весом значительно больше мегабайта.
Итог - сайт занимает много дискового пространства на сервере, требует много ресурсов процессора для генерации превью этих картинок, а посетители по несколько минут ждут загрузки сайта.
А для разработчика сайта это все выливается в то, что он вынужден тратить время не только на инструктаж по работе с системой управления сайтом, но и дополнительно рассказывать об особенностях работы с графическими редакторами, а также писать на бумажке желаемые размеры картинок для разных разделов сайта.
Цель
Итак, наша цель: при загрузке изображений в определенные каталоги на сервере необходимо автоматически ресайзить загруженные изображения до нужных размеров, причем делать это незаметно для администратора сайта.
Создание плагина
MODX Revolution имеет систему плагинов, с помощью которых можно решать самые разные задачи. Попробуем справиться и с нашей проблемой.
Создадим новый плагин и назовем его ResizeImageOnUpload:
На вкладке Системные события отметим галочкой строку с событием OnFileManagerUpload.
Это событие будет вызываться каждый раз, когда происходит загрузка файлов через менеджер файлов MODX.
Исходный код плагина
Обратите внимание, что плагин работает в MODX версии старше 2.2 и полностью поддерживает "Источники файлов".
<?php // проверяем нужное событие if ($modx->event->name != 'OnFileManagerUpload') {return;} // подключаем phpthumb require_once MODX_CORE_PATH.'model/phpthumb/phpthumb.class.php'; // настройки плагина $config = array( 'assets/upload/folder1/' => array( 'src' => array('w' => 800,'h' => 600,'zc' => 1,'bg' => '#fff','q' => 90), ), 'assets/upload/folder2/' => array( 'src' => array('w' => 400,'h' => 300,'zc' => 1,'bg' => '#fff','q' => 90), 'thumb' =>array('w' => 200,'h' => 150,'zc' => 1,'bg' => '#fff','q' => 70), ), ); // параметры загружаемого файла $file = $modx->event->params['files']['file']; $directory = $modx->event->params['directory']; // получаем media source $ms = $modx->event->params['source']; if($ms == null){ return; } // настройки media source $msProperties = $ms->get('properties'); $directory = $msProperties['basePath']['value'].$directory; // на всякий случай проверяем наличие // и заменяем на / $directory = str_replace('//', '/', $directory); // смотрим, что при загрузке не возникло ошибок if ($file['error'] != 0) { return; } $name = $file['name']; $extensions = explode(',', $modx->getOption('upload_images')); // проверям, что наша категория задана в настройках плагина if (array_key_exists($directory, $config)) { $config = $config[$directory]; } else { return; } // путь к файлу, имя файла, расширение $filename = MODX_BASE_PATH.$directory.$name; $def_fn = pathinfo($name, PATHINFO_FILENAME); $ext = pathinfo($name, PATHINFO_EXTENSION); // проверяем, что расширение файла задано в настройках MODX, как изображение if (in_array($ext, $extensions)) { $sizes = getimagesize($filename); $format = substr($sizes['mime'],6); // бежим по всем полям массива с конфигом foreach($config as $imgKey =>$imgConfig){ $options = ''; if($imgKey == 'src'){ // для ключа src имя файла совпадает с исходным $imgName = $filename; } else{ // формируем имя файла //$imgName = MODX_BASE_PATH.$directory.$def_fn.'.'.$ext.'.'.$imgKey.'.'.$ext; $imgName = MODX_BASE_PATH.$directory.$def_fn.'_'.$imgKey.'.'.$ext; } // создаем объект phpThumb.. $phpThumb = new phpThumb(); // ..и задаем параметры $phpThumb->setSourceFilename($filename); foreach ($imgConfig as $k => $v) { $phpThumb->setParameter($k, $v); } // генерируем файл if ($phpThumb->GenerateThumbnail()) { if ($phpThumb->RenderToFile($imgName)) { // устанавливаем права на файл, это опционально, зависит от сервера chmod($imgName, 0666); } } } }
Настройка плагина
В начале плагина в массиве $config заданы настройки.
Ключ этого массива - путь к каталогу на сервере, например assets/upload/folder1/. Обратите внимание, что путь без / в начале.
Значение представляет собой также массив. В нем должен быть минимум 1 элемент с ключем src, это настройки для загружаемого изображения.
Настройки идентичны настройкам phpthumb, вы можете задать любые, которые доступны для этого сниппета.
Помимо ключа src вы можете создать настройки с другим ключем, в примере выше это thumb. Каждый ключ позволит сгенерировать еще одно изображение в этой же папке с именем "имя_ключ.расширение".
Пример настроек
Массив $config с одного из сайтов:
$config = array( 'assets/images/offers/recommend/' => array( 'src' => array('w' => 200,'h' => 100,'zc' => 1), ), 'assets/images/offers/world/' => array( 'src' => array('w' => 200,'h' => 100,'zc' => 1), 'thumb' =>array('w' => 100,'h' => 50,'zc' => 1,'q' => 90), ), );
Для демонстрации загрузим по очереди файл myimage.jpg в оба этих каталога и посмотрим, что получится.
- для каталога assets/images/offers/recommend/ происходит ресайз изображения до 200x100 точек, с автоматической обрезкой по краям (zc=1).
- для каталога 'assets/images/offers/world/ будет происходить ресайз изображения до 200x100 точек, с автоматической обрезкой по краям (zc=1), а также создание еще 1 изображение изображения размером 100x50 точек, с автоматической обрезкой по краям (zc=1). В случае если исходный файл был в формете jpg, он будет сохранен с с качеством сжатия 70.
Так это выглядит в файловой системе:
В результате
В результате, после установки плагина, вы можете гибко задавать размер для вновь загружаемых изображений, что позволит экономить дисковое пространство, ресурсы сервера, и ускорить загрузку сайта.
Кроме того, администраторы сайта будут вам благодарны, так как объем работы для них может сильно уменьшиться.