favicon.icoをテーマディレクトリ内に置きたいときのコード例
[2014.1.5追記]
baserCMS3で追加された関数 getThemeUrl() のおかげで、favicon.icoをテーマディレクトリ内に置きたいときのコードが簡素化されました。本記事の最後に、baserCMS3で使えるコード例を示したので、よろしければご参照ください。
baserCMSには、コーポレートサイトの定番アイテムを一発で実装できる、かゆいところに手の届く関数がいくつもあります。いわゆる〈ファビコン〉へのリンクを出力できる $bcBaser->icon() もその一つ。ドキュメントルート(app/webroot)の直下に favicon.ico を置き、テンプレートファイルの <head> セクションに $bcBaser->icon() を書けばbaserCMS側でファビコンを取得・表示してくれます。
ところが、「画像はやっぱり img ディレクトリにまとめたいぜ」とテーマディレクトリ内の img ディレクトリに favicon.ico を置くと、この関数そのままでは当然うまく出力させることはできません。
そこで icon() 関数のソースを見てみます。baser/views/helpers/bc_baser.php の760行目あたり。
function icon() { echo $this->BcHtml->meta('icon') . "\n"; }
どうやら実体は $BcHtml->meta() のようです。今度は cake/libs/view/helpers/html.php を見てみます。197行目あたり。
function meta($type, $url = null, $attributes = array(), $inline = true) { if (!is_array($type)) { $types = array( 'rss' => array('type' => 'application/rss+xml', 'rel' => 'alternate', 'title' => $type, 'link' => $url), 'atom' => array('type' => 'application/atom+xml', 'title' => $type, 'link' => $url), 'icon' => array('type' => 'image/x-icon', 'rel' => 'icon', 'link' => $url), 'keywords' => array('name' => 'keywords', 'content' => $url), 'description' => array('name' => 'description', 'content' => $url), ); if ($type === 'icon' && $url === null) { $types['icon']['link'] = $this->webroot('favicon.ico'); }
favicon.ico のパスを任意で指定したい場合は、どうやら $BcHtml->meta() の第1引数に icon,第2引数にURLを書けばよさそう。
ということで、こんな感じでまとめてみました。別ページの記事「現在使用中のテーマディレクトリのパスを取得する」の応用です。
<?php $theme_dir = $bcBaser->getRoot() . 'themed/' . $siteConfig['theme']; echo $BcHtml->meta( 'icon', $theme_dir . '/img/favicon.ico' ) . "\n"; ?>
どうもチカラワザっぽい感がなきにしもあらずなので、よりエレガントな解法をご存じの方は @tecking までお知らせくださるとうれしいです。
[2014.1.5追記]
baserCMS3で使用中のテーマディレクトリを取得する関数 getThemeUrl() が追加され、より簡素にコードを記述できるようになりました。
<?php echo $this->BcHtml->meta( 'icon', $this->BcBaser->getThemeUrl() . 'img/favicon.ico' ) ?>
本記事初出時に getRoot() や $siteConfig['theme'] を使う必要があったのが getThemeUrl() 関数ひとつですむようになった、というわけです。