<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 17175 -->
<sect1 id="zend.layout.quickstart">
    <title>Zend_Layout クイックスタート</title>

    <para>
        <classname>Zend_Layout</classname> の使用法は大きくふたつに分けられます。
        Zend Framework の <acronym>MVC</acronym> を使用する方法とそれ以外の方法です。
    </para>

    <sect2 id="zend.layout.quickstart.layouts">
        <title>レイアウトスクリプト</title>

        <para>
            どちらにしても、まずはレイアウトスクリプトを作成しなければなりません。
            レイアウトスクリプトは、単純に <classname>Zend_View</classname>
            (あるいはその他のあなたが使用しているビュー実装) を用いて作成します。
            レイアウト変数の登録には <classname>Zend_Layout</classname> の
            <link linkend="zend.view.helpers.initial.placeholder">プレースホルダ</link>
            を使用します。プレースホルダへのアクセスは、
            プレースホルダヘルパーを使用するか、
            あるいはレイアウトヘルパーのレイアウトオブジェクトのプロパティを使用します。
        </para>

        <para>
            たとえばこのようになります。
        </para>

        <programlisting language="php"><![CDATA[
<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>私のサイト</title>
</head>
<body>
<?php
    // レイアウトヘルパーで使用するコンテンツのキーを取得します
    echo $this->layout()->content;

    // プレースホルダヘルパーで 'foo' キーを取得します
    echo $this->placeholder('Zend_Layout')->foo;

    // レイアウトオブジェクトを取得し、そこから変数のキーを取得します
    $layout = $this->layout();
    echo $layout->bar;
    echo $layout->baz;
?>
</body>
</html>
]]></programlisting>

        <para>
            <classname>Zend_Layout</classname> は <classname>Zend_View</classname>
            を用いてレンダリングをしているので、
            登録されているビューヘルパーはすべて使用することができます。
            またビューに登録されている変数も使用することができます。
            特に便利なのは、さまざまな <link
            linkend="zend.view.helpers.initial.placeholder">プレースホルダヘルパー</link>
            を使用できることでしょう。
            これらを用いると、たとえば &lt;head&gt;
            セクションやナビゲーション部などのコンテンツを取得することができます。
        </para>

        <programlisting language="php"><![CDATA[
<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <?php echo $this->headTitle() ?>
    <?php echo $this->headScript() ?>
    <?php echo $this->headStyle() ?>
</head>
<body>
    <?php echo $this->render('header.phtml') ?>

    <div id="nav"><?php echo $this->placeholder('nav') ?></div>

    <div id="content"><?php echo $this->layout()->content ?></div>

    <?php echo $this->render('footer.phtml') ?>
</body>
</html>
]]></programlisting>
    </sect2>

    <sect2 id="zend.layout.quickstart.mvc">
        <title>Zend_Layout を Zend Framework の MVC で使用する方法</title>

        <para>
            <classname>Zend_Controller</classname> には拡張用の機能が豊富に用意されています。
            これは <link linkend="zend.controller.plugins">フロントコントローラ
            プラグイン</link> や <link
            linkend="zend.controller.actionhelpers">アクションコントローラ
            ヘルパー</link> によって実現されているものです。
            <classname>Zend_View</classname> にも <link
            linkend="zend.view.helpers">ヘルパー</link> は存在します。
            <classname>Zend_Layout</classname> を <acronym>MVC</acronym> コンポーネントとともに使用すると、
            これらのさまざまな拡張ポイントの恩恵を受けることになります。
        </para>

        <para>
            <methodname>Zend_Layout::startMvc()</methodname> は、オプションの設定項目を指定して
            <classname>Zend_Layout</classname> のインスタンスを作成します。
            そして、フロントコントローラプラグインを登録し、
            ディスパッチループの終了後にレイアウトの中身をレンダリングするようにします。
            また、アクションヘルパーを登録して、
            アクションコントローラからレイアウトオブジェクトにアクセスできるようにします。
            さらに、ビュースクリプトからレイアウトのインスタンスを取得するには
            <code>layout</code> ビューヘルパーを使用します。
        </para>

        <para>
            まずは、<acronym>MVC</acronym> と組み合わせるための <classname>Zend_Layout</classname>
            のインスタンスの作成方法を見てみましょう。
        </para>

        <programlisting language="php"><![CDATA[
// 起動ファイル内で
Zend_Layout::startMvc();
]]></programlisting>

        <para>
            <methodname>startMvc()</methodname> には、オプションの配列あるいは
            <classname>Zend_Config</classname> オブジェクトを渡すことができます。
            これによってインスタンスをカスタマイズします。
            オプションの詳細については <xref linkend="zend.layout.options" />
            を参照ください。
        </para>

        <para>
            アクションコントローラからは、
            アクションヘルパーでレイアウトのインスタンスにアクセスします。
        </para>

        <programlisting language="php"><![CDATA[
class FooController extends Zend_Controller_Action
{
    public function barAction()
    {
        // このアクションではレイアウトを無効にします
        $this->_helper->layout->disableLayout();
    }

    public function bazAction()
    {
        // このアクションでは別のレイアウトスクリプトを使用します
        $this->_helper->layout->setLayout('foobaz');
    };
}
]]></programlisting>

        <para>
            ビュースクリプトでは、<code>layout</code>
            ビューヘルパーを用いてレイアウトオブジェクトにアクセスします。
            このビューヘルパーは、他のヘルパーとは異なり引数を受け取りません。
            そして文字列ではなくオブジェクトを返します。
            これにより、レイアウトオブジェクトのメソッドをすぐにコールできるようになります。
        </para>

        <programlisting language="php"><![CDATA[
<?php $this->layout()->setLayout('foo'); // 別のレイアウトを設定します ?>
]]></programlisting>

        <para>
            <acronym>MVC</acronym> に登録した <classname>Zend_Layout</classname>
            のインスタンスを取得するには、静的メソッド
            <methodname>getMvcInstance()</methodname> を使用します。
        </para>

        <programlisting language="php"><![CDATA[
// startMvc() がまだコールされていない場合は null を返します
$layout = Zend_Layout::getMvcInstance();
]]></programlisting>

        <para>
            最後に、<classname>Zend_Layout</classname>
            のフロントコントローラプラグインが持つ、
            レイアウトのレンダリング以外の重要な機能をひとつ紹介します。
            レスポンスオブジェクトから名前つきセグメントをすべて取得し、
            それをレイアウトの変数に代入するというものです。
            このとき 'default' セグメントは 'content' という名前の変数に代入します。
            これにより、アプリケーションのコンテンツにアクセスして
            それをビュースクリプト内でレンダリングできるようになります。
        </para>

        <para>
            たとえば、こんな例を考えてみましょう。あなたの書いたコードがまず
            <methodname>FooController::indexAction()</methodname> を実行し、
            デフォルトのレスポンスセグメントに何らかのコンテンツをレンダリングしてから
            <methodname>NavController::menuAction()</methodname> に転送します。
            ここでは、レンダリングしたコンテンツをレスポンスセグメント
            'nav' に格納します。最後に
            <methodname>CommentController::fetchAction()</methodname>
            に転送してコメントを取得しますが、その内容はデフォルトのレスポンスセグメントに
            (追記する方式で) レンダリングします。
            そして、ビュースクリプト側ではそれを個別にレンダリングします。
        </para>

        <programlisting language="php"><![CDATA[
<body>
    <!-- /nav/menu のレンダリング -->
    <div id="nav"><?php echo $this->layout()->nav ?></div>

    <!-- /foo/index + /comment/fetch のレンダリング -->
    <div id="content"><?php echo $this->layout()->content ?></div>
</body>
]]></programlisting>

        <para>
            この機能は、ActionStack <link linkend="zend.controller.actionhelpers.actionstack">
            アクションヘルパー</link> や <link
            linkend="zend.controller.plugins.standard.actionstack">プラグイン</link>
            と組み合わせて使うと非常に便利です。
            アクションのスタックを作成してそれをループさせ、
            ウィジェット形式のページを作成するというわけです。
        </para>
    </sect2>

    <sect2 id="zend.layout.quickstart.standalone">
        <title>Zend_Layout を単体のコンポーネントとして使用する方法</title>

        <para>
            単体のコンポーネントとして使用した場合は、<classname>Zend_Layout</classname>
            を <acronym>MVC</acronym> に組み込んだ場合に使用できる機能のほとんどが使えなくなります。
            しかし、それでも次のふたつのメリットがあります。
        </para>

        <itemizedlist>
            <listitem><para>
                    レイアウト変数のスコープの管理。
            </para></listitem>

            <listitem><para>
                    レイアウトビュースクリプトとその他のビュースクリプトの分離。
            </para></listitem>
        </itemizedlist>

        <para>
            単体のコンポーネントとして使用するには、
            単純にレイアウトオブジェクトのインスタンスを作成して
            各種アクセサで状態を設定し、
            オブジェクトのプロパティに変数を設定してから
            レイアウトをレンダリングします。
        </para>

        <programlisting language="php"><![CDATA[
$layout = new Zend_Layout();

// レイアウトスクリプトのパスを設定します
$layout->setLayoutPath('/path/to/layouts');

// 変数を設定します
$layout->content = $content;
$layout->nav     = $nav;

// 別のレイアウトスクリプトを選択します
$layout->setLayout('foo');

// 最終的なレイアウトをレンダリングします
echo $layout->render();
]]></programlisting>
    </sect2>

    <sect2 id="zend.layout.quickstart.example">
        <title>サンプルレイアウト</title>

        <para>
            一枚の絵のほうがが千の言葉よりも雄弁なこともあります。
            これは、サンプルのレイアウトスクリプトをすべてまとめたときに
            どのように表示されるのかを示すものです。
        </para>

         <para>
            <inlinegraphic align="center" valign="middle"
                fileref="figures/zend.layout.quickstart.example.png" format="PNG" />
        </para>

        <para>
            実際の要素の並び順は、使用する <acronym>CSS</acronym> によってさまざまに異なります。
            たとえば、絶対位置指定を用いれば、
            ナビゲーション部を本文よりも後に表示させても上部に表示させることができるでしょう。
            同じことが、サイドバーやヘッダにもいえます。
            しかし、そのコンテンツを作り出すもとの仕組みは同じです。
        </para>
    </sect2>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
