Плагин ResizeOnUpload

Набросал плагин для ресайза изображений при загрузке, срабатывает на событие OnFileManagerUpload.

Для работы требуется сниппет phpThumbOf.

Настройки

Массив настроек состоит из вложенных массивов настроек для разных директорий. Если файл загружается в директорию, для которой нет настроек — то берется конфиг по умолчанию, для корня сайта (/).
Во вложенных массивах должны быть параметры для phpThumb:
  • w — максимальная ширина изображений, по умолчанию 800px
  • h — максимальная высота изображения, по умолчанию 600px
  • zc — увеличение и обрезка, по умолчанию отключено
  • bg — фон картинки, нужно при $zc=0, по умолчанию белый
  • q — качество пережатия, по умолчанию — 100%
Вы можете добавлять еще какие-то параметры phpThumb в эти массивы, формате ключ => значение — все они попадут в сниппет.

Вообще, это скорее черновик, чем готовый плагин — ибо у каждого свои требования для обработки изображений. Можно, например, для картинки высчитывать ширину в зависимости от максимальной высоты.
Так что комментируйте и поправляйте.

Плагин

<?php
/**
 * ResizeOnUpload Plugin
 *
 * Events: OnFileManagerUpload
 * Author: Vasiliy Naumkin <bezumkin@yandex.ru>
 * Required: PhpThumbOf snippet for resizing images
 */

if ($modx->event->name != 'OnFileManagerUpload') {return;}

/* Settings */
$config = array(
    '/' => array(           // default config
        'w' => 800          // max width of uploaded images
        ,'h' => 600         // max height of uploaded images
        ,'zc' => 0          // zoom & crop
        ,'bg' => '#fff'     // backgroud, needed only for zc=0
        ,'q' => 100         // quality
    )
    //,'/assets/images/' => array()
);

/*----------*/
$file = $modx->event->params['files']['file'];
$directory = $modx->event->params['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 {
	$config = $config['/'];
}

$filename = MODX_BASE_PATH . $directory . $name;
$ext = substr(strrchr($name, '.'), 1);
if (in_array($ext, $extensions)) {
	$sizes = getimagesize($filename);
	$format = substr($sizes['mime'],6);
	if ($sizes[0] > $config['w'] || $sizes[1] > $config['h']) {
		if ($sizes[0] < $config['w']) {$config['w'] = $sizes[0];}
		if ($sizes[1] < $config['h']) {$config['h'] = $sizes[1];}
		
		$options = '';
		foreach ($config as $k => $v) {
			$options .= '&'.$k.'='.$v;
		}
		$resized = $modx->runSnippet('PhpThumbOf', array(
			'input' => $directory.$name
			,'options' => $options
		));
		rename(MODX_BASE_PATH . substr($resized, 1), $filename);
	}
}

Сделано по вот этой просьбе.

Следующая заметка
Импорт в miniShop
Предыдущая заметка
Robokassa для miniShop


Комментарии ()

  1. Dmytro Lukianenko 04 августа 2012, 18:42 # 0
    Поправьте плз верстку вашего блога под мобильные девайсы
    что именно не так писал в почту. там то всего пару строк поправить надо )
    1. Dmytro Lukianenko 04 августа 2012, 18:43 # 0
      сорри за офтоп но в почту ответа я не получил да и изменений не вижу на сайте
      1. Василий Наумкин 04 августа 2012, 19:35 # 0
        Мне — хорошо.
      2. Серега 08 сентября 2012, 12:41 # 0
        вообщем столкнулся весьма со странной проблемой, на хостере jino.ru

        отдебагил ровно до этого момента:
        /core/components/phpthumbof/model/phpthumbof/phpthumbof.class.php
        строка 310
        $this->cacheFilename .= '.'.md5(serialize($this->options)).$this->modx->resource->get('id');

        вообщем почему то ресайз падает именно на ней, если убрать $this->modx->resource->get('id') — то работает, но тогда сам phpthumb некорректно работает на страницах.
        1. Серега 08 сентября 2012, 12:42 # 0
          есть какие нибудь идеи?
          1. Василий Наумкин 08 сентября 2012, 14:45 # 0
            Сменить хостера?
            1. Серега 08 сентября 2012, 20:29 # 0
              а в чем может быть проблема то? хостер тут причем?.. сайт был перенесен с денвера
              я так понял это как то повлияло.
              пробовал переустанавливать и пхп фамб и плагин — нифига не помогает,
              тут явно какая-то особенность модикса или пхпфамба
              1. Серега 08 сентября 2012, 20:30 # 0
                дело просто в том что сам пхп фамб исправно работает если запускать его из другого сниппета или напрямую, именно после переноса в плагине в чем то косяк, пока не разобрался.
            2. Алексей 13 сентября 2012, 12:06 # 0
              Замечание, в плагине не учтены источники файлов. Он работает только для дефолтного источника…

              И, кстати, я вместо runSnippet сделал так:

              require_once MODX_CORE_PATH.'model/phpthumb/phpthumb.class.php';

              $phpThumb = new phpThumb();
              $phpThumb->setSourceFilename($input);
              foreach ($config as $k => $v) {
               $phpThumb->setParameter($k, $v);
              }
              
              if ($phpThumb->GenerateThumbnail()) {
               if ($phpThumb->RenderToFile($output)) {
               }
              }
              

              Потому что, runSnippet('PhpThumbOf') генерировал ошибку, глянув в код — увидел, что он пытается получить id текущего ресурса, а ресурса то и нет…
              1. Серега 14 сентября 2012, 06:57 # 0
                ага я примерно так же решил проблему) хост тут совершенно не причем )
                1. Василий Наумкин 14 сентября 2012, 07:45 # 0
                  У меня работало без проблем, возможно обновился PhpThumbOf.

                  В любом случае, это не готовый пакет, а ответ на просьбу одного из посетителей. Если доведете до ума и выложите готовое расширения — буду только рад.
                2. Aleksandr Kirjanov 04 января 2013, 01:18 # 0
                  А как заставить ваш плагин уменьшать фото при загрузке modx gallery? И возможно ли это? может есть другие способы?
                  1. Василий Наумкин 04 января 2013, 02:56 # 0
                    А какие события вызывает Gallery при загрузке фотографий?

                    На такие и надо переделать.
                    1. Алексей 30 марта 2013, 16:47 # 0
                      у Gallery нету событий. нужно править файл
                      core/components/gallery/processors/mgr/item/ajaxupload.php
                      для пакетной загрузки
                    2. Илья Зенин 05 января 2013, 02:13 # 0
                      В век дешевых цифромыльниц и жадных на хостинг людей очень часто возникает проблема на шаред-хостингах с памятью, необходимой для ресайза многомегапиксельных картинок на сервере.

                      Может сделать возможность заливки на сервер большой картинки, с последующим ресайзом до вменяемого размера при помощи сервиса boxresizer.com или аналогичных (правда другие что то не нашел).

                      Не всем секретаршам удается успешно объяснить, как и зачем ресайзить фоточки с цифровичков, а такой плагин решил бы проблему…
                      1. Мордынский Николай 18 марта 2013, 13:57 # 0
                        www.createit.ru/blog/modx/2012/plugin-resizeimageonupload-modx-revo/ нашел форк плагина Василия.

                        Он уже там отписывался) но читателям может пригодится чтобы невелосипедить)
                        1. Мордынский Николай 28 марта 2013, 16:30 # 0
                          Доработка плагина:
                          Фото грузятся в выбранную директорию
                          Внутри директории создается папка thumb в нее пишутся одноименные мниатюры
                          Лог загрузки пишется в log.txt внутри папки

                          <?php
                          // проверяем нужное событие
                          
                          if ($modx->event->name != 'OnFileManagerUpload') {return;}
                          
                          // подключаем phpthumb
                          require_once MODX_CORE_PATH.'model/phpthumb/phpthumb.class.php';
                          
                          // параметры загружаемого файла
                          
                          $file = $modx->event->params['files']['file'];
                          $directory = $modx->event->params['directory'];
                          $thumb_dir=$directory."thumb/";
                          
                          $handle = fopen($_SERVER["DOCUMENT_ROOT"]."/".$directory."log.txt","a");
                          
                          if(!is_dir($_SERVER["DOCUMENT_ROOT"]."/".$directory."thumb")) {
                          
                          
                              if (mkdir($_SERVER["DOCUMENT_ROOT"]."/".$directory."thumb",0766)){
                          
                          		fwrite($handle,"Директория миниатю успешно создана".$_SERVER["DOCUMENT_ROOT"]."/".$directory."thumb \n");
                          
                          		} else { 
                          
                          		fwrite($handle,"Директория миниатю не создана".$_SERVER["DOCUMENT_ROOT"]."/".$directory."thumb \n");
                          		}
                          	} 
                          
                          fwrite($handle,"файлы загружаются в - ".$_SERVER["DOCUMENT_ROOT"]."/".$directory."\n"); 
                          
                          
                          // настройки категории  плагина
                          
                          $config = array(
                             $directory => array(
                          						'src' => array('w' => 800,'h' => 800,'zc' => 0,'bg' => '#fff','q' => 90),
                             						'thumb'=>array('w' => 150,'h' => 150,'zc' => 0,'bg' => '#fff','q' => 70))
                          	);
                          
                          // получаем media source
                          $ms = $modx->event->params['source'];
                          if($ms == null){
                           return;
                          }
                          // настройки media source
                          $msProperties = $ms->get('properties');
                          $directory = $msProperties['basePath']['value'].$directory;
                          
                          fwrite($handle,"Настройки media source directory =>>>>> ".$directory."\n");
                          
                          $thumb_dir =$msProperties['basePath']['value'].$thumb_dir;
                          
                          fwrite($handle,"Настройки media source thumb_dir =>>>>> ".$thumb_dir."\n");
                          
                          // на всякий случай проверяем наличие // и заменяем на /
                          $directory = str_replace('//', '/', $directory);
                          $thumb_dir = str_replace('//', '/', $thumb_dir);
                          // смотрим, что при загрузке не возникло ошибок
                          if ($file['error'] != 0) {
                          
                          fwrite($handle,"Ошибка при загрузке файлов \n");
                          
                          return;
                          }
                          $name = $file['name'];
                          
                          fwrite($handle,"60 строка переменная  name ===>".$name."\n");
                          $extensions = explode(',', $modx->getOption('upload_images'));
                          
                          // проверям, что наша категория задана в настройках плагина
                          if (array_key_exists($directory, $config)) {
                           $config = $config[$directory];
                          }
                          else { 
                           
                           return;
                          }
                          // путь к файлу,путь к тумб файлу, имя файла, расширение
                          $filename = MODX_BASE_PATH.$directory.$name;
                          
                          fwrite($handle,"82строка filename =".$filename."\n");
                          
                          $thumb_filename = MODX_BASE_PATH.$thumb_dir.$name;
                          
                          fwrite($handle,"86 строка thumb_filename =".$thumb_filename."\n");
                          
                          $def_fn = pathinfo($name, PATHINFO_FILENAME);
                          
                          fwrite($handle,"90 строка def_fn =".$def_fn."\n");
                          
                          $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 = $_SERVER["DOCUMENT_ROOT"]."/".$directory."thumb/".$def_fn.'.'.$ext;
                                  }
                                  if (in_array($ext, $extensions)) {
                                      $sizes = getimagesize($filename);
                          	        $format = substr($sizes['mime'],6);
                          	        if ($sizes[0] > $imgConfig['w'] || $sizes[1] > $imgConfig['h']) 
                                      {
                          		        if ($sizes[0] < $imgConfig['w']) {$imgConfig['w'] = $sizes[0];}
                          		        if ($sizes[1] < $imgConfig['h']) {$imgConfig['h'] = $sizes[1];}
                          		        // создаем объект 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);
                               		        }
                             		        }
                          	        }
                                  }
                              }
                          } else { 
                              fwrite($handle,"Выход из скрипта: не допустимое расширение файла (проверьте настройки системы - файловая система) "); 
                              return;
                              }
                          fwrite($handle,"Файл ".$name." успешно загружен, миниатюра создана)\n_______________________________________________________________________________\n\n\n");
                        2. Степан Прищепенко 09 апреля 2013, 11:27 # 0
                          Выложил свой вариант
                          1. Василий Наумкин 09 апреля 2013, 12:08 # 0
                            Отлично, молодец!
                          2. Андрей Вечканов 01 августа 2013, 10:17 # 0
                            Добрый день! Скажите, пожалуйста, как сделать чтобы плагин работал при Multi-upload в компоненте Gallery?
                            1. Василий Наумкин 01 августа 2013, 10:19 # 0
                              Если она при этом не не вызывает событие OnFileManagerUpload — то никак.

                              Мы этот вопрос решили иначе и более комплексно.
                            2. Alex Zhuravlev 31 мая 2014, 23:17 # 0
                              Подскажите как сделать что бы плагин отрабатывал на все источники файлов.
                              Сейчас я делаю еще один источник и если в нем параметры basePath и baseUrl пустые то плагин отрабатывает, а если добавляю путь то не срабатывает.
                              Добавление новых комментариев отключено.