Плагин 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);
    }
}

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

Комментарии (14)
alexeytulaАлексей
13.09.2012 08:06

Замечание, в плагине не учтены источники файлов. Он работает только для дефолтного источника…

И, кстати, я вместо 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 текущего ресурса, а ресурса то и нет…

Серега
14.09.2012 02:57

ага я примерно так же решил проблему) хост тут совершенно не причем )

bezumkinВасилий Наумкин
14.09.2012 03:45

У меня работало без проблем, возможно обновился PhpThumbOf.

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

Aleksandr Kirjanov
03.01.2013 21:18

А как заставить ваш плагин уменьшать фото при загрузке modx gallery? И возможно ли это? может есть другие способы?

bezumkinВасилий Наумкин
03.01.2013 22:56

А какие события вызывает Gallery при загрузке фотографий?

На такие и надо переделать.

Алексей
30.03.2013 12:47

у Gallery нету событий. нужно править файл

core/components/gallery/processors/mgr/item/ajaxupload.php

для пакетной загрузки

Илья Зенин
04.01.2013 22:13

В век дешевых цифромыльниц и жадных на хостинг людей очень часто возникает проблема на шаред-хостингах с памятью, необходимой для ресайза многомегапиксельных картинок на сервере.

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

Не всем секретаршам удается успешно объяснить, как и зачем ресайзить фоточки с цифровичков, а такой плагин решил бы проблему…

Мордынский Николай
18.03.2013 09:57

http://www.createit.ru/blog/modx/2012/plugin-resizeimageonupload-modx-revo/ нашел форк плагина Василия.

Он уже там отписывался) но читателям может пригодится чтобы невелосипедить)

Мордынский Николай
28.03.2013 12:30

Доработка плагина: Фото грузятся в выбранную директорию Внутри директории создается папка 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");
SetestСтепан Прищепенко
09.04.2013 07:27
bezumkinВасилий Наумкин
09.04.2013 08:08

Отлично, молодец!

Андрей Вечканов
01.08.2013 06:17

Добрый день! Скажите, пожалуйста, как сделать чтобы плагин работал при Multi-upload в компоненте Gallery?

bezumkinВасилий Наумкин
01.08.2013 06:19

Если она при этом не не вызывает событие OnFileManagerUpload - то никак.

Мы этот вопрос решили иначе и более комплексно.

Alex Zhuravlev
31.05.2014 19:17

Подскажите как сделать что бы плагин отрабатывал на все источники файлов. Сейчас я делаю еще один источник и если в нем параметры basePath и baseUrl пустые то плагин отрабатывает, а если добавляю путь то не срабатывает.

bezumkin
Василий Наумкин
30.06.2022 03:58
Есть ли возможность формировать &quot;friendly URL aliases&quot;, используя аналог translit MODx? ...
bezumkin
Василий Наумкин
27.06.2022 03:32
Спасибо за исправления, очень выручаешь =) Но учитывая количество не описаных в заметке дополнительн...
bezumkin
Василий Наумкин
27.06.2022 03:10
что будет использоваться для вывода многоуровневого меню Посмотри как работают комментарии на этом ...
bezumkin
Василий Наумкин
25.06.2022 11:56
Поправил, спасибо!
bezumkin
Василий Наумкин
22.06.2022 10:08
Я обычно не пользуюсь RTE редакторами, потому что они пишут всякое непонятное что в HTML. Но можно в...
bezumkin
Василий Наумкин
21.06.2022 01:58
onLoad(data) { this.total = data.total }, и onLoad({total}) { this.total = total }, В нашем случ...
bezumkin
Василий Наумкин
20.06.2022 14:01
Прекрасно тебя понимаю, я когда сам в этом разбирался - голова дымилась. Но зато теперь прямо-таки п...
bezumkin
Василий Наумкин
20.06.2022 09:30
Не надо, оно по умолчанию так - я просто чуть более подробно написал.
bezumkin
Василий Наумкин
19.06.2022 13:42
А можно же из 1 файла сделать 2 экспорта. По-умолчанию, и отдельно для футера: export const Footer =...
bezumkin
Василий Наумкин
19.06.2022 09:44
Тебе спасибо, что поддерживаешь рублём мои начинания!