Cakephp(Cakephp1.2RC2現在)には、便利な画像アップロード機能くらいあると思っていたが、そうでもないようだ。
管理画面のカテゴリ管理で、カテゴリ情報に画像をつけたい。特にデータベースに画像データを格納する必要はない。ただ画像ファイルをWebからアップロードしてサーバ上に格納し、カテゴリデータにはそのパスを記録するようにする。
今回参考にさせていただいたのは下記のページ。
CakePHP jQuery を使用した Ajax ファイルアップロード | Sun Limited Mt.
他にもやり方はあるのだろうと思うが、このやり方を選んだ理由の一つはAjaxを使ってみたかったから。。。
ほとんど参考ページにあるやり方そのままで、簡単にできてしまった。
jquery.jsとjquery.form.jsは、あいにくどこからとってきたか忘れてしまったが、結構探し回ったような気がする。
これらを/app/webroot/jsに格納して、実際に画像をアップロードさせるビューで指定。
/app/views/categories/admin_add.ctp
さらに、ファイルアップロード用の入力項目を設置
/app/views/categories/admin_add.ctp
上記のソースで下記のような感じになる。
アップロードボタンのonClickにある、「#CategoryAddForm」の部分はFormタグのid。
特にビューでFormタグのidを指定していないけれど、データを追加(ADD)するフォームであれば、Formの冒頭として下記のような記述がしてあれば、自然とFormタグにid="CategoryAddForm"が指定される。
/app/views/categories/admin_add.ctp
また、「target: '#uploadFile'」の部分は、AJAXでの作業結果が返ってくる場所のことだろう。今回は、直下に
id="uploadFile"を指定したdivタグを用意した。
最後の「url: '/admin/categories/upload/'」の部分はAJAXで処理する作業のコントローラを指定しているようだ。
で、そのAJAXで処理する作業のコントローラのほうは、下記のような感じ。
/app/controllers/categories_controller.php
-
function admin_upload() {
-
if (!$this->data['Category']['upload_file']) {
-
$this->set('error', 'アップロードするファイルを選択してください');
-
$this->render('admin_upload','ajax');
-
} else {
-
$filename = '';
-
if ($this->data['Category']['upload_file']['type'] == 'image/jpeg') {
-
} elseif ($this->data['Category']['upload_file']['type'] == 'image/pjpeg') {
-
} elseif ($this->data['Category']['upload_file']['type'] == 'image/gif') {
-
} elseif ($this->data['Category']['upload_file']['type'] == 'image/png') {
-
} elseif ($this->data['Category']['upload_file']['type'] == 'image/x-png') {
-
}
-
if ($filename) {
-
$this->set('filename', $filename);
-
$this->render('admin_upload','ajax');
-
} else {
-
$this->set('error', '画像フォルダ(' . IMAGES . ')に書き込みできません。');
-
$this->render('admin_upload','ajax');
-
}
-
} else {
-
$this->set('error', '画像ファイルではありません。');
-
$this->render('admin_upload','ajax');
-
}
-
}
-
}
今回は、JPEGとGIFとPNGをアップロードできるようにしてみた。
上記のコントローラの作業の結果は、先ほどのid="uploadFile"を指定したdivタグに表示されるのだが、その表示内容もあらかじめビューで記述しておく。
/app/views/categories/admin_upload.ctp
-
<p><?php echo $error;?></p>
-
<?php else: ?>
-
<p>画像をアップロードしました。</p>
-
<?php endif; ?>
headerでcharsetを送っておかないと、文字化けするのでちょっと注意が必要だ。
画像をアップした後のフォームはこんな感じ。
今回はとりあえずAJAXを使ってみました、という程度だが、本来であればもっといろいろとできることがあるんだろう。徐々によくしていきたい。
Tags: AssocPublisher, cakephp


No comments
Comments feed for this article
Trackback link: http://www.secondbrain.co.jp/blog/wp-trackback.php?p=65