Zend_Viewの処理の流れ
Zend_Viewは、MCVモデルで言うところのビューを担当するコンポーネントです。Zend_Viewは、コントローラからデータや表示方法についての指示を受け取り、表示内容を作成したうえでその表示内容をコントローラに返します。
実は、前回までに登場したサンプルもZend_Viewを利用しています。フロントコントローラは、標準ではZend_Viewのインスタンスを自動的に生成し、その生成した結果を表示するようになっています。そのため、内容の生成や、生成の補助を含むZend_Viewのいくつかの機能は、既に登場しているわけです。
では最初に、コントローラの視点から見てZend_Viewをどのように使うかを説明します。おおまかに言って次のような流れになっています。
- Zend_Viewのインスタンスを作成します。
- Zend_Viewのインスタンスに、必要な変数を設定します。
- 実際に描画を行う「ビュースクリプト」をZend_Viewのインスタンスにrenderメソッドで渡します(Zend_Viewがビュースクリプトを処理して、出力を生成します)。
- 描画の結果がrenderメソッドの返り値として戻ってきます。
また、Zend_Viewには表示内容作成を支援するための、次の機能も提供しています:
- 変数のエスケープ処理。
- ヘルパによる内容の作成。
- 作成された内容へのフィルタ。
これらを図にすると、次のようになります:
なお、コントローラの役割を行うスクリプトを、ここからはコントローラスクリプトと呼ぶことにします。
Zend_Viewを使った簡単な例
前回までの例では、Zend_Viewはフロントコントローラによって自動的に作成されていました。これではZend_Viewがどのように動作しているのかが分かり辛いので、まず直接Zend_Viewのインスタンスを作成し、使う例を見ていきましょう。この例は、コントローラに対応する部分の「index.php」とビュースクリプトの「view.phtml」から構成されています。
なお、例を単純にするために、「view.phtml」は「index.php」と同じフォルダに配置されているとします(一般的なファイルの配置は後で説明します)。
「index.php」では、前述の手順通りにZend_Viewのインスタンスを作成し、変数を設定したうえでビュースクリプトを渡しています。そして返ってきた描画結果を出力しています。
<?php require_once 'Zend/View.php'; $view = new Zend_View(); // インスタンスの作成 $view->str = '<b>エスケープのテスト</b>'; //データの設定 $view->abc = array('a', 'b', 'c'); //データの設定 $view->setScriptPath('.');// ビュースクリプトの設置してある場所 echo $view->render('view.phtml'); // 描画の実行と出力
「view.phtml」には描画の方法が記述されています。ここで注意しておく必要があるのは、「view.phtml」で実行されるコードについてはネームスペースがZend_Viewのオブジェクトのものになっていることです。つまり、コントローラスクリプトでZend_Viewのインンスタンスの変数として設定された値($view->str
、$view->abc
)はthis
の変数($this->str
、$this->abc
)として参照されます。
<html> <head><title>Hello Zend_View!</title></head> <body> <p><?php echo $this->escape($this->str); /* エスケープ処理 */ ?></p> <?php echo $this->htmlList($this->abc); /* ビューヘルパの利用 */ ?> </body> </html>
ここでは、$this->escape
は「エスケープ処理」を、$this->htmlList
は「ビューヘルパの呼び出し」を行っています。
エスケープ処理はHTMLで特別な意味を持つ文字を、そのまま表示されるようにする処理です。ここでは、元の文字列の<や>を、それぞれ<と>で置き換えています。
ビューヘルパは、よく使われる表示を登録しておくための仕組みです。htmlList
はZend_View組み込みのビューヘルパで、配列を受け取って、それをHTML表現のリストに変換したものを返します(組み込みのもの以外に、自分でビューヘルパを作成し、登録することもできます)。ビューヘルパについては、次回で詳しく説明する予定です。
「index.php」を実行した結果は次のようになります。