テーマシステムの仕組みを理解する為に、トップページ上部に、アクセスする度に異なる画像を表示するような簡単なカスタマイズを行ってみます。ここで変更するファイルは、page.tpl.php、template.phpになります。
1.表示する画像(ship1.jpg、ship2.jpg、ship3.jpg、ship4.jpg)を作成し、zen/imagesディレクトリ以下にアップロードします。
2.template.phpの編集[1]
$topimage = array(
"/images/ship1.jpg",
"/images/ship2.jpg",
"/images/ship3.jpg",
"/images/ship4.jpg",
);
$variables['topimage'] = $topimage[rand(0, count($topimage)-1)];<?php if ($is_front){ ?>
<img src="<?php print check_url($base_path . $directory . $topimage) ?>" alt="" />
<?php } ?>DrupalのテーマAPIコール時には、下記のように、
1.<テーマ名>_<機能名>
2.<テーマエンジン名>_<機能名>
3.theme_<機能名>
の順で関数が存在するかを確認し、もし関数が存在した場合は、その関数を実行する仕様になっています。
テーマ関数のオーバーライド
したがって、もしzenテーマのtemplate.phpに zen_page 関数が定義されていた場合、 phptemplate_page [2] の替わりに zen_page 関数が実行される事になります [3] 。
template.phpによるオーバーライド
上記のtemplate.phpの編集部分では、phptemplate.engineから関数をまるごとコピーして変更する方法を紹介しましたが、単純にテンプレートに変数を追加する目的であれば、以下のコードをtemplate.phpに追加する方が簡単です[4]。
function _phptemplate_variables($hook, $vars) {
switch($hook) {
case 'page' :
$topimage = array(
"/images/ship1.jpg",
"/images/ship2.jpg",
"/images/ship3.jpg",
"/images/ship4.jpg",
);
$vars['topimage'] = $topimage[rand(0, count($topimage)-1)];
break;
}
return $vars;
}1 実際にはpage.tpl.phpやブロックに直接phpコードを記述した方が簡単なのですが、オーバーライドの説明の為に意図的に遠回りな方法を紹介しています。
2 theme_pageはページ全体を表示するテーマ関数です。詳細は、公式サイトの theme_page をご参照下さい。
3 オーバーライド可能なコアモジュールのテーマ関数は、公式サイトの Themeable functions に記述されています。また各モジュール内に定義されている theme_xxxx という関数がtemplate.phpによって置換可能な関数になります。
4 zenテーマでは既に_phptemplate_variables関数が定義されていますので、実際には“case ‘page’ :“以下の必要なコードをコピーする作業になります。