Mediapluginで、以下の2点を実施してみたかったんだけど、いい方法がなかったので仕方なくプログラムを修正してみました。
もっと簡単な方法があれば教えてください。
やりたかったのは下記の2点です。
1. 画像ファイルをアップロードしたとき pngならばpngで、jpgならばjpgで、gifならgifで保管する。
2. モデル毎に、画像サイズを変更する。
設定は下記の通り。
1. app/config/bootstrap.php
Media.filter.imageのconvertを削除する。
修正前)
Configure::write('Media.filter.image',array(
'xs' => array('convert' => 'image/png', 'fit' => array(450, 450)),
'm' => array('convert' => 'image/png', 'fit' => array(300, 300)),
's' => array('convert' => 'image/png', 'fit' => array(150, 150)),
);
修正後)
Configure::write('Media.filter.image',array(
'xs' => array('fit' => array(450, 450)),
'm' => array('fit' => array(300, 300)),
's' => array('fit' => array(150, 150)),
);
2.Attachmentsクラス$actsAsの'Media.Media'にcreateVersionsのパラメータを追加。
createVersionsに、サムネイルを作成したいバージョンを記載する。
例) 1のうち、450x450と150x150ピクセルに収まる画像ファイルをアップロードしたい場合。
'Media.Media' => array(
'metadataLevel' => 2,
'makeVersions' => true,
'filterDirectory' => MEDIA_FILTER,
'createVersions' => array('s','xs'),
)
3.修正したMediaBehaviorクラスのmakeメソッドを下記のように変更する(青字部分追加)。
function make(&$Model, $file, $overwrite = false) {
extract($this->settings[$Model->alias]);
list($file, $relativeFile) = $this->_file($Model, $file);
$relativeDirectory = DS . rtrim(dirname($relativeFile), '.');
$name = Medium::name($file);
// 元のファイルタイプ別に設定を行うために、元のファイルのmimeTypeを取得する。
$File = new File($file);
$mimeType = MimeType::guessType($File->pwd());
$filter = Configure::read('Media.filter.' . strtolower($name));
// 指定したバージョンのみ選択させる。
$versionLists = !empty($createVersions) ? $createVersions : array_keys($filter);
$versionLists = is_array($versionLists) ? $versionLists : array($versionLists);
$hasCallback = method_exists($Model, 'beforeMake');
foreach ($versionLists as $version) {
// Version情報を取り出す。
if( ! isset($filter[$version])){
trigger_error("MediaBehavior::make - Unkown Version `{$version}`. Please check versions.",E_USER_WARNING);
continue;
}
$instructions = $filter[$version];
// convertの設定がなければ、現在のファイルのmime-typeを使用する。
if(! array_key_exists('convert',$instructions) ){
$instructions = array('convert' => $mimeType) + $instructions;
}
$directory = Folder::slashTerm($filterDirectory . $version . $relativeDirectory);
$Folder = new Folder($directory, $createDirectory);
if (!$Folder->pwd()) {
$message = "MediaBehavior::make - Directory `{$directory}` ";
$message .= "could not be created or is not writable. ";
$message .= "Please check the permissions.";
trigger_error($message, E_USER_WARNING);
continue;
}
if ($hasCallback) {
$process = compact('overwrite', 'directory', 'name', 'version', 'instructions');
if ($Model->beforeMake($file, $process)) {
continue;
}
}
if (!$Medium = Medium::make($file, $instructions)) {
$message = "MediaBehavior::make - Failed to make version `{$version}` ";
$message .= "of file `{$file}`. ";
trigger_error($message, E_USER_WARNING);
continue;
}
$file = $Medium->store($directory . basename($file), $overwrite);
}
return true;
}
もっと簡単な方法があれば教えてください。
やりたかったのは下記の2点です。
1. 画像ファイルをアップロードしたとき pngならばpngで、jpgならばjpgで、gifならgifで保管する。
2. モデル毎に、画像サイズを変更する。
設定は下記の通り。
1. app/config/bootstrap.php
Media.filter.imageのconvertを削除する。
修正前)
Configure::write('Media.filter.image',array(
'xs' => array('convert' => 'image/png', 'fit' => array(450, 450)),
'm' => array('convert' => 'image/png', 'fit' => array(300, 300)),
's' => array('convert' => 'image/png', 'fit' => array(150, 150)),
);
修正後)
Configure::write('Media.filter.image',array(
'xs' => array('fit' => array(450, 450)),
'm' => array('fit' => array(300, 300)),
's' => array('fit' => array(150, 150)),
);
2.Attachmentsクラス$actsAsの'Media.Media'にcreateVersionsのパラメータを追加。
createVersionsに、サムネイルを作成したいバージョンを記載する。
例) 1のうち、450x450と150x150ピクセルに収まる画像ファイルをアップロードしたい場合。
'Media.Media' => array(
'metadataLevel' => 2,
'makeVersions' => true,
'filterDirectory' => MEDIA_FILTER,
'createVersions' => array('s','xs'),
)
3.修正したMediaBehaviorクラスのmakeメソッドを下記のように変更する(青字部分追加)。
function make(&$Model, $file, $overwrite = false) {
extract($this->settings[$Model->alias]);
list($file, $relativeFile) = $this->_file($Model, $file);
$relativeDirectory = DS . rtrim(dirname($relativeFile), '.');
$name = Medium::name($file);
// 元のファイルタイプ別に設定を行うために、元のファイルのmimeTypeを取得する。
$File = new File($file);
$mimeType = MimeType::guessType($File->pwd());
$filter = Configure::read('Media.filter.' . strtolower($name));
// 指定したバージョンのみ選択させる。
$versionLists = !empty($createVersions) ? $createVersions : array_keys($filter);
$versionLists = is_array($versionLists) ? $versionLists : array($versionLists);
$hasCallback = method_exists($Model, 'beforeMake');
foreach ($versionLists as $version) {
// Version情報を取り出す。
if( ! isset($filter[$version])){
trigger_error("MediaBehavior::make - Unkown Version `{$version}`. Please check versions.",E_USER_WARNING);
continue;
}
$instructions = $filter[$version];
// convertの設定がなければ、現在のファイルのmime-typeを使用する。
if(! array_key_exists('convert',$instructions) ){
$instructions = array('convert' => $mimeType) + $instructions;
}
$directory = Folder::slashTerm($filterDirectory . $version . $relativeDirectory);
$Folder = new Folder($directory, $createDirectory);
if (!$Folder->pwd()) {
$message = "MediaBehavior::make - Directory `{$directory}` ";
$message .= "could not be created or is not writable. ";
$message .= "Please check the permissions.";
trigger_error($message, E_USER_WARNING);
continue;
}
if ($hasCallback) {
$process = compact('overwrite', 'directory', 'name', 'version', 'instructions');
if ($Model->beforeMake($file, $process)) {
continue;
}
}
if (!$Medium = Medium::make($file, $instructions)) {
$message = "MediaBehavior::make - Failed to make version `{$version}` ";
$message .= "of file `{$file}`. ";
trigger_error($message, E_USER_WARNING);
continue;
}
$file = $Medium->store($directory . basename($file), $overwrite);
}
return true;
}