53.4. ビューヘルパー

ビュースクリプトの中で、複雑な関数を繰り返し実行しなければならないこともあるでしょう (例えば日付のフォーマット、フォーム要素の作成、リンクの作成など)。 このような作業を行うために、ヘルパークラスを使用することができます。

ヘルパーの正体は、単なるクラスです。たとえば 'fooBar' という名前のヘルパーを使用するとしましょう。 デフォルトでは、クラス名の先頭には 'Zend_View_Helper_' がつきます (ヘルパーのパスを設定する際に、これは独自のものに変更できます)。 そしてクラス名の最後の部分がヘルパーの名前となります。 このとき、単語の先頭は大文字にしなければなりません。つまり、 ヘルパーのクラス名は Zend_View_Helper_FooBar となります。このクラスには、最低限ヘルパー名と同じ名前 (camelCase 形式にしたもの) のメソッド fooBar() が含まれていなければなりません。

[注意] 大文字小文字の扱い

ヘルパー名は常に camelCase 形式となります。 つまり、最初は常に小文字となります。 クラス名は MixedCase 形式ですが、実際に実行されるメソッドは camelCase 形式となります。

[注意] デフォルトのヘルパーのパス

デフォルトのヘルパーのパスは常に Zend Framework のビューヘルパーのパス、すなわち 'Zend/View/Helper/' となります。 setHelperPath() をコールして既存のパスを上書きしても、 このパスだけは残ります。これにより、 デフォルトのヘルパーは常に動作することが保証されます。

ビュースクリプト内でヘルパーを使用するには、 $this->helperName() をコールします。これをコールすると、裏側では Zend_ViewZend_View_Helper_HelperName クラスを読み込み、 そのクラスのインスタンスを作成して helperName() メソッドをコールします。 オブジェクトのインスタンスは Zend_View インスタンスの中に残り続け、 後で $this->helperName() がコールされたときには再利用されます。

53.4.1. 付属のヘルパー

Zend_View には、はじめからいくつかのヘルパークラスが付属しています。 これらのほとんどはフォーム要素の生成に関するもので、 適切なエスケープ処理を自動的に行います。 さらに、ルートにもとづいた URL と HTML の一覧を作成したり、 変数を宣言したりするものもあります。 現在付属しているヘルパーは、次のとおりです。

  • declareVars(): strictVars() を使用する際に同時に使用します。 このヘルパーを使用すると、テンプレート変数を宣言することができます。 この変数は、すでにビュースクリプトで設定されているものでもいないものでもかまいません。 また、同時にデフォルト値も設定します。 このメソッドへの引数として配列を渡すとデフォルト値を設定します。 それ以外の場合は、もしその変数が存在しない場合は空文字列を設定します。

  • fieldset($name, $content, $attribs): XHTML の fieldset を作成します。$attribs に 'legend' というキーが含まれる場合、その値をフィールドセットの説明として使用します。 フィールドセットで囲む内容は、このヘルパーに渡した $content です。

  • form($name, $attribs, $content): XHTML の form を作成します。すべての $attribs はエスケープされ、form タグの XHTML 属性としてレンダリングされます。 $content が存在してその値が false 以外の場合は、 その内容がフォームの開始タグと終了タグの間にレンダリングされます。 $content が false (デフォルト) の場合は、 フォームの開始タグのみを作成します。

  • formButton($name, $value, $attribs): <button /> 要素を作成します。

  • formCheckbox($name, $value, $attribs, $options): <input type="checkbox" /> 要素を作成します。

    デフォルトでは、$value を指定せず $options が存在しなかった場合は、未チェックの値として '0' そしてチェック状態の値として '1' を使用します。 $value が渡されたけれど $options が存在しなかった場合は、 渡された値をチェック状態の値とみなします。

    $options は配列でなければなりません。 数値添字形式の配列の場合は、最初の要素がチェック状態の値となり、 その次の要素が未チェック状態の値となります。 3 番目以降の要素の内容は無視されます。 キー 'checked' および 'unChecked' を持つ連想配列を指定することもできます。

    $options を渡した場合は、$value が「チェック状態の値」と一致した場合にその要素がチェック状態だとみなされます。 チェック状態あるいは未チェック状態は、 属性 'checked' に boolean 値を渡して指定することもできます。

    これらの内容を簡単にまとめた例を示します。

    // '1' および '0' でチェック状態と未チェック状態を表します。これはチェックされていません
    echo $this->formCheckbox('foo');
    
    // '1' および '0' でチェック状態と未チェック状態を表します。これはチェックされています
    echo $this->formCheckbox('foo', null, array('checked' => true));
    
    // 'bar' および '0' でチェック状態と未チェック状態を表します。これはチェックされていません
    echo $this->formCheckbox('foo', 'bar');
    
    // 'bar' および '0' でチェック状態と未チェック状態を表します。これはチェックされています
    echo $this->formCheckbox('foo', 'bar', array('checked' => true));
    
    // 'bar' および 'baz' でチェック状態と未チェック状態を表します。これはチェックされていません
    echo $this->formCheckbox('foo', null, null, array('bar', 'baz');
    
    // 'bar' および 'baz' でチェック状態と未チェック状態を表します。これはチェックされていません
    echo $this->formCheckbox('foo', null, null, array(
        'checked' => 'bar', 
        'unChecked' => 'baz'
    ));
    
    // 'bar' および 'baz' でチェック状態と未チェック状態を表します。これはチェックされています
    echo $this->formCheckbox('foo', 'bar', null, array('bar', 'baz');
    echo $this->formCheckbox('foo',
                             null,
                             array('checked' => true),
                             array('bar', 'baz');
    
    // 'bar' および 'baz' でチェック状態と未チェック状態を表します。これはチェックされていません
    echo $this->formCheckbox('foo', 'baz', null, array('bar', 'baz');
    echo $this->formCheckbox('foo',
                             null,
                             array('checked' => false),
                             array('bar', 'baz');
    
                    

    どの場合についても、マークアップの先頭に hidden 要素を追加してそこに「未チェック状態」を表す値を保持します。 そうすることで、仮に未チェック状態であったとしても フォームから何らかの値が返されるようになるのです。

  • formErrors($errors, $options): エラーの表示用に、XHTML の順序なしリストを作成します。 $errors は、文字列あるいは文字列の配列となります。 $options は、リストの開始タグの属性として設定したい内容です。

    エラー出力の開始時、終了時、そして各エラーの区切りとして使用する コンテンツを指定することもできます。 そのためにはヘルパーのこれらのメソッドをコールします。

    • setElementStart($string); デフォルトは '<ul class="errors"%s"><li>' で、%s の部分には $options で指定した属性が入ります。

    • setElementSeparator($string); デフォルトは '</li><li>' です。

    • setElementEnd($string); デフォルトは '</li></ul>' です。

  • formFile($name, $attribs): Creates an type="file" /> 要素を作成します。

  • formHidden($name, $value, $attribs): <input type="hidden" /> 要素を作成します。

  • formLabel($name, $value, $attribs): <label> 要素を作成します。for 属性の値は $name に、そしてラベルのテキストは $value になります。 attribsdisable を渡すと、結果を何も返しません。

  • formMultiCheckbox($name, $value, $attribs, $options, $listsep): チェックボックスのリストを作成します。 $options は連想配列で、任意の深さにすることができます。 $value は単一の値か複数の値の配列で、これが $options 配列のキーにマッチします。 $listsep は、デフォルトでは HTML の改行 ("<br />") です。デフォルトでは、 この要素は配列として扱われます。 つまり、すべてのチェックボックスは同じ名前となり、 入力内容は配列形式で送信されます。

  • formPassword($name, $value, $attribs): <input type="password" /> 要素を作成します。

  • formRadio($name, $value, $attribs, $options): 一連の <input type="radio" /> 要素を、 $options の要素ごとに作成します。$options は、 ラジオボタンの値をキー、ラベルを値とする配列となります。 $value はラジオボタンの初期選択状態を設定します。

  • formReset($name, $value, $attribs): <input type="reset" /> 要素を作成します。

  • formSelect($name, $value, $attribs, $options): <select>...</select> ブロックを作成します。 $options の要素ごとに <option> を作成します。 $options は、選択肢の値をキー、 ラベルを値とする配列となります。$value は初期選択状態を設定します。

  • formSubmit($name, $value, $attribs): <input type="submit" /> 要素を作成します。

  • formText($name, $value, $attribs): <input type="text" /> 要素を作成します。

  • formTextarea($name, $value, $attribs): <textarea>...</textarea> ブロックを作成します。

  • url($urlOptions, $name, $reset): 指定したルートにもとづく URL 文字列を作成します。 $urlOptions は、そのルートで使用する キー/値 のペアの配列となります。

  • htmlList($items, $ordered, $attribs, $escape): $items で渡した内容をもとに 順序つきリストあるいは順序なしリストを作成します。 $items が多次元配列の場合は、入れ子状のリストとなります。 $escape フラグを true (デフォルト) にすると、 各項目はビューオブジェクトに登録されているエスケープ方式でエスケープされます。 リスト内でマークアップを行いたい場合は false を渡します。

これらをビュースクリプト内で使用するのはとても簡単です。 以下に例を示します。ただ単に、ヘルパーをコールするだけでよいことに注意しましょう。 読み込みやインスタンス作成は、必要に応じて自動的に行われます。

// ビュースクリプト内では、$this は Zend_View のインスタンスを指します。
//
// select の選択肢を、変数 $countries に
// array('us' => 'United States', 'il' => 'Israel', 'de' => 'Germany')
// として設定済みであることにします。
?>
<form action="action.php" method="post">
    <p><label>メールアドレス:
<?php echo $this->formText('email', 'you@example.com', array('size' => 32)) ?>
    </label></p>
    <p><label>国:
<?php echo $this->formSelect('country', 'us', null, $this->countries) ?>
    </label></p>
    <p><label>メールを受け取りますか?
<?php echo $this->formCheckbox('opt_in', 'yes', null, array('yes', 'no')) ?>
    </label></p>
</form>

        

ビュースクリプトの出力結果は、次のようになります。

<form action="action.php" method="post">
    <p><label>メールアドレス:
        <input type="text" name="email" value="you@example.com" size="32" />
    </label></p>
    <p><label>国:
        <select name="country">
            <option value="us" selected="selected">United States</option>
            <option value="il">Israel</option>
            <option value="de">Germany</option>
        </select>
    </label></p>
    <p><label>メールを受け取りますか?
        <input type="hidden" name="opt_in" value="no" />
        <input type="checkbox" name="opt_in" value="yes" checked="checked" />
    </label></p>
</form>

        

53.4.1.1. Action ビューヘルパー

Action ビューヘルパーは、 ビュースクリプトから指定したコントローラのアクションを実行し、 その結果のレスポンスオブジェクトを返します。 これは、特定のアクションが再利用可能なコンテンツを返す場合や、 いわゆる "ウィジェット風" のコンテンツを返す場合に便利です。

最終的に _forward() されたりリダイレクトされたりするアクションは使えず、 空の文字列を返します。

Action ビューヘルパーの API はコントローラアクションを起動する大半の MVC コンポーネントと同じで、action($action, $controller, $module = null, array $params = array()) のようになります。$action$controller は必須です。モジュールを省略した場合はデフォルトのモジュールを使用します。

例 53.1. Action ビューヘルパーの基本的な使用法

たとえば CommentControllerlistAction() というメソッドがあったとしましょう。 コメント一覧を取得するために現在のリクエストからこのメソッドを起動するには、 次のようにします。

<div id="sidebar right"> 
    <div class="item">
        <?= $this->action('list', 'comment', null, array('count' => 10)); ?> 
    </div>
</div>

53.4.1.2. Partial ヘルパー

Partial ビューヘルパーは、 指定したテンプレートを自分自身のスコープ内でレンダリングします。 主な使い道は、 再利用可能な部分テンプレートを変数名の競合を気にせずに使うというものです。 さらに、特定のモジュールから部分ビュースクリプトを指定できるようになります。

Partial と兄弟関係にある PartialLoop ビューヘルパーは、反復処理可能なデータを渡して その各要素に対してレンダリングを行うものです。

[注意] PartialLoop カウンタ

PartialLoop ビューヘルパーは、変数を partialCounter というビューに代入します。 これは、配列の現在の位置をビュースクリプトに渡します。 これを利用すると、たとえばテーブルの行の色を一行おきに入れ替えるなどが簡単にできます。

例 53.2. Partial の基本的な使用法

partial の基本的な使用法は、 自分自身のビューのスコープで部分テンプレートをレンダリングすることです。 次のようなスクリプトを考えてみましょう。


<?php // partial.phtml ?>
<ul>
    <li>From: <?= $this->escape($this->from) ?></li>
    <li>Subject: <?= $this->escape($this->subject) ?></li>
</ul>

        

これを、ビュースクリプトから次のようにコールします。


<?= $this->partial('partial.phtml', array(
    'from' => 'Team Framework', 
    'subject' => 'view partials')); ?>

        

レンダリングした結果は、このようになります。

<ul>
    <li>From: Team Framework</li>
    <li>Subject: view partials</li>
</ul>


[注意] モデルは何?

Partial ビューヘルパーが使用するモデルは、 次のいずれかとなります。

  • 配列。 配列を渡す場合は、連想配列形式でなければなりません。 そのキーと値のペアがビューに渡され、 キーが変数名となります。

  • toArray() メソッドを実装したオブジェクト。 そのオブジェクトの toArray() メソッドを実行した結果が、ビューオブジェクトに渡されます。

  • 標準のオブジェクト。 それ以外のオブジェクトについては、 object_get_vars() の結果 (そのオブジェクトのすべての public プロパティ) がビューオブジェクトに渡されます。

使用するモデルがオブジェクトである場合は、 それを変数の配列などに変換するのではなく オブジェクトのまま 直接 partial スクリプトに渡したくなるものでしょう。 そのためには、しかるべきヘルパーでプロパティ 'objectKey' を設定します。

// オブジェクトを、変数 'model' として渡すよう通知します
$view->partial()->setObjectKey('model');

// partialLoop のオブジェクトを、最終的なビュースクリプト内で
// 変数 'model' として渡すよう通知します
$view->partialLoop()->setObjectKey('model');

            

このテクニックが特に役立つのは、 Zend_Db_Table_RowsetpartialLoop() に渡すような場合です。 ビュースクリプト内で row オブジェクトに自由にアクセスでき、 そのメソッド (親の値を取得したり従属行を取得したりなど) を自在に使えるようになります。

例 53.3. PartialLoop による反復処理可能なモデルのレンダリング

一般に、ループ内で partial を使用して特定のコンテンツを繰り返しレンダリングしたくなることもあるでしょう。 こうすることで、繰り返し表示される大量のコンテンツや複雑な表示ロジックを ひとつにまとめることができます。 しかし、この方法はパフォーマンスに影響を及ぼします。 というのも、partial ヘルパーをループ内で毎回実行することになるからです。

PartialLoop ビューヘルパーは、 この問題を解決します。これを使用すると、反復処理可能な内容 (配列、あるいは Iterator を実装したオブジェクト) をモデルに渡せるようになります。 そしてその各要素が partial スクリプトへモデルとして渡されます。 各要素の内容は、Partial ビューヘルパーが受け付ける任意の形式のモデルとすることができます。

次のような部分ビュースクリプトを考えます。

<? // partialLoop.phtml ?>
    <dt><?= $this->key ?></dt>
    <dd><?= $this->value ?></dd>

        

そして "モデル" はこのようになります。

$model = array(
    array('key' => 'Mammal', 'value' => 'Camel'),
    array('key' => 'Bird', 'value' => 'Penguin'),
    array('key' => 'Reptile', 'value' => 'Asp'),
    array('key' => 'Fish', 'value' => 'Flounder'),
);

        

そして、ビュースクリプト内で PartialLoop ヘルパーを実行します。

<dl>
<?= $this->partialLoop('partialLoop.phtml', $model) ?>
</dl>

        
<dl>
    <dt>Mammal</dt>
    <dd>Camel</dd>

    <dt>Bird</dt>
    <dd>Penguin</dd>

    <dt>Reptile</dt>
    <dd>Asp</dd>

    <dt>Fish</dt>
    <dd>Flounder</dd>
</dl>


例 53.4. 他のモジュールの Partial のレンダリング

時には partial が別のモジュールに存在することもあるでしょう。 そのモジュールの名前がわかっていれば、モジュール名を partial() あるいは partialLoop() の 2 番目の引数として渡し、 $model を 3 番目の引数に移動させることができます。

たとえば、'list' モジュールにある pager というスクリプトを使用したい場合は、 次のようにします。

<?= $this->partial('pager.phtml', 'list', $pagerData) ?>

        

こうすると、特定の partial を他のモジュールで再利用できるようになります。 再利用可能な partial は、共有のビュースクリプトのパスに配置することをおすすめします。


53.4.1.3. Placeholder ヘルパー

Placeholder ビューヘルパーは、 ビュースクリプトとビューのインスタンスとの間でコンテンツを永続化させます。 それ以外の便利な機能としては次のようなものがあります。 たとえばコンテンツの集約、ビュースクリプトの内容をキャプチャして後で再利用、 コンテンツの前後へのテキストの追加 (そして集約したコンテンツ間のセパレータの追加) などです。

例 53.5. プレースホルダの基本的な使用法

プレースホルダの基本的な使用法は、ビューのデータを永続化させることです。 Placeholder ヘルパーを起動する際にプレースホルダ名を指定し、 ヘルパーはプレースホルダコンテナオブジェクトを返します。 これを処理するなり、単純に echo するなりして使用できます。

<?php $this->placeholder('foo')->set("Some text for later") ?>

<?php 
    echo $this->placeholder('foo'); 
    // 出力は "Some text for later" となります
?>

例 53.6. プレースホルダによるコンテンツの集約

プレースホルダによるコンテンツの集約も、時には便利です。 たとえば、ビュースクリプトで変数の配列を保持し、 後で表示するためのメッセージを取得しておくと、 それをどのようにレンダリングするかを後で決めることができます。

Placeholder ビューヘルパーは、 ArrayObject を継承したコンテナを使用します。 これは、配列をより高機能に操作できるものです。 さらに、コンテナに格納された内容をフォーマットするために さまざまなメソッドが用意されています。

  • setPrefix($prefix) は、 コンテンツの先頭に付加するテキストを設定します。 getPrefix() を使用すると、 その時点での設定内容を取得できます。

  • setPostfix($prefix) は、 コンテンツの末尾に付加するテキストを設定します。 getPostfix() を使用すると、 その時点での設定内容を取得できます。

  • setSeparator($prefix) は、 各コンテンツの間に挿入するテキストを設定します。 getSeparator() を使用すると、 その時点での設定内容を取得できます。

  • setIndent($prefix) は、 コンテンツの字下げ幅を設定します。 整数値を渡すと、渡された数のスペースを使用します。 文字列を渡すと、その文字列を使用します。 getIndent() を使用すると、 その時点での設定内容を取得できます。

<!-- 最初のビュースクリプト -->
<?php $this->placeholder('foo')->exchangeArray($this->data) ?>
<!-- 後で使用するビュースクリプト -->
<?php 
$this->placeholder('foo')->setPrefix("<ul>\n    <li>")
                         ->setSeparator("</li><li>\n") 
                         ->setIndent(4)
                         ->setPostfix("</li></ul>\n");
?>

<?php 
    echo $this->placeholder('foo'); 
    // 順序なしリストをきれいに字下げして出力します
?>

Placeholder コンテナオブジェクトは ArrayObject を継承しているので、 単純にコンテナに格納するのではなく そのコンテナの特定のキーにコンテンツを格納するのも簡単です。 キーへのアクセスは、オブジェクトのプロパティか配列のキーのいずれでも可能です。

<?php $this->placeholder('foo')->bar = $this->data ?>
<?php echo $this->placeholder('foo')->bar ?>

<?php
$foo = $this->placeholder('foo');
echo $foo['bar'];
?>

例 53.7. プレースホルダによるコンテンツのキャプチャ

時には、プレースホルダの中身を テンプレートに渡しやすいようビュースクリプトで保持することもあるでしょう。 Placeholder ビューヘルパーは、 任意のコンテンツをキャプチャして後でレンダリングすることができます。 そのために使用する API は次のようなものです。

  • captureStart($type, $key) は、 コンテンツのキャプチャを開始します。

    $type は、 Placeholder の定数 APPEND あるいは SET のいずれかとなります。APPEND を指定すると、キャプチャされたコンテンツが プレースホルダ内の現在のコンテンツの末尾に追加されます。 SET の場合は、 キャプチャされたコンテンツをそれ単体でプレースホルダの値として使用します (それまでに登録されていたコンテンツを上書きします)。 デフォルトの $typeAPPEND です。

    $key には、コンテンツのキャプチャ先として プレースホルダのコンテナの特定のキーを指定することができます。

    captureStart() は、 captureEnd() がコールされるまで他のキャプチャをロックします。 同一のプレースホルダコンテナでキャプチャをネストすることはできません。 しようとすると例外が発生します。

  • captureEnd() は、 コンテンツのキャプチャを終了して、 captureStart() がコールされたときの指定に応じてそれをコンテナに格納します。

<!-- デフォルトのキャプチャは追記モードです -->
<?php $this->placeholder('foo')->captureStart(); 
foreach ($this->data as $datum): ?>
<div class="foo">
    <h2><?= $datum->title ?></h2>
    <p><?= $datum->content ?></p>
</div>
<?php endforeach; ?>
<?php $this->placeholder('foo')->captureEnd() ?>

<?php echo $this->placeholder('foo') ?>
<!-- 特定のキーにキャプチャします -->
<?php $this->placeholder('foo')->captureStart('SET', 'data'); 
foreach ($this->data as $datum): ?>
<div class="foo">
    <h2><?= $datum->title ?></h2>
    <p><?= $datum->content ?></p>
</div>
 <?php endforeach; ?>
<?php $this->placeholder('foo')->captureEnd() ?>

<?php echo $this->placeholder('foo')->data ?>

53.4.1.3.1. プレースホルダの具象実装

Zend Framework には、"具体的な" プレースホルダの実装が標準でいくつか含まれています。 これらはみな一般的に用いられるもので、doctype やページのタイトル、<head> の要素群などを扱います。 どのプレースホルダについても、 引数なしでコールするとその要素自身を返します。

各要素のドキュメントは、以下のリンク先で個別に扱います。

53.4.1.4. Doctype ヘルパー

正しい形式の HTML ドキュメントおよび XHTML ドキュメントには、 DOCTYPE 宣言が必要です。 覚えておくことが難しいというだけではなく、 これらは特定の要素のレンダリング方法 (たとえば、<script><style> 要素における CDATA のエスケープ方法) に影響を与えます。

Doctype ヘルパーは、以下のいずれかの形式を指定します。

  • XHTML11

  • XHTML1_STRICT

  • XHTML1_TRANSITIONAL

  • XHTML1_FRAMESET

  • XHTML_BASIC1

  • HTML4_STRICT

  • HTML4_LOOSE

  • HTML4_FRAMESET

  • HTML5

整形式なものであれば、独自の doctype を追加することができます。

Doctype ヘルパーは、 Placeholder ヘルパー の具象実装です。

例 53.8. Doctype ヘルパーの基本的な使用法

doctype は、いつでも指定することができます。 しかし、doctype によって出力を切りかえるヘルパーを使用する場合は まず doctype を設定してからでないと動作しません。もっともシンプルな使用法は、 レイアウトスクリプトの先頭で指定と出力を同時に行うことでしょう。

$doctypeHelper = new Zend_View_Helper_Doctype();
$doctypeHelper->doctype('XHTML1_STRICT');

        

そして、それをレイアウトスクリプトの先頭で表示します。

<?php echo $this->doctype() ?>

        

例 53.9. Doctype の取得

doctype を知りたくなったら、オブジェクトの getDoctype() をコールします。 このオブジェクトは、ヘルパーを起動した際に取得できるものです。 invoking the helper.

$doctype = $view->doctype()->getDoctype();
?>

一般的な使用法としては、doctype が XHTML か否かを調べるということがあります。それ用のメソッドとしては isXhtml() があります。

if ($view->doctype()->isXhtml()) {
    // 何かをします
}

        

53.4.1.5. HeadLink ヘルパー

HTML の <link> 要素は複数使用することができ、 スタイルシートやフィード、favicon、トラックバック などのさまざまなリソースへのリンクを表します。 HeadLink ヘルパーは、 シンプルなインターフェイスでこれらの要素を作成し、 後でそれを取得してレイアウトスクリプトで出力することができます。

HeadLink ヘルパーには、 スタイルシートへのリンクをスタックに追加するメソッドがあります。

  • appendStylesheet($href, $media, $conditionalStylesheet, $extras)

  • offsetSetStylesheet($index, $href, $media, $conditionalStylesheet, $extras)

  • prependStylesheet($href, $media, $conditionalStylesheet, $extras)

  • setStylesheet($href, $media, $conditionalStylesheet, $extras)

$media のデフォルトは 'screen' ですが、 有効な media 形式なら何にでもすることができます。 $conditionalStylesheet は文字列あるいは false で、 レンダリング時に使用します。 特定のプラットフォームでスタイルシートの読み込みをやめたい場合などに、 特別なコメントを使用できるようになります。 $extras は、そのタグに追加したい特別な値の配列です。

さらに、HeadLink ヘルパーには、スタックに 'alternate' リンクを追加するメソッドもあります。

  • appendAlternate($href, $type, $title, $extras)

  • offsetSetAlternate($index, $href, $type, $title, $extras)

  • prependAlternate($href, $type, $title, $extras)

  • setAlternate($href, $type, $title, $extras)

headLink() ヘルパーメソッドは、 <link> 要素に必要なすべての属性を指定することができ、 その位置も指定することができます。 たとえば、新たな要素がこれまでのものを上書きする、 あるいはスタックの先頭に追加する、スタックの末尾に追加するなどを指定します。

HeadLink ヘルパーは、 Placeholder ヘルパー の具象実装です。

例 53.10. HeadLink ヘルパーの基本的な使用法

headLink は、いつでも指定することができます。 一般的には、グローバルなリンクはレイアウトスクリプトで指定して、 アプリケーション固有のリンクはアプリケーションのビュースクリプトで指定することになります。 レイアウトスクリプトでは、<head> セクションの中でヘルパーを出力することになります。

<?php // ビュースクリプトのリンクを設定します
$this->headLink()->appendStylesheet('/styles/basic.css')
                 ->headLink(array('rel' => 'favicon',
                                  'href' => '/img/favicon.ico'),
                                  'PREPEND')
                 ->prependStylesheet('/styles/moz.css',
                                     'screen',
                                     true,
                                     array('id' => 'my_stylesheet'));
?>
<?php // リンクをレンダリングします ?>
<?= $this->headLink() ?>

        

53.4.1.6. HeadMeta ヘルパー

HTML の <meta> 要素は、 HTML ドキュメントに関するメタ情報を扱います。 たとえばキーワードや文字セット、キャッシュ方式などです。 Meta タグには 'http-equiv' 形式と 'name' 形式があり、 'content' 属性が必須となります。また、 'lang' あるいは 'scheme' のいずれかの属性を含むことができます。

HeadMeta ヘルパーは、 meta タグを設定したり追加したりするための次のようなメソッドを提供します。

  • appendName($keyValue, $content, $conditionalName)

  • offsetSetName($index, $keyValue, $content, $conditionalName)

  • prependName($keyValue, $content, $conditionalName)

  • setName($keyValue, $content, $modifiers)

  • appendHttpEquiv($keyValue, $content, $conditionalHttpEquiv)

  • offsetSetHttpEquiv($index, $keyValue, $content, $conditionalHttpEquiv)

  • prependHttpEquiv($keyValue, $content, $conditionalHttpEquiv)

  • setHttpEquiv($keyValue, $content, $modifiers)

$keyValue は 'name' あるいは 'http-equiv' キーの値を定義します。$content は 'content' キーの値を定義し、$modifiers はオプションで連想配列を指定します。この配列には 'lang' や 'scheme' といったキーが含まれます。

ヘルパーメソッド headMeta() で meta タグを設定することもできます。 このメソッドのシグネチャは headMeta($content, $keyValue, $keyType = 'name', $modifiers = array(), $placement = 'APPEND') です。$keyValue には、 $keyType ('name' あるいは 'http-equiv') で指定したキーのコンテンツを指定します。 $placement は 'SET' (既存の値をすべて上書きする) か 'APPEND' (スタックの最後に追加する)、 あるいは 'PREPEND' (スタックの先頭に追加する) となります。

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

HeadMeta ヘルパーは、 Placeholder ヘルパー の具象実装です。

例 53.11. HeadMeta ヘルパーの基本的な使用法

meta タグは、いつでも好きなときに指定することができます。 一般的には、クライアント側でのキャッシュの制御方法や SEO 用キーワードなどを指定します。

たとえば、SEO 用のキーワードを指定したい場合は 'keywords' という名前の meta タグを作成します。 そして、そのページに関連するキーワードを値として指定します。

<?php // meta タグでキーワードを指定します
$this->headMeta()->appendName('keywords', 'framework php productivity');
?>

クライアント側でのキャッシュの制御方法を指定したい場合は、 http-equiv タグを設定してルールを指定します。

<?php // クライアント側でのキャッシュを無効にします
$this->headMeta()->appendHttpEquiv('expires', 'Wed, 26 Feb 1997 08:21:57 GMT')
                 ->appendHttpEquiv('pragma', 'no-cache')
                 ->appendHttpEquiv('Cache-Control', 'no-cache');
?>

meta タグの使い方としてもうひとつよくあるのは、 コンテンツタイプや文字セット、言語を指定するものです。

<?php // コンテンツタイプと文字セットを設定します
$this->headMeta()->appendHttpEquiv('Content-Type', 'text/html; charset=UTF-8')
                 ->appendHttpEquiv('Content-Language', 'en-US');
?>

最後の例として、リダイレクトの前に見せるメッセージを "meta refresh" で指定するものを示します。

<?php // 3 秒後に新しい URL に移動させます
$this->headMeta()->appendHttpEquiv('Refresh', '3;URL=http://www.some.org/some.html');
?>

レイアウト内で meta タグを指定し終えたら、ヘルパーの内容を出力します。

<?= $this->headMeta() ?>

53.4.1.7. HeadScript ヘルパー

HTML の <script> 要素を使用して、 クライアントサイトのスクリプトをインラインで指定したり 外部のリソースからスクリプトのコードを読み込んだりします。 HeadScript ヘルパーは、この両方の方式に対応しています。

HeadScript ヘルパーは、 以下のメソッド群によってスクリプトの設定や追加をサポートします。

  • appendFile($src, $type = 'text/javascript', $attrs = array())

  • offsetSetFile($index, $src, $type = 'text/javascript', $attrs = array())

  • prependFile($src, $type = 'text/javascript', $attrs = array())

  • setFile($src, $type = 'text/javascript', $attrs = array())

  • appendScript($script, $type = 'text/javascript', $attrs = array())

  • offsetSetScript($index, $script, $type = 'text/javascript', $attrs = array())

  • prependScript($script, $type = 'text/javascript', $attrs = array())

  • setScript($script, $type = 'text/javascript', $attrs = array())

*File() 系のメソッドでは、$src は読み込みたいリモートスクリプトの場所となります。 通常は、URL あるいはパスの形式となります。*Script() 系のメソッドでは、$script はその要素に使用したいクライアント側のスクリプトとなります。

[注意] 条件コメントの設定

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

例 53.12. Headscript で条件コメントを使う例

// スクリプトを追加します
$this->headScript()->appendFile('/js/prototype.js', 'text/javascript', array('conditional' => 'lt IE 7');

            

HeadScript はスクリプトのキャプチャも行います。 これは、クライアント側スクリプトをプログラム上で作成してから どこか別の場所で使いたい場合に便利です。 使用法は、以下の例で示します。

headScript() メソッドを使うと、 スクリプト要素を手っ取り早く追加することができます。 シグネチャは headScript($mode = 'FILE', $spec, $placement = 'APPEND') です。$mode は 'FILE' あるいは 'SCRIPT' のいずれかで、 スクリプトへのリンクを指定するのかスクリプト自体を定義するのかによって切り替えます。 $spec は、リンクするスクリプトファイルあるいはスクリプトのソースとなります。 $placement は 'APPEND'、'PREPEND' あるいは 'SET' のいずれかでなければなりません。

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

HeadScript ヘルパーは、 Placeholder ヘルパー の具象実装です。

[注意] HTML Body スクリプトでの InlineScript の使用

HTML の body 部にスクリプトを埋め込みたい場合は、 HeadScript の姉妹版である InlineScript を使わなければなりません。 スクリプトをドキュメントの最後のほうに配置するようにすると、 ページの表示速度が向上します。特に、 サードパーティのアクセス解析用スクリプトを使用する場合などにこの効果が顕著にあらわれます。

[注意] すべての属性はデフォルトで無効

デフォルトでは、HeadScript がレンダリングする <script> の属性は W3C に認められているものだけです。 'type' や 'charset'、'defer'、'language' そして 'src' が該当します。 しかし、Javascript のフレームワーク (Dojo など) では独自の属性を用いることでその挙動を変更しています。 このような属性を許可するには、 setAllowArbitraryAttributes() メソッドを使用します。

$this->headScript()->setAllowArbitraryAttributes(true);

        

例 53.13. HeadScript ヘルパーの基本的な使用法

上で説明したように、新しい script タグを、好きなときに指定することができます。 外部のリソースへのリンクも可能ですし、 スクリプト自体を指定することも可能です。

// スクリプトを追加します
$this->headScript()->appendFile('/js/prototype.js')
                   ->appendScript($onloadScript);

        

クライアント側のスクリプトでは並び順が重要となります。 指定した並び順で出力させる必要が出てくることでしょう。 そのために使用するのが、append、prepend そして offsetSet といったディレクティブです。

// スクリプトの順番を指定します

// 特定の位置を指定し、確実に最後に読み込まれるようにします
$this->headScript()->offsetSetFile(100, '/js/myfuncs.js');

// scriptaculous のエフェクトを使用します (次のインデックスである 101 に追加されます)
$this->headScript()->appendFile('/js/scriptaculous.js');

// でも、もととなる prototype スクリプトは常に最初に読み込まれるようにします
$this->headScript()->prependFile('/js/prototype.js');

        

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

<?= $this->headScript() ?>

        

例 53.14. HeadScript ヘルパーによるスクリプトのキャプチャ

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

<?php $this->headScript()->captureStart() ?>
var action = '<?= $this->baseUrl ?>';
$('foo_form').action = action;
<?php $this->headScript()->captureEnd() ?>

        

前提条件は次のとおりです。

  • スクリプトは、スタックの末尾に追加されていきます。 既存のスタックを上書きしたりスタックの先頭に追加したりしたい場合は、 それぞれ 'SET' あるいは 'PREPEND' を captureStart() の最初の引数として渡します。

  • スクリプトの MIME タイプは 'text/javascript' を想定しています。 別のものを指定したい場合は、それを captureStart() の 2 番目の引数として渡します。

  • <script> タグに追加の属性を指定したい場合は、 captureStart() の 3 番目の引数に配列形式で渡します。


53.4.1.8. HeadStyle ヘルパー

HTML の <style> 要素を使用して、 CSS スタイルシートを HTML の <head> 要素に埋め込みます。

[注意] HeadLink を使用した CSS ファイルへのリンク

外部スタイルシートの読み込み用の <link> 要素を作成する場合は HeadLink を使用する必要があります。スタイルシートをインラインで定義したい場合に HeadScript を使用します。

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

  • appendStyle($content, $attributes = array())

  • offsetSetStyle($index, $content, $attributes = array())

  • prependStyle($content, $attributes = array())

  • setStyle($content, $attributes = array())

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

[注意] 条件コメントの設定

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

例 53.15. Headstyle で条件コメントを使う例

// スクリプトを追加します
$this->headStyle()->appendStyle($styles, array('conditional' => 'lt IE 7');

            

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

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

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

HeadStyle ヘルパーは、 Placeholder ヘルパー の具象実装です。

例 53.16. HeadStyle ヘルパーの基本的な使用法

新しい style タグを、好きなときに指定することができます。

// スタイルを追加します
$this->headStyle()->appendStyle($styles);

        

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

// スタイルの順番を指定します

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

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

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

        

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

<?= $this->headStyle() ?>

        

例 53.17. HeadStyle ヘルパーによるスタイル宣言のキャプチャ

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

<?php $this->headStyle()->captureStart() ?>
body {
    background-color: <?= $this->bgColor ?>;
}
<?php $this->headStyle()->captureEnd() ?>

        

前提条件は次のとおりです。

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

  • <style> タグに追加の属性を指定したい場合は、 captureStart() の 2 番目の引数に配列形式で渡します。


53.4.1.9. HeadTitle ヘルパー

HTML の <title> 要素を使用して、 HTML ドキュメントのタイトルを設定します。 HeadTitle ヘルパーは、 プログラム上で作成したタイトルを保存しておいて、 後で出力の際にそれを取得するためのものです。

HeadTitle ヘルパーは、 Placeholder ヘルパー の具象実装です。 toString() メソッドをオーバーライドして <title> 要素を生成するようにしており、 headTitle() メソッドによって title 要素の設定や集約を簡単にできるようになっています。 このメソッドのシグネチャは headTitle($title, $setType = 'APPEND') です。デフォルトでは、値はスタック (title 部の内容を集約したもの) の最後に追加されます。しかしこれを 'PREPEND' (スタックの先頭に追加する) や 'SET' (スタック全体を上書きする) にすることもできます。

例 53.18. HeadTitle ヘルパーの基本的な使用法

title タグは、いつでも好きなときに指定することができます。 一般的な使用法としては、アプリケーション内での階層、 つまりサイト、コントローラ、アクションその他のリソースについての情報を示すことがあります。

 
// コントローラとアクションの名前を title 部に設定します
$request = Zend_Controller_Front::getInstance()->getRequest();
$this->headTitle($request->getActionName())
     ->headTitle($request->getControllerName());

// サイト名を title に設定します。これはレイアウトスクリプトで行うことになるでしょう
$this->headTitle('Zend Framework');

// 各部分を区切る文字列を設定します
$this->headTitle()->setSeparator(' / ');
?>

最後に、レイアウトスクリプト内でタイトルをレンダリングする際にそれを出力するだけです。

<!-- <アクション名> / <コントローラ名> / Zend Framework と出力されます -->
<?= $this->headTitle() ?>

53.4.1.10. HTML オブジェクトヘルパー

HTML の <object> 要素は、 Flash や QuickTime といったメディアをウェブページに埋め込むために使用するものです。 オブジェクトビューヘルパーは、 最低限の労力でメディアを埋め込めるよう手助けします。

最初は、以下の 4 つのオブジェクトヘルパーを提供します。

  • formFlash は、Flash ファイルの埋め込み用のマークアップを生成します。

  • formObject は、カスタムオブジェクトの埋め込み用のマークアップを生成します。

  • formPage は、他の (X)HTML ページの埋め込み用のマークアップを生成します。

  • formQuicktime は、QuickTime ファイルの埋め込み用のマークアップを生成します。

これらのヘルパーはすべて、同じインターフェイスを共有しています。 そのため、このドキュメントでは、そのうちの 2 つのヘルパーの例だけを紹介します。

例 53.19. Flash ヘルパー

このヘルパーを使うと、Flash をページの中に簡単に埋め込めるようになります。 リソースの URI を引数として渡すだけの簡単な作業です。

<?php echo $this->htmlFlash('/path/to/flash.swf'); ?>

この結果は、次のような HTML となります。

<object data="/path/to/flash.swf" type="application/x-shockwave-flash" 
    classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 
    codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
</object>

さらに、属性やパラメータ、コンテンツなど <object> とともにレンダリングする内容も指定できます。その方法は htmlObject ヘルパーで紹介します。

例 53.20. 追加属性を渡すことによるオブジェクトのカスタマイズ

オブジェクトヘルパーの最初の引数は常に必須です。 これは、埋め込みたいリソースの URI となります。 2 番目の引数は htmlObject ヘルパーの場合のみ必須となります。 それ以外のヘルパーはこの引数の正確な値を既に知っているからです。 3 番目の引数には、object 要素の属性を渡します。 キー/値 のペア形式の配列のみを受け付けます。 属性の例としては、たとえば classidcodebase などがあります。 4 番目の引数も同様に キー/値 のペア形式の配列のみを受け取り、 それを使用して <param> 要素を作成します。例を参照ください。 最後に、オプションでそのオブジェクトの追加コンテンツを指定できます。 これらすべての引数を使用した例をごらんください。

echo $this->htmlObject(
    '/path/to/file.ext', 
    'mime/type', 
    array(
        'attr1' => 'aval1', 
        'attr2' => 'aval2'
    ), 
    array(
        'param1' => 'pval1', 
        'param2' => 'pval2'
    ), 
    'some content'
);

/*
出力は次のようになります

<object data="/path/to/file.ext" type="mime/type" 
    attr1="aval1" attr2="aval2">
    <param name="param1" value="pval1" />
    <param name="param2" value="pval2" />
    some content
</object>
*/

53.4.1.11. InlineScript ヘルパー

HTML の <script> 要素を使用して、 クライアントサイトのスクリプトをインラインで指定したり 外部のリソースからスクリプトのコードを読み込んだりします。 InlineScript ヘルパーは、この両方の方式に対応しています。 これは HeadScript から派生したものであり、このヘルパーで使えるメソッドはすべて使用可能です。 ただ、headScript() メソッドのかわりに inlineScript() メソッドを使用します。

[注意] HTML Body スクリプトでの InlineScript の使用法

InlineScript は、スクリプトを HTML の body 部に埋め込みたいときに使用します。 スクリプトをドキュメントの最後のほうに配置するようにすると、 ページの表示速度が向上します。特に、 サードパーティのアクセス解析用スクリプトを使用する場合などにこの効果が顕著にあらわれます。

JS ライブラリの中には、HTML の head で読み込まなければならないものもあります。そのような場合は HeadScript を使用します。

53.4.1.12. JSON ヘルパー

JSON を返すビューを作成する際に大事なのは、 適切なレスポンスヘッダを設定することです。 JSON ビューヘルパーは、まさにその作業を行います。 さらに、デフォルトでレイアウト機能を無効にします (現在有効である場合)。 JSON レスポンスでは通常レイアウト機能は使わないからです。

JSON ヘルパーは次のようなヘッダを設定します。

Content-Type: application/json

たいていの AJAX ライブラリは、 レスポンスでこのヘッダを見つけると適切に処理してくれます。

JSON ヘルパーの使用法は、このように非常に単純です。

<?= $this->json($this->data) ?>
?>

53.4.1.13. 翻訳ヘルパー

ウェブサイトを複数言語で提供することもよくあります。 サイト上のコンテンツを翻訳するには、 Zend Translate を使用します。これをビューと統合するために使用するのが Translate ビューヘルパーです。

これ以降のすべての例では、単純は配列翻訳アダプタを使用します。 もちろん Zend_Translate の任意のインスタンスやお好みの Zend_Translate_Adapter のサブクラスを使うことも可能です。 Translate ビューヘルパーのインスタンスを作成するにはいくつかの方法があります。

  • 事前に Zend_Registry に登録済みのインスタンスを使用する

  • 流れるようなインターフェイスで後から追加する

  • クラスのインスタンスの作成時に直接指定する

登録済みの Zend_Translate のインスタンスを使用する方法をおすすめします。 アダプタをレジストリに追加する際に、使用するロケールを選択することができます。

[注意] 注意

ここで言語ではなくロケールと言っているのは、 言語には地域を含む可能性があるからです。 たとえば英語は様々な地域で話されています。 イギリス英語やアメリカ英語など複数の翻訳が存在します。 そこで、ここでは "言語" と言わずに "ロケール" としているのです。

例 53.21. 登録済みのインスタンス

登録済みのインスタンスを使用するには、まず Zend_Translate あるいは Zend_Translate_Adapter のインスタンスを作成し、 それを Zend_Registry に登録します。登録する際のキーとして Zend_Translate を使用します。

// サンプルアダプタ
$adapter = new Zend_Translate('array', array('simple' => 'einfach'), 'de');
Zend_Registry::set('Zend_Translate', $adapter);

// ビューの中で
echo $this->translate('simple');
// これは 'einfach' を返します
?>

流れるようなインターフェイスのほうがなじみがあるという場合は、 ビューの中でインスタンスを作成し、ヘルパーのインスタンスは後で作成することもできます。

例 53.22. ビューの中で

流れるようなインターフェイスで Zend_Translate あるいは Zend_Translate_Adapter のインスタンスを作成するには、 パラメータを指定せずにヘルパーをコールし、それから setTranslator() メソッドをコールします。

// ビューの中で
$adapter = new Zend_Translate('array', array('simple' => 'einfach'), 'de');
$this->translate()->setTranslator($adapter)->translate('simple');
// これは 'einfach' を返します
?>

ヘルパーを Zend_View なしで使用すると、 ヘルパーを直接使用することもできます。

例 53.23. 直接使用する方法

// サンプルアダプタ
$adapter = new Zend_Translate('array', array('simple' => 'einfach'), 'de');

// アダプタを初期化します
$translate = new Zend_View_Helper_Translate($adapter);
print $translate->translate('simple'); // これは 'einfach' を返します
?>

Zend_View は使わないけれど、 翻訳した結果がほしいという場合にこの方式を使用します。


これまで見てきたように、translate() メソッドは翻訳を返します。 翻訳アダプタのメッセージ ID を指定してこれをコールします。 さらに、翻訳文字列の中のパラメータを置換することも可能です。 パラメータの値を指定する方法には二通りあります。 パラメータのリストを指定する方法か、あるいはパラメータの配列を指定する方法です。 たとえば次のようになります。

例 53.24. 単一のパラメータ

単一のパラメータを使用するには、単にそれをメソッドに追加します。

// ビューの中で
$date = "Monday";
$this->translate("Today is %1\$s", $date);
// これは 'Heute ist Monday' を返します
?>

[注意] 注意

パラメータの値にテキストを使用する場合は、 このパラメータの値も翻訳しなければならないことに注意しましょう。

例 53.25. パラメータのリスト

パラメータのリストを使用して、それをメソッドに追加することもできます。

// ビューの中で
$date = "Monday";
$month = "April";
$time = "11:20:55";
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date, $month, $time);
// これは 'Heute ist Monday in April. Aktuelle Zeit: 11:20:55' を返します
?>

例 53.26. パラメータの配列

パラメータの配列を使用して、それをメソッドに追加することもできます。

// ビューの中で
$date = array("Monday", "April", "11:20:55");
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date);
// これは 'Heute ist Monday in April. Aktuelle Zeit: 11:20:55' を返します
?>

翻訳のロケールを変更しなければならないこともあるでしょう。 翻訳単位で動的に変更することもできますが、 静的に変更してそれ以降のすべての翻訳に適用させることもできます。 そして、パラメータリスト型あるいはパラメータ配列型のどちらの形式でもそれを使用することができます。 どひらの形式の場合も、ロケールは最後のパラメータとして指定します。

例 53.27. ロケールの動的な変更

// ビューの中で
$date = array("Monday", "April", "11:20:55");
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date, 'it');
?>

この例は、指定したメッセージ ID に対応するイタリア語の翻訳を返します。 しかし、イタリア語を返すのはこのときだけです。 次の翻訳では、アダプタに設定されているロケールを使用します。 通常は、使用したいロケールを翻訳アダプタに設定してからレジストリに追加します。 しかし、ロケールの設定をヘルパー内で行うこともできます。

例 53.28. ロケールの静的な変更

// ビューの中で
$date = array("Monday", "April", "11:20:55");
$this->translate()->setLocale('it');
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date);
?>

上の例では新しいデフォルトロケールとして 'it' を設定しており、これ以降の翻訳ではこのロケールを使用します。

もちろん、現在設定されているロケールを取得するためのメソッド getLocale() もあります。

例 53.29. 現在設定されているロケールの取得

// ビューの中で
$date = array("Monday", "April", "11:20:55");

// これまでの例で設定されているデフォルトロケールである 'de' を返します
$this->translate()->getLocale();

$this->translate()->setLocale('it');
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date);

// 新たに設定されたデフォルトロケールである 'it' を返します
$this->translate()->getLocale();
?>

53.4.2. ヘルパーのパス

ビュースクリプトと同様、 Zend_View がヘルパークラスを探すパスをコントローラから積み重ねて指定することができます。 デフォルトでは、Zend_View は "Zend/View/Helper/*" からヘルパークラスを探します。 Zend_View に別の場所を探すように指定するには setHelperPath() および addHelperPath() メソッドを使用します。 さらに、クラスプレフィックスを指定することもできます。 これにより、ヘルパークラスに名前空間を設定できるようになります。 デフォルトでクラスプレフィックスを指定しなかった場合は、 'Zend_View_Helper_' であると見なされます。

$view = new Zend_View();

// パスを /path/to/more/helpers 、プレフィックスを 'My_View_Helper' と設定します
$view->setHelperPath('/path/to/more/helpers', 'My_View_Helper');

        

addHelperPath() メソッドを使用すると、検索パスを「積み重ねる」 ことができます。これを使用すると、Zend_View は一番最後に追加されたパスからヘルパークラスを探し始めます。 これにより、付属しているヘルパーの内容を上書きしたり、 新しいヘルパーを追加したりすることができるようになります。

$view = new Zend_View();
// /path/to/some/helpers をクラスプレフィックス 'My_View_Helper' で追加します
$view->addHelperPath('/path/to/some/helpers', 'My_View_Helper');
// /other/path/to/helpers をクラスプレフィックス 'Your_View_Helper' で追加します
$view->addHelperPath('/other/path/to/helpers', 'Your_View_Helper');

// $this->helperName() をコールすると、Zend_View は
// まず最初に "/path/to/some/helpers/HelperName" で
// "Your_View_Helper_HelperName" という名前のクラスを探し、
// 次に "/other/path/to/helpers/HelperName.php" で
// "My_View_Helper_HelperName" という名前のクラスを探し、
// そして最後に "Zend/View/Helpers/HelperName.php" で
// "Zend_View_Helper_HelperName" という名前のクラスを探します。

        

53.4.3. 独自のヘルパーを書く

独自のヘルパーを書くのは簡単です。以下の規則に従ってください。

  • 絶対条件というわけではありませんが、ヘルパーを作成する際には Zend_View_Helper_Interface を実装するか Zend_View_Helper_Abstract を継承することを推奨します。 1.6.0 以降、これらには setView() メソッドが定義されています。 しかし、将来のリリースでは Strategy パターンを実装することを検討しており、 以下に示す命名規約の多くを単純化する予定です。 今のうちにこのようにしておくと、 将来のバージョンでもあなたの書いたコードがそのまま動くようになるでしょう。

  • クラス名は、少なくとも最後はヘルパーの名前と同じである必要があります。 MixedCaps 方式を使用します。たとえば "specialPurpose" という名前のヘルパーを作成した場合は、そのクラス名には 最低限 "SpecialPurpose" が含まれている必要があります。 このクラス名にプレフィックスを指定することができます。 プレフィックスの一部に 'View_Helper' を含めることを推奨します。たとえば "My_View_Helper_SpecialPurpose" のようになります (addHelperPath()setHelperPath() にはプレフィックスを指定する必要があります。 最後のアンダースコアは含めても含めなくてもかまいません)。

  • クラスは、ヘルパーと同じ名前の public メソッドを持っている必要があります。 テンプレートが "$this->specialPurpose()" をコールした際に、 このメソッドがコールされます。"specialPurpose" ヘルパーの例では、 "public function specialPurpose()" というメソッドが必要です。

  • 一般に、クラスでは echo や print その他の出力を行ってはいけません。 その代わりに、print あるいは echo される内容を返します。 返り値は、適切にエスケープしなければなりません。

  • クラスは、ヘルパークラスと同じ名前のファイルに作成しなければなりません。 再び "specialPurpose" ヘルパーを例にとると、ファイル名は "SpecialPurpose.php" でなければなりません。

指定したヘルパーパスのどこかにヘルパークラスのファイルを配置すると、 Zend_View は自動的にそれを読み込んでインスタンスを作成し、 必要に応じて実行します。

SpecialPurpose ヘルパーのコードの例を示します。

class My_View_Helper_SpecialPurpose extends Zend_View_Helper_Abstract
{
    protected $_count = 0;
    public function specialPurpose()
    {
        $this->_count++;
        $output = "'The Jerk' を {$this->_count} 回見ました。";
        return htmlspecialchars($output);
    }
}

        

そして、ビュースクリプト内で SpecialPurpose ヘルパーを必要なだけコールします。いちどインスタンスが作成された後は、 Zend_View インスタンスの中でそれが持続します。

// ビュースクリプト内では、$this は Zend_View インスタンスを指すことを覚えておきましょう。
echo $this->specialPurpose();
echo $this->specialPurpose();
echo $this->specialPurpose();

        

出力結果は、次のようになります。

'The Jerk' を 1 回見ました。
'The Jerk' を 2 回見ました。
'The Jerk' を 3 回見ました。

        

時には Zend_View オブジェクトを使用したくなることもあるでしょう。 たとえば登録されているエンコーディングを使用する必要があったり、 ヘルパー内で別のビュースクリプトをレンダリングしたくなったりといった場合です。 ビューオブジェクトにアクセスするには、ヘルパークラス内で次のような setView($view) メソッドを定義しなければなりません。

class My_View_Helper_ScriptPath
{
    public $view;

    public function setView(Zend_View_Interface $view)
    {
        $this->view = $view;
    }

    public function scriptPath($script)
    {
        return $this->view->getScriptPath($script);
    }
}

        

ヘルパークラスで setView() メソッドを定義しておくと、 最初にインスタンスが作成される際に自動的にこのメソッドがコールされ、 現在のビューオブジェクトが引数として渡されます。 渡されたオブジェクトをクラス内でどのように管理するかは特に決まっていません。 お好みの方法で管理してください。

Zend_View_Helper_Abstract を継承する場合は、 このメソッドはすでに定義済みであるため定義する必要はありません。