以前は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;
}
反省
拡張できると知ったばかりだと何でも拡張したがる。