Zend Framework チュートリアル その5 – アルバムの一覧表示,新規追加,編集,削除,最後に
アルバムの一覧表示
データベース、ビューの骨格の設定は完了したので、アプリケーションの主要部分に着手して、いくつかアルバムを表示させます。これはIndexControllerクラス内で行い、indexAction()関数内で表にアルバムを一覧表示させます。
zf-tutorial/application/controllers/IndexController.php
... function indexAction() { $this->view->title = "My Albums"; $this->view->headTitle($this->view->title, 'PREPEND'); $albums = new Model_DbTable_Albums(); $this->view->albums = $albums->fetchAll(); } ...
最初にページのタイトルを設定して、その後にブラウザのタイトルバーに表示させるタイトルを追加しています。
fetchAll()関数はZend_Db_Table_Rowsetを返します。Zend_Db_Table_Rowsetは結果の一覧をこのアクションのビュースクリプトファイル内で反復処理出来るようにします。関連付けられたビュースクリプト index.phtml を埋めていきます。
zf-tutorial/application/views/scripts/index/index.phtml
<p><a href="<?php echo $this->url(array('controller'=>'index', 'action'=>'add'));?>">Add new album</a></p> <table> <tr> <th>Title</th> <th>Artist</th> <th> </th> </tr> <?php foreach($this->albums as $album) : ?> <tr> <td><?php echo $this->escape($album->title);?></td> <td><?php echo $this->escape($album->artist);?></td> <td> <a href="<?php echo $this->url(array('controller'=>'index', 'action'=>'edit', 'id'=>$album->id));?>">Edit</a> <a href="<?php echo $this->url(array('controller'=>'index', 'action'=>'delete', 'id'=>$album->id));?>">Delete</a> </td> </tr> <?php endforeach; ?> </table>
最初にやっていることは、アルバム追加のリンク作成です。url()ビューヘルパーはフレームワークで用意されており、正しいbase URLを含んだリンクを作るのを助けてくれます。必要なパラメータは配列として渡せば、必要に応じて結果が返ってきます。
各アルバムのタイトル、アーティスト、編集や削除するためのリンクを表示するhtmlを作成します。標準的なforeach:ループがアルバム一覧の反復処理に使われます。代替書式のコロンとendforeach;を使います。このほうがブレースを組み合わせるよりも簡単です。
再度、このurl()ビューヘルパーを編集、削除リンクの作成に使います。
http://localhost/zf-tutorial/ (or wherever you are following along from!)を表示すると、下のようなアルバム一覧が見られるはずです。

アルバムの新規追加
アルバムの新規追加する機能を記述していきます。これは2つの部分で出来ています。
- ユーザーに詳細データのフォームを表示する
- フォーム送信プロセスとデータベースへの保存
これにはZend_Formを使います。Zend_Formコンポーネントはフォームの作成と入力値のバリデートを行います。フォームを定義するためにZend_Formを継承してFormAlbumクラスを作成します。モジュールオートローダーを使っているので、クラスはformsディレクトリの中にAlbum.phpファイルを保存します。
zf-tutorial/application/forms/Album.php
<?php class Form_Album extends Zend_Form { public function __construct($options = null) { parent::__construct($options); $this->setName('album'); $id = new Zend_Form_Element_Hidden('id'); $artist = new Zend_Form_Element_Text('artist'); $artist->setLabel('Artist') ->setRequired(true) ->addFilter('StripTags') ->addFilter('StringTrim') ->addValidator('NotEmpty'); $title = new Zend_Form_Element_Text('title'); $title->setLabel('Title') ->setRequired(true) ->addFilter('StripTags') ->addFilter('StringTrim') ->addValidator('NotEmpty'); $submit = new Zend_Form_Element_Submit('submit'); $submit->setAttrib('id', 'submitbutton'); $this->addElements(array($id, $artist, $title, $submit)); } }
Form_Albumのコンストラクタ内で、id,artist,title,submitボタンの4つのフォーム要素を作成します。各項目には表示用のラベルを含めた色々な属性をセットします。テキスト要素には望まないHTMLや不要な空白文字を削除するためにStripTagsとStringTrimの2つのフィルターを追加します。ユーザーが実際に入力した情報を確認するために、必須項目に設定してNotEmptyバリデータを追加します。
表示するフォームを取得して、送信処理をしてみましょう。これはIndexControllerのaddAction()内で行います。
zf-tutorial/application/controllers/IndexController.php
... function addAction() { $this->view->title = "Add new album"; $this->view->headTitle($this->view->title, 'PREPEND'); $form = new Form_Album(); $form->submit->setLabel('Add'); $this->view->form = $form; if ($this->getRequest()->isPost()) { $formData = $this->getRequest()->getPost(); if ($form->isValid($formData)) { $artist = $form->getValue('artist'); $title = $form->getValue('title'); $albums = new Model_DbTable_Albums(); $albums->addAlbum($artist, $title); $this->_redirect('/'); } else { $form->populate($formData); } } } ...
もう少し詳しく見てみましょう。
$form = new Form_Album(); $form->submit->setLabel('Add'); $this->view->form = $form;
Form_Albumを生成して、submitボタンのラベルに"Add"を追加、それをレンダリングのビューに割り当てます。
if ($this->getRequest()->isPost()) { $formData = $this->getRequest()->getPost(); if ($form->isValid($formData)) {
リクエストオブジェクトのisPost()メソッドがtrueなら、フォームが送信されているのでgetPost()を使ってリクエストからフォームデータを取得します。そして、isValid()メンバー関数を使って妥当性の確認をします。
$artist = $form->getValue('artist'); $title = $form->getValue('title'); $albums = new Model_DbTable_Albums(); $albums->addAlbum($artist, $title);
フォームがvalidなら、Model_DbTable_Albumモデルクラスを生成して、データベースに新しいレコードを追加するために予め用意したaddAlbum()メソッドを使います。
$this->_redirect('/');
新しいアルバムが追加されれば、コントローラーの_redirect()メソッドを使ってホームページにリダイレクトします。
} else { $form->populate($formData); }
フォームデータがvalidでなければ、ユーザーの入力データをフォームにいれて再表示します。
フォームを表示するためにadd.phtmlビュースクリプトが必要です。
zf-tutorial/application/views/scripts/index/add.phtml
<?php echo $this->form ;?>
見ての通り、フォームの描画はフォーム自身が描画方法を知っているので非常にシンプルです。
アルバムの編集
アルバムの編集は追加とほとんど一緒なので、非常に似ています。
zf-tutorial/application/controllers/IndexController.php
... function editAction() { $this->view->title = "Edit album"; $this->view->headTitle($this->view->title, 'PREPEND'); $form = new Form_Album(); $form->submit->setLabel('Save'); $this->view->form = $form; if ($this->getRequest()->isPost()) { $formData = $this->getRequest()->getPost(); if ($form->isValid($formData)) { $id = (int)$form->getValue('id'); $artist = $form->getValue('artist'); $title = $form->getValue('title'); $albums = new Model_DbTable_Albums(); $albums->updateAlbum($id, $artist, $title); $this->_redirect('/'); } else { $form->populate($formData); } } else { $id = $this->_getParam('id', 0); if ($id > 0) { $albums = new Model_DbTable_Albums(); $form->populate($albums->getAlbum($id)); } } } ...
アルバムの追加との違いを見てみましょう。最初にユーザーにフォームを表示するとき、アルバムのアーティストとタイトルをデータベースから取得して、フォーム要素に入れる必要があります。これがそのメソッドの下部です。
$id = $this->_getParam('id', 0); if ($id > 0) { $albums = new Model_DbTable_Albums(); $form->populate($albums->getAlbum($id)); }
これはリクエストがPOSTでなければ実行されます。_getParam()メソッドを使ってリクエストからidを取得します。データベースの行を取得するためにモデルを使って、行データを直接フォームに入れています。
フォームをバリデートした後、正しくデータベースにデータを戻すために保存します。これはモデルのupdateAlbum()メソッドを使って行います。
$id = (int)$form->getValue('id'); $artist = $form->getValue('artist'); $title = $form->getValue('title'); $albums = new Model_DbTable_Albums(); $albums->updateAlbum($id, $artist, $title);
ビューテンプレートはadd.phtmlとおなじです。
zf-tutorial/application/views/scripts/index/edit.phtml
<?php echo $this->form ;?>
これで追加と編集ができるようになりました。
アルバムの削除
このアプリケーションを完成させるために、削除機能を追加します。一覧ページの各アルバムに削除リンクがあります。クリックされたら削除するのは非常に単純な方法ですが、この方法は良くない。HTTPの仕様を思い出そう。GETを使って取り返しのつかないことをすべきではない。代わりにPOSTを使うべきです。
ユーザーが削除をクリックしたら確認フォームを表示して、"はい"をクリックしたら削除を実行します。フォームは瑣末なものなので、ビューに直接書いています。
IndexController::deleteAction()のアクションのコードを書きましょう。
zf-tutorial/application/controllers/IndexController.php
... public function deleteAction() { $this->view->title = "Delete album"; $this->view->headTitle($this->view->title, 'PREPEND'); if ($this->getRequest()->isPost()) { $del = $this->getRequest()->getPost('del'); if ($del == 'Yes') { $id = $this->getRequest()->getPost('id'); $albums = new Model_DbTable_Albums(); $albums->deleteAlbum($id); } $this->_redirect('/'); } else { $id = $this->_getParam('id', 0); $albums = new Model_DbTable_Albums(); $this->view->album = $albums->getAlbum($id); } } ...
追加と削除の場合と同様に、確認フォームを表示するときや削除を行うときは、その解決にリクエストのisPost()メソッドを使います。実際の行の削除にはModel_DbTable_Albums()のdeleteAlbum()メソッドを使います。リクエストがPOSTでなければ、idパラメータを探して正しいデータベースのレコードを取得してビューにアサインします。
ビュースクリプトは単純なフォームです。
<p>Are you sure that you want to delete
'<?php echo $this->escape($this->album['title']); ?>' by
'<?php echo $this->escape($this->album['artist']); ?>'?
</p>
<form action="<?php echo $this->url(array('action'=>'delete')); ?>" method="post">
<div>
<input type="hidden" name="id" value="<?php echo $this->album['id']; ?>" />
<input type="submit" name="del" value="Yes" />
<input type="submit" name="del" value="No" />
</div>このスクリプトでは、ユーザーに確認メッセージと”はい”、“いいえ”ボタンのフォームを表示します。このアクションでは、削除する際に明確に"はい"の確認をします。
以上です。これで完全に動作するアプリケーションが完成しました。
最後に
これで、Zend Frameworkを使ったシンプルで機能的なMVCアプリケーションの作成という我々の記事も終了です。 あなたに興味を持ってもらえ、かつ参考になれば幸いです。
もし誤りがあれば、どうか rob at akrabat dot com までメールしてください!
このチュートリアルはZend Frameworkの基礎です。探求するコンポーネントはまだまだあります!
マニュアル(http://framework.zend.com/manual)も読むべきです! もし、フレームワークの開発に興味を持ったら、 development wiki (http://framework.zend.com/developer) も読んでください。
最後に、印刷版を希望なら購入可能なZend Framework in Action という書籍を私は著しています。 詳細は http://www.zendframeworkinaction.com で。チェケラ (^^)
[訳者より]翻訳内容に誤りなどがあれば、この投稿のコメント欄に記入をお願いします。
目次
- Zend Framework チュートリアル - Getting Started with Zend Framework
- Zend Framework チュートリアル その1 - 要件,チュートリアルの条件,フレームワークの取得,Zend_Tool
- Zend Framework チュートリアル その2 - アプリケーションの作成開始
- Zend Framework チュートリアル その3 - アプリケーションの具体的なコード,コントローラのセットアップ,データベース,モデル
- Zend Framework チュートリアル その4 - レイアウトとビュー
- Zend Framework チュートリアル その5 - アルバムの一覧表示,新規追加,編集,削除,最後に