2014-04-02 1 views
0

Я пытаюсь реализовать отличный компонент Uploader Miles Johnsons в моем приложении. Но вот проблема: в зависимости от размеров загруженного изображения мне нужно изменить размеры размера.CakePHP Uploader: изменение значений размера в зависимости от размера изображения

Я попытался изменить преобразование в функции обратного вызова:

public $actsAs = array(
     'Uploader.Attachment' => array(
      'image' => array(
       'nameCallback' => 'formatName', 
       'tempDir' => TMP, 
       'uploadDir' => UPLOADDIR, 
       'finalPath' => '/img/photos/', 
       'overwrite' => false, 
       'stopSave' => true, 
       'allowEmpty' => false, 
       'transforms' => array(
        array(
         'class' => 'exif', 
         'self' => true 
        ), 
        'image_sized' => array(
         'class' => 'resize', 
         'nameCallback' => 'transformSizedNameCallback', 
         'width' => 1680, 
         'height' => 980, 
         'aspect' => true 
        ) 
       ) 
      ) 
     ), 
     'Uploader.FileValidation' => array(
      'image' => array(
       'extension' => array(
        'value' => array('jpg', 'png', 'jpeg'), 
        'error' => 'Nicht unterstütztes Dateiformat - bitte JPG- oder PNG-Datei hochladen.' 
       ), 
       'minHeight' => array(
        'value' => 980, 
        'error' => 'Das Bild muss mindestens 980 Pixel hoch sein.' 
       ), 
       'minWidth' => array(
        'value' => 980, 
        'error' => 'Das Bild muss mindestens 980 Pixel breit sein.' 
       ), 
       'required' => array(
        'value' => true, 
        'error' => 'Bitte wählen Sie ein Bild aus.' 
       ) 
      ) 
     ) 
    ); 

    public function beforeTransform($options) { 
     if($options['dbColumn'] == 'image_sized') { 
      if($height > $width) { 
       $options['width'] = 980; 
       $options['height'] = 1680; 
      } 
     } 
     return $options; 
    } 

Я могу точно определить правильное преобразование, но как я могу получить доступ размеры изображения должны быть преобразованы внутри beforeTransform? Где я могу получить $width и $height?

ответ

1

Я не знаком с ним, но глядя на код похоже, единственный вариант у вас есть в этой точке, используя значение dbColumn для доступа в данный момент обрабатываются данные поля, что-то вроде

$file = $this->data[$this->alias][$options['dbColumn']]; 

Конечно, для этого требуется значение dbColumn в соответствии с именем поля ввода! Если это не так, тогда вам понадобится дополнительная опция, которая содержит имя поля и вместо этого использует это.

$file - это только исходные данные, скорее всего, file upload array. Предполагая, что один файл, проверьте tmp_name для его размеров, либо самостоятельно, либо использовать Transite\File класс, который может обрабатывать массивы загружать файлы и предоставляет метод для получения размеров возможного изображения:

$transitFile = new File($file); 
$dimensions = $transitFile->dimensions(); 

https://github.com/milesj/transit/blob/1.5.1/src/Transit/File.php#L121

Так, наконец, вы могли бы сделать что-то вроде этого:

public function beforeTransform($options) { 
    if($options['dbColumn'] == 'image_sized') { 
     $file = $this->data[$this->alias][$options['dbColumn']]; 
     $transitFile = new \Transit\File($file); 
     $dimensions = $transitFile->dimensions(); 

     if($dimensions === null) { 
      // not an image or something else gone wrong, 
      // maybe throw an exception or wave your arms and call for help 
     } elseif($dimensions['height'] > $dimensions['width']) { 
      $options['width'] = 980; 
      $options['height'] = 1680; 
     } 
    } 
    return $options; 
} 

Пожалуйста, не то, что все это непроверенные пример кода.