Nullyのぶろぐ

仙台で働くエンジニアの日記

Zend FrameworkでPartialLoopヘルパーを利用する

今回はZend Frameworkにて、ループを利用してパーシャルを表示する際に便利な、PartialLoopヘルパーを利用します。

詳細は続きからどうぞ!

はじめに

PartialLoopヘルパーは読んで字のごとく、ループ処理をするような箇所に利用するヘルパーです。

たとえば、ユーザー一覧を表示する際に、actionView内にループ処理を記述しますが、そのループをパーシャルとして管理し、再利用性を高めます。

使ってみる

私の持っている最低バージョンの1.7.4でも利用できるようだったので、もしかすると、1.6系以前でも利用できるかもしれません。

用意するファイルは以下の3つです。

今回は、UserControllerに、listsActionがある前提で記述していきます。

 

//UserController.php

class 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内にごちゃごちゃとループ処理を記述して、下手に見にくくなる&再利用性が低くなるよりは、パーシャルで分割してしまって、再利用率を高めつつ、ソースの管理が行いやすくなるので、利用度は高くなるかと思います。