2014-04-02 81 views
0

我試圖將Miles Johnsons出色的上傳器組件應用到我的應用中。但這裏有問題:根據上傳圖像的尺寸,我需要更改調整尺寸。CakePHP上傳器:根據圖像尺寸更改調整大小的值

我試圖修改回調的轉變:

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; 
} 

請不認爲這是所有未經測試示例代碼。

相關問題