mediaプラグイン導入(2) 表示

mediaプラグインで、Userに関連付けてattachmentsおよびpp/webroot/media/transfer/img 以下に保管した画像の表示実装です。

  1. 前記事 mediaプラグイン導入(1) 基本的な導入 - 趣味の延長線



追記:2/17 0時頃
 filterに出力される縮小画像の作成タイミングに、認識間違いがありました。記載を修正して課題を1つ追加しました。


まず、Userの情報取得の際に、Atacchmentの情報を同時取得できるように設定します。

app_controllers.php*1

/* ユーザ情報取得 */
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 "&nbsp;";
+       }
+?>

画像の自動縮小

$medium->fileの第一引数、'filter/[画像サイズ]'は必須です。
画像サイズの設定に応じて縮小した画像が、元画像の保存時にfilter/[画像サイズ]/に自動作成済みなので、これをimgタグで出力します。

上記の設定で出力されたimgタグ

<img src="/cake-frame/media/filter/s/transfer/img/toomuch.png" alt="" height="100" width="100">

画像の自動縮小設定は、mediaプラグインのcore.phpで設定変更可能です。

課題

基本的な表示は以上の通りですが、できれば

  1. altを設定したい(alternativeの設定で?)
  2. リンク付き画像にしたい
  3. 画像サイズはimgタグのwidthではなくCSSで調節したい
  4. 画像設定がない場合、Noimage画像を出力したい
  5. 画像設定済みの場合、attachmentsヘルパーで表示される内容や画像変更フローを変えたい
  6. png以外でも出力したい(AnimationGIFとか)
  7. アクセスしたときだけ自動縮小画像をfilterに出力したい
  8. 圧縮・変換一切なしのオリジナル画像を表示したい

などの希望があります。

上2つはmediumヘルパーだけで対応できそうですが、それ以上は拡張ヘルパーなどを作る必要がありそうです。

*1:閲覧者の情報を得るためapp_controllerに、設定しています

*2:前記事で、models/user.phpに$hasMany関連付け済み