Zend_ViewのheadTitle()でSETとPREPENDがあるのを見落としてた

By shin - 09/10/28 - このエントリをはてなブックマークに追加このエントリをYahoo!ブックマークに追加このエントリをdel.icio.usに追加このエントリをFC2ブックマークに追加

以前はZendFrameworkのViewにSmartyを拡張したものを使っていたのですが、最近はZend_Viewをそのまま使っています。使い始めという事を言い訳にしても、まったく使いこなせてなかった様です。より反省するために恥を忍んで記録しておきます。

 

headTitle()を使ってみる

マニュアルを流し読みして下記の方法でメタのtitleの内容を操作出来ることを知り、早速つかってみる。

 

# initView()又はResource作成時


$view->headTitle()->setSeparator(' :: ');
$view->headTitle('サイト名');

# Actionかviewスクリプト


$view-->headTitle('ページ内容');

すると出力はこうなる。


<title>サイト名 :: ページ内容</title>

 

[ページ内容]::[サイト名]としたくなった

ここで、ページのタイトルは前、サイト名を後ろにしたいと考える。キーワードが先の方がSEO的にも良いだろうし、ブックマークなどでも内容が先の方がわかりやすい。

 

最初に行った方法(ダメなやりかた)

どうやらプレースホルダーの中身をくっつけて出すだけのようなので、ソートすれば出来るのではないかと考える。では独自のヘルパーを作らなければ、と考える。これが既に間違い。
なぜかこの時点では、Zend_View_Helper_HeadTitle::headTitle()は見なかった。いや、見えなかった。。。

 

# initView()又はResource作成時


$view->addHelperPath('My/View/Helper/', 'My_View_Helper');
$view->headTitle()->setSeparator(' :: ');
$view->headTitle('サイト名');

# 勝手に作ったヘルパーがこれ


class My_View_Helper_HeadTitle extends Zend_View_Helper_HeadTitle
{
    /**
     * Turn helper into string
     *
     * @param  string|null $indent
     * @param  string|null $locale
     * @return string
     */
    public function toString($indent = null, $locale = null)
    {
        // 最後に追加したものを先頭に持ってくる
        $this->_container->uasort(array($this, 'reverse'));
        return parent::toString($indent, $locale);
    }
    
    /**
     * 逆順ソートの評価
     * 
     * @param  intger $a
     * @param  intger $b
     * @return intger
     */
    public function reverse($a, $b)
    {
        $a = (int)$a;
        $b = (int)$b;
        if ($a == $b) { return 0; }
        return ($a < $b) ? -1 : 1;
    }
}

すると出力はこうなる。


<title>ページ内容 :: サイト名</title>

できた!
もちろんこれは無駄。この様な当たり前に欲しい機能は既に実装されている。

 

普通のやりかた

普通にマニュアルを読んだ人や、ソースを見た人はこう書く。第二引数で指定する。それだけ。

# Actionかviewスクリプト


$view-->headTitle('ページ内容', 'PREPEND');

# Zend_View_Helper_HeadTitle::headTitle()


    /**
     * Retrieve placeholder for title element and optionally set state
     *
     * @param  string $title
     * @param  string $setType
     * @param  string $separator
     * @return Zend_View_Helper_HeadTitle
     */
    public function headTitle($title = null, $setType = Zend_View_Helper_Placeholder_Container_Abstract::APPEND)
    {
        if ($title) {
            if ($setType == Zend_View_Helper_Placeholder_Container_Abstract::SET) {
                $this->set($title);
            } elseif ($setType == Zend_View_Helper_Placeholder_Container_Abstract::PREPEND) {
                $this->prepend($title);
            } else {
                $this->append($title);
            }
        }

        return $this;
    }

 

反省

拡張できると知ったばかりだと何でも拡張したがる。