<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 24604 -->
<sect3 id="zend.view.helpers.initial.headstyle">
    <title>HeadStyle ヘルパー</title>

    <para>
        <acronym>HTML</acronym> の <emphasis>&lt;style&gt;</emphasis> 要素を使用して、
        <acronym>CSS</acronym> スタイルシートを <acronym>HTML</acronym> の <emphasis>&lt;head&gt;</emphasis>
        要素に埋め込みます。
    </para>

    <note>
        <title>HeadLink を使用した <acronym>CSS</acronym> ファイルへのリンク</title>

        <para>
            外部スタイルシートの読み込み用の
            <emphasis>&lt;link&gt;</emphasis> 要素を作成する場合は
            <link linkend="zend.view.helpers.initial.headlink">HeadLink</link>
            を使用する必要があります。スタイルシートをインラインで定義したい場合に
            <classname>HeadStyle</classname> を使用します。
        </para>
    </note>

    <para>
        <classname>HeadStyle</classname> ヘルパーがサポートするメソッドは次のとおりです。
        これらによってスタイルシート宣言の設定や追加を行います。
    </para>

    <itemizedlist>
        <listitem>
            <para>
                <command>appendStyle($content, $attributes = array())</command>
            </para>
        </listitem>

        <listitem>
            <para>
                <command>offsetSetStyle($index, $content, $attributes = array())</command>
            </para>
        </listitem>

        <listitem>
            <para>
                <command>prependStyle($content, $attributes = array())</command>
            </para>
        </listitem>

        <listitem>
            <para>
                <command>setStyle($content, $attributes = array())</command>
            </para>
        </listitem>
    </itemizedlist>

    <para>
        すべての場合において、<varname>$content</varname> には実際の <acronym>CSS</acronym> 宣言を指定します。
        <varname>$attributes</varname> には、<property>style</property> タグに追加したい属性があれば指定します。
        lang、title、media そして dir のすべてが使用可能です。
    </para>

    <note>
        <title>条件コメントの設定</title>

        <para>
            <classname>HeadStyle</classname> では、script タグを条件コメントで囲むことができます。
            そうすれば、特定のブラウザでだけスクリプトを実行しないこともできます。
            これを使用するには conditional タグを設定し、条件をメソッドコール時の
            <varname>$attributes</varname> パラメータで渡します。
        </para>

        <example id="zend.view.helpers.initial.headstyle.conditional">
            <title>Headstyle で条件コメントを使う例</title>

            <programlisting language="php"><![CDATA[
// スクリプトを追加します
$this->headStyle()->appendStyle($styles, array('conditional' => 'lt IE 7'));
]]></programlisting>
        </example>
    </note>

    <para>
        <classname>HeadStyle</classname> はスタイル宣言のキャプチャも行います。
        これは、宣言をプログラム上で作成してからどこか別の場所で使いたい場合に便利です。
        使用法は、以下の例で示します。
    </para>

    <para>
        <methodname>headStyle()</methodname> メソッドを使うと、宣言の要素を手っ取り早く追加できます。
        シグネチャは
        <methodname>headStyle($content$placement = 'APPEND', $attributes = array())</methodname>
        です。<varname>$placement</varname> には 'APPEND'、'PREPEND' あるいは 'SET'
        のいずれかを指定します。
    </para>

    <para>
        <classname>HeadStyle</classname> は <methodname>append()</methodname> や
        <methodname>offsetSet()</methodname>、<methodname>prepend()</methodname>、そして <methodname>set()</methodname>
        をそれぞれオーバーライドして、上にあげた特別なメソッドを使用させるようにします。
        内部的には、各項目を <property>stdClass</property> のトークンとして保管し、
        あとで <methodname>itemToString()</methodname> メソッドでシリアライズします。
        これはスタック内の項目についてチェックを行い、
        オプションでそれを修正したものを返します。
    </para>

    <para>
        <classname>HeadStyle</classname> ヘルパーは、
        <link linkend="zend.view.helpers.initial.placeholder">Placeholder
        ヘルパー</link> の具象実装です。
    </para>

    <note>
        <title>デフォルトで使用される UTF-8 エンコーディング</title>

        <!-- TODO : to be translated -->
        <para>
            By default, Zend Framework uses <acronym>UTF-8</acronym> as its default encoding, and,
            specific to this case, <classname>Zend_View</classname> does as well. Character encoding
            can be set differently on the view object itself using the
            <methodname>setEncoding()</methodname> method (or the <varname>encoding</varname>
            instantiation parameter). However, since <classname>Zend_View_Interface</classname> does
            not define accessors for encoding, it's possible that if you are using a custom view
            implementation with this view helper, you will not have a
            <methodname>getEncoding()</methodname> method, which is what the view helper uses
            internally for determining the character set in which to encode.
        </para>

        <para>
            If you do not want to utilize <acronym>UTF-8</acronym> in such a situation, you will
            need to implement a <methodname>getEncoding()</methodname> method in your custom view
            implementation.
        </para>
    </note>

    <example id="zend.view.helpers.initial.headstyle.basicusage">
        <title>HeadStyle ヘルパーの基本的な使用法</title>

        <para>
            新しい style タグを、好きなときに指定できます。
        </para>

        <programlisting language="php"><![CDATA[
// スタイルを追加します
$this->headStyle()->appendStyle($styles);
]]></programlisting>

        <para>
            <acronym>CSS</acronym> では並び順が重要となります。
            指定した並び順で出力させる必要が出てくることでしょう。
            そのために使用するのが、append、prepend そして offsetSet
            といったディレクティブです。
        </para>

        <programlisting language="php"><![CDATA[
// スタイルの順番を指定します

// 特定の位置に置きます
$this->headStyle()->offsetSetStyle(100, $customStyles);

// 最後に置きます
$this->headStyle()->appendStyle($finalStyles);

// 先頭に置きます
$this->headStyle()->prependStyle($firstStyles);
]]></programlisting>

        <para>
            すべてのスタイル宣言を出力する準備が整ったら、
            あとはレイアウトスクリプトでそれを出力するだけです。
        </para>

        <programlisting language="php"><![CDATA[
<?php echo $this->headStyle() ?>
]]></programlisting>
    </example>

    <example id="zend.view.helpers.initial.headstyle.capture">
        <title>HeadStyle ヘルパーによるスタイル宣言のキャプチャ</title>

        <para>
            時には <acronym>CSS</acronym> のスタイル宣言をプログラムで生成しなければならないこともあるでしょう。
            文字列の連結やヒアドキュメント等を使っても構いませんが、
            ふつうにスタイルを作成してそれを <acronym>PHP</acronym> のタグに埋め込めればより簡単です。
            <classname>HeadStyle</classname> は、スタックにキャプチャすることでこれを実現します。
        </para>

        <programlisting language="php"><![CDATA[
<?php $this->headStyle()->captureStart() ?>
body {
    background-color: <?php echo $this->bgColor ?>;
}
<?php $this->headStyle()->captureEnd() ?>
]]></programlisting>

        <para>
            前提条件は次のとおりです。
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    スタイル宣言は、スタックの末尾に追加されていきます。
                    既存のスタックを上書きしたりスタックの先頭に追加したりしたい場合は、
                    それぞれ 'SET' あるいは 'PREPEND' を
                    <methodname>captureStart()</methodname> の最初の引数として渡します。
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>&lt;style&gt;</emphasis> タグに追加の属性を指定したい場合は、
                    <methodname>captureStart()</methodname> の 2 番目の引数に配列形式で渡します。
                </para>
            </listitem>
        </itemizedlist>
    </example>
</sect3>
<!--
vim:se ts=4 sw=4 et:
-->
