<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 24249 -->
<sect1 id="zend.view.introduction">

    <title>導入</title>

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

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

    <para>
        基本的に、<classname>Zend_View</classname> を使用する際には 2 つの段階をとることになります。

        1.  コントローラスクリプトが <classname>Zend_View</classname> のインスタンスを作成し、
        そのインスタンスに変数を代入します。

        2. コントローラが <classname>Zend_View</classname> に対して適切なビューをレンダリングするように指示し、
        それによってコントローラがビュースクリプトを制御します。
        そこでビューの出力が作成されます。
    </para>

    <sect2 id="zend.view.introduction.controller">

        <title>コントローラスクリプト</title>

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

        <programlisting language="php"><![CDATA[
// 本の著者およびタイトルを取得するためにモデルを使用します
$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_Loader::loadClass('Zend_View');
$view = new Zend_View();
$view->books = $data;

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

    </sect2>

    <sect2 id="zend.view.introduction.view">

        <title>ビュースクリプト</title>

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

        <programlisting language="php"><![CDATA[
 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;?>
]]></programlisting>

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

    </sect2>

    <sect2 id="zend.view.introduction.options">
        <title>オプション</title>

        <para>
            <classname>Zend_View</classname> のオプションを設定すると、
            ビュースクリプトの振る舞いを変更できます。
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <property>basePath</property> は
                    スクリプトやヘルパー、そしてフィルタを配置する基底パスを指定します。
                    次のようなディレクトリ構成を想定しています。
                </para>

                <programlisting language="php"><![CDATA[
base/path/
    helpers/
    filters/
    scripts/
]]></programlisting>

                <para>
                    これを設定するには <methodname>setBasePath()</methodname> か
                    <methodname>addBasePath()</methodname>、あるいはコンストラクタのオプション
                    <property>basePath</property> を使用します。
                </para>
            </listitem>

            <listitem>
                <para>
                    <property>encoding</property> は <methodname>htmlentities()</methodname> や
                    <methodname>htmlspecialchars()</methodname> などで使用する文字エンコーディングを表します。
                    デフォルトは UTF-8 です。
                    <methodname>setEncoding()</methodname> か、コンストラクタのオプション
                    <property>encoding</property> で設定します。
                </para>
            </listitem>

            <listitem>
                <para>
                    <property>escape</property> は <methodname>escape()</methodname>
                    で使用するコールバックを表します。<methodname>setEscape()</methodname>
                    か、コンストラクタのオプション <property>escape</property>
                    で設定します。
                </para>
            </listitem>

            <listitem>
                <para>
                    <property>filter</property> は、ビュースクリプトをレンダリングした後で使用するフィルタを表します。
                    <methodname>setFilter()</methodname> か <methodname>addFilter()</methodname>、
                    あるいはコンストラクタのオプション <property>filter</property>
                    で設定します。
                </para>
            </listitem>

            <listitem>
                <para>
                    <property>strictVars:</property> は、初期化していない変数に <classname>Zend_View</classname>
                    からアクセスしようとした際に notice や warning を発生させるようにします。
                    <methodname>strictVars(true)</methodname> か、あるいはコンストラクタのオプション
                    <property>strictVars</property> で設定します。
                </para>
            </listitem>
        </itemizedlist>
    </sect2>

    <sect2 id="zend.view.introduction.shortTags">
        <title>ビュースクリプトでの短いタグ</title>

        <para>
            我々が用意する例では、<acronym>PHP</acronym> の長いタグ
            <emphasis>&lt;?php</emphasis> を用います。
            我々はまた、<ulink
                url="http://www.php.net/manual/ja/control-structures.alternative-syntax.php">
                制御構造に関する別の構文</ulink>の使用に賛成します。
            これらはビュースクリプトを書く際に便利なものです。
            より簡潔に書くことができ、文を１行にまとめられ、
            <acronym>HTML</acronym> 内で括弧を捜す必要を削減するからです。
        </para>

        <para>
            以前の版では、ビュー・スクリプトをわずかにより冗長にしないように、
            我々はしばしば短いタグ (<emphasis>&lt;?</emphasis> 及び <emphasis>&lt;?=</emphasis>)を使うことを推奨しました。
            しかしながら、 <filename>php.ini</filename> の <constant>short_open_tag</constant>
            設定のデフォルト値は製品において、または共有ホストでは一般的にオフです。
            その結果、それらの使用は全く移植可能ではありません。
            もしビュースクリプト内で <acronym>XML</acronym> のテンプレート、
            短い形式の開始タグは検証エラーの元となります。
            結局、 <constant>short_open_tag</constant> がオフの時に短いタグを使うと、
            ビュー・スクリプトはエラーを起こすか、または単純にビューアーに <acronym>PHP</acronym> コードを返します。
        </para>

        <para>
            もしもこれらの警告にもかかわらず、「短いタグを使いたいけれど設定でそれが無効になっている」
            場合は、次のいずれかの方法を使用します。
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    短いタグを、<filename>.htaccess</filename> ファイルで有効にします。
                </para>

                <programlisting language="apache"><![CDATA[
php_value "short_open_tag" "on"
]]></programlisting>

                <para>
                    これは、<filename>.htaccess</filename>
                    ファイルの作成と使用を許可されている場合にのみ可能です。
                    この項目は、<filename>httpd.conf</filename> ファイルに記述することもできます。
                </para>
            </listitem>

            <listitem>
                <para>
                    オプションのストリームラッパーを有効にして、
                    短いタグを逐次長いタグに変換します。
                </para>

                <programlisting language="php"><![CDATA[
$view->setUseStreamWrapper(true);
]]></programlisting>

                <para>
                    これは、<classname>Zend_View_Stream</classname>
                    をビュースクリプトのストリームラッパーとして登録します。
                    そして、まるで短いタグが有効になっているかのようにコードを動作させることができます。
                </para>
            </listitem>
        </itemizedlist>

        <warning>
            <title>ビューストリームラッパーによるパフォーマンスの低下</title>

            <para>
                ストリームラッパーを使用すると、アプリケーションのパフォーマンスは
                <emphasis>おそらく</emphasis> 低下するでしょう。
                しかし、実際のところどれくらい低下するのかについては
                はっきりと数値化することはできません。
                短いタグを有効にしてしまうか、
                スクリプトを書き換えてすべて完全なタグにしてしまう、
                あるいはコンテンツのキャッシュをうまく行うなどの対策を推奨します。
            </para>
        </warning>
    </sect2>

    <sect2 id="zend.view.introduction.accessors">
        <title>ユーティリティメソッド</title>

        <para>
            通常は、<methodname>assign()</methodname> と <methodname>render()</methodname>、
            あるいはフィルタ、ヘルパー、スクリプトのパス用の設定メソッドだけで十分事足りるでしょう。
            しかし、<classname>Zend_View</classname> を独自に拡張したい場合や
            その内部にアクセスしたい場合のために、さらにいくつかのメソッドを用意しています。
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <methodname>getVars()</methodname> は、設定されているすべての変数を返します。
                </para>
            </listitem>

            <listitem>
                <para>
                    <methodname>clearVars()</methodname> は、すべての変数の値を消去します。
                    ビュースクリプトを再利用する際に、
                    これまで使用していた変数を残しておきたいときなどに便利です。
                </para>
            </listitem>

            <listitem>
                <para>
                    <methodname>getScriptPath($script)</methodname>
                    は、指定したビュースクリプトのパスを取得します。
                </para>
            </listitem>

            <listitem>
                <para>
                    <methodname>getScriptPaths()</methodname>
                    は、登録されているすべてのスクリプトパスを取得します。
                    script paths.
                </para>
            </listitem>

            <listitem>
                <para>
                    <methodname>getHelperPath($helper)</methodname>
                    は、指定したヘルパークラスのパスを取得します。
                </para>
            </listitem>

            <listitem>
                <para>
                    <methodname>getHelperPaths()</methodname>
                    は、登録されているすべてのヘルパーパスを取得します。
                </para>
            </listitem>

            <listitem>
                <para>
                    <methodname>getFilterPath($filter)</methodname>
                    は、指定したフィルタクラスのパスを取得します。
                </para>
            </listitem>

            <listitem>
                <para>
                    <methodname>getFilterPaths()</methodname>
                    は、登録されているすべてのフィルタパスを取得します。
                </para>
            </listitem>
        </itemizedlist>
    </sect2>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
