mediaプラグイン導入(2) 表示
mediaプラグインで、Userに関連付けてattachmentsおよびpp/webroot/media/transfer/img 以下に保管した画像の表示実装です。
追記:2/17 0時頃
filterに出力される縮小画像の作成タイミングに、認識間違いがありました。記載を修正して課題を1つ追加しました。
まず、Userの情報取得の際に、Atacchmentの情報を同時取得できるように設定します。
/* ユーザ情報取得 */ function getUser($id) { // Media.Attachmentから関連ファイルの取得 +$this->User->hasMany['Attachment']['conditions']['foreign_key'] = $id; + $user = $this->User->find('first', array( 'conditions' => array('User.id' => $id), 'fields' => array( 'User.id', 'User.group_id', 'User.name', 'User.pcmail', 'User.mobile_mail', 'User.modified', ), - 'recursive' => -1, + 'recursive' => 1, + 'contain' => array( + 'Attachment', + ), ));
これでUser取得度同時に関連Attachmentの情報を得られるようになります*2。
* User o id 1 (中略) * Attachment o 0 + dirname transfer/img + basename toomuch.jpg + alternative too (略)
これをviewで表示するために、Media.Mediumプラグインを追加します。
app_controller.php
--- a/app/controllers/app_controller.php +++ b/app/controllers/app_controller.php @@ -41,6 +41,7 @@ class AppController extends Controller var $helpers = array( 'Html', 'Form', 'Javascript', 'Settings', + 'Media.Medium', 'Token' );
viewには、$medium->embed()メソッドを使用し、例えば以下のように書きます。
views/user/index.ctp
+<?php + if (isset($target_user['Attachment'][0])) { + echo $medium->embed($medium->file('filter/s', $target_user['Attachment'][0])); + + } else { + echo " "; + } +?>
画像の自動縮小
$medium->fileの第一引数、'filter/[画像サイズ]'は必須です。
画像サイズの設定に応じて縮小した画像が、元画像の保存時にfilter/[画像サイズ]/に自動作成済みなので、これをimgタグで出力します。
上記の設定で出力されたimgタグ
<img src="/cake-frame/media/filter/s/transfer/img/toomuch.png" alt="" height="100" width="100">
課題
基本的な表示は以上の通りですが、できれば
- altを設定したい(alternativeの設定で?)
- リンク付き画像にしたい
- 画像サイズはimgタグのwidthではなくCSSで調節したい
- 画像設定がない場合、Noimage画像を出力したい
- 画像設定済みの場合、attachmentsヘルパーで表示される内容や画像変更フローを変えたい
- png以外でも出力したい(AnimationGIFとか)
- アクセスしたときだけ自動縮小画像をfilterに出力したい
- 圧縮・変換一切なしのオリジナル画像を表示したい
などの希望があります。
上2つはmediumヘルパーだけで対応できそうですが、それ以上は拡張ヘルパーなどを作る必要がありそうです。