コントローラスクリプト

ビュースクリプト

コントローラが変数を代入して render() をコールすると、 指定されたビュースクリプトを Zend_View が読み込み、Zend_View インスタンスのスコープでそれを実行します。したがって、 ビュースクリプトの中で $this を参照すると、 実際には Zend_View のインスタンスを指すことになります。

コントローラからビューに代入された変数は、 ビューインスタンスのプロパティとして参照できます。例えば、 コントローラで変数 'something' を代入したとすると、 ビュースクリプト内ではそれを $this->something で取得できます (これにより、どの値がコントローラから代入されたもので、 どの値がスクリプト内部で作成されたものなのかを追いかけられるようになります)。

Zend_View の導入の部分で示したビュースクリプトの例を思い出してみましょう。

  1. span style="color: #ff0000;">'author''title'

出力のエスケープ

ビュースクリプトで行うべき仕事のうち最も重要なもののひとつは、 出力を適切にエスケープすることです。これは、 クロスサイトスクリプティング攻撃を防ぐのを助けます。 それ自身がエスケープを行ってくれるような関数、メソッド、 あるいはヘルパーを使用しているのでない限り、 変数を出力する際には常にそれをエスケープしなければなりません。

Zend_View の escape() というメソッドが、このエスケープを行います。

  1. // ビュースクリプトの悪い例
  2. // ビュースクリプトのよい例

デフォルトでは、escape() メソッドは PHP の htmlspecialchars() 関数でエスケープを行います。しかし環境によっては、 別の方法でエスケープしたくなることもあるでしょう。 コントローラから setEscape() メソッドを実行することで、 エスケープに使用するコールバックを Zend_View に通知できます。

  1. // Zend_View のインスタンスを作成します
  2. // エスケープに htmlentities を使用するように通知します
  3. $view->setEscape('htmlentities');
  4.  
  5. // あるいは、クラスの静的メソッドを使用するように通知します
  6. 'SomeClass', 'methodName'));
  7.  
  8. // あるいは、インスタンスメソッドを指定することもできます
  9. 'methodName'));
  10.  
  11. // そして、ビューをレンダリングします

コールバック関数あるいはメソッドは、 エスケープする値を最初のパラメータとして受け取ります。 それ以外のパラメータはオプションとなります。

別のテンプレートシステムの使用

PHP 自身も強力なテンプレートシステムではありますが、 開発者の多くは、デザイナにとっては高機能すぎる/複雑すぎる と感じており、別のテンプレートエンジンをほしがっているようです。 Zend_View では、そのような目的のために二種類の仕組みを提供します。 ビュースクリプトを使用することによるものと、 Zend_View_Interface 実装することによるものです。

ビュースクリプトを使用したテンプレートシステム

ビュースクリプトを使用して、PHPLIB 形式のテンプレートのような 別のテンプレートオブジェクトのインスタンスを作成し、 それを操作できます。ビュースクリプトをこのように使用する方法は、 以下のようになります。

  1. span style="color: #ff0000;">'template.inc'"booklist" => "booklist.tpl",
  2.         "eachbook" => "eachbook.tpl"'author', $this->escape($val['author''title', $this->escape($val['title']);
  3.         $tpl->parse("books", "eachbook""output", "booklist""nobooks", "nobooks.tpl")
  4.     $tpl->pparse("output", "nobooks");
  5. }

関連するテンプレートファイルは、このようになります。

  1. <!-- booklist.tpl -->
  2. <table>
  3.     <tr>
  4.         <th>著者</th>
  5.         <th>タイトル</th>
  6.     </tr>
  7.     {books}
  8. </table>
  9.  
  10. <!-- eachbook.tpl -->
  11.     <tr>
  12.         <td>{author}</td>
  13.         <td>{title}</td>
  14.     </tr>
  15.  
  16. <!-- nobooks.tpl -->
  17. <p>表示する本がありません。</p>

Zend_View_Interface を使用したテンプレート

Zend_View 互換のテンプレートエンジンを使用するほうが簡単だという人もいるでしょう。 Zend_View_Interface では、 互換性を保つために最低限必要なインターフェイスを定義しています。

  1. /**
  2. * テンプレートエンジンオブジェクトを返します
  3. *//**
  4. * ビュースクリプト/テンプレートへのパスを設定します
  5. *//**
  6. * すべてのビューリソースへのベースパスを設定します
  7. */'Zend_View');
  8.  
  9. /**
  10. * ビューリソースへのベースパスを追加します
  11. */'Zend_View');
  12.  
  13. /**
  14. * 現在のスクリプトのパスを取得します
  15. *//**
  16. * テンプレート変数をオブジェクトのプロパティとして代入するためのオーバーロードメソッド
  17. *//**
  18. * テンプレート変数を手動で代入したり、複数の変数を
  19. * 一括設定したりします
  20. *//**
  21. * 代入済みのテンプレート変数を削除します
  22. *//**
  23. * $name というテンプレートをレンダリングします
  24. */

このインターフェイスを使用すると、 サードパーティのテンプレートエンジンをラップして Zend_View 互換のクラスを作成することが簡単になります。 例として、Smarty 用のラッパーはこのようになります。

  1. span style="color: #808080; font-style: italic;">/**
  2.      * Smarty object
  3.      * @var Smarty
  4.      *//**
  5.      * コンストラクタ
  6.      *
  7.      * @param string $tmplPath
  8.      * @param array $extraParams
  9.      * @return void
  10.      *//**
  11.      * テンプレートエンジンオブジェクトを返します
  12.      *
  13.      * @return Smarty
  14.      *//**
  15.      * テンプレートへのパスを設定します
  16.      *
  17.      * @param string $path パスとして設定するディレクトリ
  18.      * @return void
  19.      */'無効なパスが指定されました');
  20.     }
  21.  
  22.     /**
  23.      * 現在のテンプレートディレクトリを取得します
  24.      *
  25.      * @return string
  26.      *//**
  27.      * setScriptPath へのエイリアス
  28.      *
  29.      * @param string $path
  30.      * @param string $prefix Unused
  31.      * @return void
  32.      */'Zend_View'/**
  33.      * setScriptPath へのエイリアス
  34.      *
  35.      * @param string $path
  36.      * @param string $prefix Unused
  37.      * @return void
  38.      */'Zend_View'/**
  39.      * 変数をテンプレートに代入します
  40.      *
  41.      * @param string $key 変数名
  42.      * @param mixed $val 変数の値
  43.      * @return void
  44.      *//**
  45.      * empty() や isset() のテストが動作するようにします
  46.      *
  47.      * @param string $key
  48.      * @return boolean
  49.      *//**
  50.      * オブジェクトのプロパティに対して unset() が動作するようにします
  51.      *
  52.      * @param string $key
  53.      * @return void
  54.      *//**
  55.      * 変数をテンプレートに代入します
  56.      *
  57.      * 指定したキーを指定した値に設定します。あるいは、
  58.      * キー => 値 形式の配列で一括設定します
  59.      *
  60.      * @see __set()
  61.      * @param string|array $spec 使用する代入方式 (キー、あるいは キー => 値 の配列)
  62.      * @param mixed $value (オプション) 名前を指定して代入する場合は、ここで値を指定します
  63.      * @return void
  64.      *//**
  65.      * 代入済みのすべての変数を削除します
  66.      *
  67.      * Zend_View に {@link assign()} やプロパティ
  68.      * ({@link __get()}/{@link __set()}) で代入された変数をすべて削除します
  69.      *
  70.      * @return void
  71.      *//**
  72.      * テンプレートを処理し、結果を出力します
  73.      *
  74.      * @param string $name 処理するテンプレート
  75.      * @return string 出力結果
  76.      */

この例では、Zend_View ではなく Zend_View_Smarty クラスのインスタンスを作成し、 それを使用して Zend_View と同じようなことをしています。

  1. //例 1. InitializerのinitView()で
  2. '/path/to/templates''ViewRenderer'':controller/:action.:suffix')
  3.              ->setViewScriptPathNoControllerSpec(':action.:suffix')
  4.              ->setViewSuffix('tpl');
  5.  
  6. //例 2. アクションコントローラでも同様に...
  7. 'Zend PHP 5 Certification Study Guide';
  8.         $this->view->author = 'Davey Shafik and Ben Ramsey'
  9.     }
  10. }
  11.  
  12. //例 3. アクションコントローラでのビューの初期化
  13. '/path/to/templates''viewRenderer'':controller/:action.:suffix')
  14.                      ->setViewScriptPathNoControllerSpec(':action.:suffix')
  15.                      ->setViewSuffix('tpl');
  16.     }
  17. }

コントローラスクリプト