ランダム画像を表示する

テーマシステムの仕組みを理解する為に、トップページ上部に、アクセスする度に異なる画像を表示するような簡単なカスタマイズを行ってみます。ここで変更するファイルは、page.tpl.php、template.phpになります。

手順

1.表示する画像(ship1.jpg、ship2.jpg、ship3.jpg、ship4.jpg)を作成し、zen/imagesディレクトリ以下にアップロードします。
2.template.phpの編集[1]

  • /themes/engines/phptemplate/phptemplate.engine ファイルの中から phptemplate_page の関数定義をまるごとtemplate.php内にコピーします。
  • template.php内のphptemplate_pageの関数名を zen_page に変更します。
  • zen_page 関数の最終行直前(_phptemplate_callbackの前)に以下のコードを追加します。

$topimage = array(
  "/images/ship1.jpg",
  "/images/ship2.jpg",
  "/images/ship3.jpg",
  "/images/ship4.jpg",
);
$variables['topimage'] = $topimage[rand(0, count($topimage)-1)];

3.page.tpl.phpの編集
  • 画像を表示する位置($mission表示の下辺り)に以下の記述を追加します。

<?php if ($is_front){ ?>
  <img src="<?php print check_url($base_path . $directory . $topimage) ?>" alt="" />
<?php } ?>

4.template.php、page.tpl.php をzenディレクトリ以下にアップロードします。
5.テストユーザでログインしてトップページを確認します。正しく編集できた場合は、表示する度に画像がランダムに変更されます。

上記変更内容の解説

DrupalのテーマAPIコール時には、下記のように、
1.<テーマ名>_<機能名>
2.<テーマエンジン名>_<機能名>
3.theme_<機能名>
の順で関数が存在するかを確認し、もし関数が存在した場合は、その関数を実行する仕様になっています。
テーマ関数のオーバーライドテーマ関数のオーバーライド
したがって、もしzenテーマのtemplate.phpに zen_page 関数が定義されていた場合、 phptemplate_page [2] の替わりに zen_page 関数が実行される事になります [3] 。

template.phpによるオーバーライドtemplate.phpによるオーバーライド

  • 上記の変更では、phptemplate.engine内の関数をzenテーマのtemplate.phpにコピーした後で、 toppage という変数を新たに定義し、その変数にランダムに表示する画像ファイル名を設定しています。
  • page.tpl.php には、 $is_front 変数でトップページ表示かを判断し、もしトップページであった場合は、画像を表示するような編集を加えています。

別の実装方法

上記の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;
}

_phptemplate_variables 関数は、テンプレートに変数を追加する場合に使用する関数で、$hook 部分には<機能名>が設定されてコールされます。

1 実際にはpage.tpl.phpやブロックに直接phpコードを記述した方が簡単なのですが、オーバーライドの説明の為に意図的に遠回りな方法を紹介しています。

2 theme_pageはページ全体を表示するテーマ関数です。詳細は、公式サイトの theme_page をご参照下さい。

3 オーバーライド可能なコアモジュールのテーマ関数は、公式サイトの Themeable functions に記述されています。また各モジュール内に定義されている theme_xxxx という関数がtemplate.phpによって置換可能な関数になります。

4 zenテーマでは既に_phptemplate_variables関数が定義されていますので、実際には“case ‘page’ :“以下の必要なコードをコピーする作業になります。