[Zend Framework] Zend_View: ビューヘルパーを利用して、<head> を効率的に管理する

前回に続いて、具体的なプレースホルダの実装とされている、doctype やページのタイトルなど、<head> の要素群を利用します。

どこで指定するのか整理する

公式の情報が分かりづらいので、他の情報を眺めつつ確認しました。
* テンプレートにビューヘルパータグを書く。
* 下記のいずれかで指定する。
* テンプレート
* コントローラ
* Bootstrap.php
* 自作ビューヘルパーを作ることも可能。
Zend_View – 独自のビューヘルパーを作成する | deadwood
参考サイト

レイアウトとBootstrap.phpで指定する

下記のような使われ方を想定し、<head> を置き換えていきます。
* 複数のレイアウトで、共通の<head>情報を利用する。
* title, keyword, description を生成する。
まず、layout.phtml をビューヘルパーのタグに置き換え、Bootstrap.php で指定することにします。

layout.phtml

application/layouts/scripts/layout.phtml
<?= $this->doctype() . PHP_EOL; ?>
<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
    <head>
<?= $this->headMeta() . PHP_EOL; ?>
<?= $this->headTitle() . PHP_EOL; ?>
<?= $this->headLink() . PHP_EOL; ?>
<?= $this->headStyle() . PHP_EOL; ?>
<?= $this->headScript() . PHP_EOL; ?>
    </head>

Bootstrap.php

application/Bootstrap.php
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initView()
    {
        // Initialize view
        $view = new Zend_View();
        $view->doctype('HTML5');
        $view->headMeta()
                ->setIndent(8)
                ->setCharset('UTF-8')
                ->appendHttpEquiv('X-UA-Compatible', 'IE=edge,chrome=1')
                ->appendName('description', 'page description')
                ->appendName('keywords', 'key, word')
                ->appendName('viewport', 'width=device-width');
        $view->headTitle()
                ->setIndent(8)
                ->setSeparator(' :: ')
                ->append('Site name');
        $view->headLink()
                ->setIndent(8)
                ->headLink(
                    array('rel'  => 'favicon',
                          'href' => $view->baseUrl('favicon.ico'),
                          'type' => 'image/x-icon'),
                          'PREPEND')
                ->appendStylesheet(
                    array('rel'  => 'stylesheet',
                          'href' => $view->baseUrl('css/normalize.min.css'),
                          'type' => 'text/css'))
                ->appendStylesheet(
                    array('rel'  => 'stylesheet',
                          'href' => $view->baseUrl('css/main.css'),
                          'type' => 'text/css'));
        $view->headScript()
                ->setIndent(8)
                ->appendFile(
                    $view->baseUrl('js/vendor/modernizr-2.6.2-respond-1.1.0.min.js'));
        // Add it to the ViewRenderer
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
            'ViewRenderer');
        $viewRenderer->setView($view);
        // Return it, so that it can be stored by the bootstrap
        return $view;
    }
}

ビューヘルパーのタグについては、以下の一覧に詳しく紹介されており、参考になりました。

title, keyword, description をコントローラで生成する

SEO に関連する title, keyword, description タグを、ページ(コントローラ)に応じて生成します。
keyword, description はコントローラで指定するため、下記を Bootstrap.php から削除しておきます。

application/Bootstrap.php
                ->appendName('description', 'page description')
                ->appendName('keywords', 'key, word')

title, keyword, description の値をコントローラから渡します。

application/controllers/IndexController.php
class IndexController extends Zend_Controller_Action
{
    public function init()
    {
        /* Initialize action controller here */
        $this->headSeo();
    }
    public function headSeo()
    {
        $view = new Zend_View();
        // コントローラとアクションの名前を取得する
        $request = Zend_Controller_Front::getInstance()->getRequest();
        // title 部に設定する
        $view->headTitle()
                 ->prepend($request->getActionName() . ' / ' . $request->getControllerName());
        // description, keywords を取得する
        $keyword = array('framework', 'PHP', '書き換わった');
        $view->placeholder('keyword')->exchangeArray($keyword);
        $metaKeywords = $view->placeholder('keyword')->setSeparator(', ');
        $metaDescription = '書き換わった';
        // meta 部に設定する
        $view->headMeta()
                 ->appendName('description', $metaDescription)
                 ->appendName('keywords', $metaKeywords);
    }

公式マニュアルの HeadTitle ヘルパー のサンプルを動くように変更してみました。
prepend, append, setPostfix などを調整すると、望み通りの書式が得られます。
参考サイト