WEB RHODIA RHODIA on WEB

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>&nbsp;</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!)を表示すると、下のようなアルバム一覧が見られるはずです。

zf-tute-screen2

アルバムの新規追加

アルバムの新規追加する機能を記述していきます。これは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 で。チェケラ (^^)

[訳者より]翻訳内容に誤りなどがあれば、この投稿のコメント欄に記入をお願いします。


目次

  1. Zend Framework チュートリアル - Getting Started with Zend Framework
  2. Zend Framework チュートリアル その1 - 要件,チュートリアルの条件,フレームワークの取得,Zend_Tool
  3. Zend Framework チュートリアル その2 - アプリケーションの作成開始
  4. Zend Framework チュートリアル その3 - アプリケーションの具体的なコード,コントローラのセットアップ,データベース,モデル
  5. Zend Framework チュートリアル その4 - レイアウトとビュー
  6. Zend Framework チュートリアル その5 - アルバムの一覧表示,新規追加,編集,削除,最後に
コメント (0) トラックバック (1)

コメントを書く