ホーム

Drupal 8

サイト制作費

事例紹介

運営会社

お問い合わせ

サイトについて

現在地

ランダム画像を表示する

テーマシステムの仕組みを理解する為に、トップページ上部に、アクセスする度に異なる画像を表示するような簡単なカスタマイズを行ってみます。ここで変更するファイルは、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 部分には<機能名>が設定されてコールされます。