第16章 Zend_View

目次

16.1. 導入
16.1.1. コントローラスクリプト
16.1.2. ビュースクリプト
16.2. コントローラスクリプト
16.2.1. 変数の代入
16.2.2. ビュースクリプトのレンダリング
16.2.3. ビュースクリプトのパス
16.3. ビュースクリプト
16.3.1. 出力のエスケープ
16.3.2. テンプレートシステム
16.4. ビューヘルパー
16.4.1. 付属のヘルパー
16.4.2. ヘルパーのパス
16.4.3. 独自のヘルパーを書く

16.1. 導入

Zend_View は、モデル - ビュー - コントローラ パターンにおける 「ビュー」として働くクラスです。 ビューのスクリプトを、モデルおよびコントローラから分離するために存在します。 このクラスでは、 ヘルパーシステム、出力のフィルタリングおよび変数のエスケープ機能を提供します。

Zend_View は、テンプレートシステムに対しては特にこだわりはありません。 テンプレート言語として PHP を使用するか、 あるいは他のテンプレートエンジンのインスタンスを作成して、 それをビュースクリプトの中で操作することができます。

基本的に、Zend_View を使用する際には 2 つの段階をとることになります。 1. コントローラスクリプトが Zend_View のインスタンスを作成し、 そのインスタンスに変数を代入します。 2. コントローラが Zend_View に対して適切なビューをレンダリングするように指示し、 それによってコントローラがビュースクリプトを制御します。 そこでビューの出力が作成されます。

16.1.1. コントローラスクリプト

単純な例として、本の一覧を扱うコントローラがあることにしましょう。 そのデータをビューに表示することを考えます。 コントローラスクリプトは、おそらくこのようになるでしょう。

<?php
// 本の著者およびタイトルを取得するためにモデルを使用します
$data = array(
    array(
        'author' => 'Hernando de Soto',
        'title' => 'The Mystery of Capitalism'
    ),
    array(
        'author' => 'Henry Hazlitt',
        'title' => 'Economics in One Lesson'
    ),
    array(
        'author' => 'Milton Friedman',
        'title' => 'Free to Choose'
    )
);

// 本のデータを Zend_View インスタンスに代入します
Zend::loadClass('Zend_View');
$view = new Zend_View();
$view->books = $data;

// "booklist.php" というビュースクリプトをレンダリングします
echo $view->render('booklist.php');
?>
        

16.1.2. ビュースクリプト

次に必要なのは、関連付けるビュースクリプト "booklist.php" です。 これは一般的な PHP スクリプトと同じですが、ひとつだけ違いがあります。 Zend_View インスタンスのスコープで実行されるということです。 つまり $this への参照は、Zend_View のインスタンスのプロパティやメソッドを指すことになるのです (コントローラによってインスタンスに代入された変数は、 Zend_View インスタンスの public プロパティとなります)。 したがって、基本的なビュースクリプトはこのようになります。

<?php if ($this->books): ?>
    
    <!-- 本の一覧 -->
    <table>
        <tr>
            <th>著者</th>
            <th>タイトル</th>
        </tr>
        
        <?php foreach ($this->books as $key => $val): ?>
        <tr>
            <td><?php echo $this->escape($val['author']) ?></td>
            <td><?php echo $this->escape($val['title']) ?></td>
        </tr>
        <?php endforeach; ?>
        
    </table>
    
<?php else: ?>
    
    <p>表示する本がありません。</p>
    
<?php endif; ?>
        

変数の出力時に、"escape()" メソッドでエスケープ処理をしていることに注意しましょう。