Zend FrameworkでPartialLoopヘルパーを利用する
今回はZend Frameworkにて、ループを利用してパーシャルを表示する際に便利な、PartialLoopヘルパーを利用します。
詳細は続きからどうぞ!
はじめに
PartialLoopヘルパーは読んで字のごとく、ループ処理をするような箇所に利用するヘルパーです。
たとえば、ユーザー一覧を表示する際に、actionView内にループ処理を記述しますが、そのループをパーシャルとして管理し、再利用性を高めます。
使ってみる
私の持っている最低バージョンの1.7.4でも利用できるようだったので、もしかすると、1.6系以前でも利用できるかもしれません。
用意するファイルは以下の3つです。
今回は、UserControllerに、listsActionがある前提で記述していきます。
//UserController.phpclass UserController extends Zend_Controller_Action {
public function listsAction() {
$users = new Model_Users();
$lists = $users->fetchAll(); //全ユーザーを取得
$this->view->users = $lists;
}
}
views/scripts/user/lists.phtml
<h1>ユーザー一覧(全部出し)</h1><?php
$this->partialLoop("partials/userList.phtml", $this->users);
?>
views/scripts/partials/userList.phtml
<?php $this->user->name; ?>
解説
[lists.phtml]
このviewファイルに記述している、
$this->partialLoop("partials/userList.phtml", $this->users); ?>
が今回利用しているヘルパーの「PartialLoop」ヘルパーの呼び出しに当たります。
このヘルパーは引数を3個取り、第一引数は「ビューパーシャルのファイル名」、第二引数は「モジュール名または、パーシャル内部で利用する値」、第三引数は「パーシャル内部で利用する値」となります。
第二・第三引数は省くことができます。
第二引数は、呼び出すパーシャルが格納されているモジュール名を指定することで、モジュール内に格納されているパーシャルを呼び出すことができます。また、第2引数はパーシャル内で利用するための値を渡すことができます。
※変数を渡す際の注意点PartialLoopヘルパー内で、配列かオブジェクトなのかなどの判定を行い、一致した形でviewのassignメソッドを利用し、変数をよびだすことができるようになっていますが、オブジェクトを渡した際($userがUserクラスの場合など)は、渡すオブジェクトでtoArrayメソッドを定義しておくのが良いかと思います。
理由としては、Zend Framework 1.8系付近から、Zend_Db_Table_Abstractを利用し、O/Rマッパーを利用したデータアクセスが推奨されています。
この推奨により、メンバ変数(たとえば、$_user_idや$_user_nameなど)がpublicじゃない場合、空配列としてデータがassingされてしまうことがあるからです。
Partial.php 89行目付近
if (!empty($model)) {
if (is_array($model)) {
$view->assign($model);
} elseif (is_object($model)) {
if (null !== ($objectKey = $this->getObjectKey())) {
$view->assign($objectKey, $model);
} elseif (method_exists($model, 'toArray')) {
$view->assign($model->toArray());
} else {
$view->assign(get_object_vars($model));
}
}
}
このように記述されていますが、「get_object_vars」はクラスのpublicなメンバ変数しか取得できないので、上記のような現象が発生します。
なので、あらかじめModel内にでもtoArrayメソッドを定義しておき、配列で値を返すようにされていれば、利用しやすいかと思います。
(あまりうまく説明できていないような気がする。。。)
使ってみて
view内にごちゃごちゃとループ処理を記述して、下手に見にくくなる&再利用性が低くなるよりは、パーシャルで分割してしまって、再利用率を高めつつ、ソースの管理が行いやすくなるので、利用度は高くなるかと思います。