アイキャッチ画像: デスクの上でパソコンを使用している

Drupalには通常のPHPにはない面白い仕組みがあります。「hook関数」とか「~~.tpl.php」とか「theme関数」とか。
仕組みを覚えるまでが大変ですが覚えちゃったらモジュール開発がめーっちゃ楽しくなるんですっξ*'ヮ')ξ♪
今回の記事はそんな楽しいtheme関数の仕組みについての記事となります。

theme関数って何?


drupal.org内の説明ページはこちらです。
theme | theme.inc | Drupal 7 | Drupal API
データを受け取って表示用のデータ (HTML)を生成する関数です。PHPの中で使えて目的別に出力されるHTMLのテンプレートみたいなものですかね。ルールに沿ったデータを渡すとtheme関数側で適切に整形して出力してくれます。
Drupalのコアには表(table)やリスト(ul,ol)や画像(img)やページャー用のHTMLなどの関数がいくつか用意されています。

私がモジュール制作の際によくお世話になるtheme関数はtable(表)やitem_list(リスト)ですねー。
linkもありますけど基本的にはl()関数で事足りるのであんまり使いません。

theme関数は何のためにあるの?

「MVC」という言葉を聞いたことがありますか?「処理」と「表示」と「操作」を分けてシステムを実装しようという考え方です。
それぞれを分けることによって複数人での開発の時にそれぞれの得意分野で開発をすすめることができますし、後での改修が楽になるなどのメリットがあります。
theme関数はこのうち「表示」と「操作」を担当しています。

また、phpの処理を書いている中でどうしても表として出力したい!って時にはみなさんはどうしてますか?echoとかprintとかを使って出力してませんか?
それって処理と表示がまざって見栄えが悪いですし、少しデータを変えてまた同じような表を作る時にまた同じように処理の中でecho使って・・・となって、その表示のための処理がまた出てきたりしたら最終的にはもうその部分の処理を関数化しますよね。PHP使ってホームページなりを作ったことのある人なら経験があるはず。
そういった処理はtheme関数が行ってくれます。コアに入っているtheme関数だけでも大変重宝します。
それでは次にtheme関数の使い方を見ていきましょう。

theme関数の使い方

theme関数はこんな感じです。

<?php
  theme($hook, $variables = array());
?>

$hook の部分に欲しい関数名を記述して、 $variables にデータを入力します。 theme関数のテーブルならこんな感じ。

<?php
  theme('table', array($variables))
?>

実はこれ下の記述とほぼ同じです。

<?php
  theme_table($variables);
?>

でも↑これは使っちゃいけません。理由についてはこちらをご覧ください
余裕があれば翻訳して掲載します。英語難しい・・・。

実例

HTMLで表を表示したい時はtableタグを使いますがtheme関数を使ってシンプルは表を出力するとこんな感じになります。
theme_table関数の詳しいルールについてはこちらをご覧ください

<?php
  // thaed部分を用意
  $header = array('', '名前', '概要');

  // tbody部分を用意
  $rows = array(
    // 1行目 tdやthに何か属性などのオプションを付けたい場合のセルの内容はarray('data' => '内容')。
    array(
      array('data' => 'WEB', 'header' => TRUE, 'rowspan' => 4),
      'ホームページ制作',
      '主軸となります。基本はDrupalでの作成です。'
    ),
    array(
      'スマートフォンサイト制作', 'レスポンシブがきてます。'
    ),
    // 3行目
    array(
      'サポートプラン', '安心の無償更新プラン。'
    ),
    array(
      'Drupalサイト開発', 'モジュールでもテーマでもなんでも。'
    ),
    // 5行目
    array(
      array('data' => 'Design', 'header' => TRUE, 'rowspan' => 4),
      'グラフィックデザイン制作',
      'パンフレットや名刺など。'
    ),
    array(
      'ロゴマークデザイン制作', 'ブランドの顔といっても過言ではありません。'
    ),
    // 7行目
    array(
      'パッケージデザイン制作', '商品の魅力をアピールします。'
    ),
    array(
      'キャラクター/イラスト制作', 'イラストも描けます。'
    ),
  );

  // captionを用意
  $caption = 'Studio Umi+のサービス一覧(2014.06.12現在)';

  // theme関数を使って表を作成中
  $table = theme('table', array('header' => $header, 'rows' => $rows, 'caption' => $caption,));

  echo $table;
?>

結果(HTMLソース):

<table class="sticky-enabled">
<caption>Studio Umi+のサービス一覧(2014.06.12現在)</caption>
 <thead><tr><th></th><th>名前</th><th>概要</th> </tr></thead>
<tbody>
 <tr class="odd"><th rowspan="4">WEB</th><td>ホームページ制作</td><td>主軸となります。基本はDrupalでの作成です。</td> </tr>
 <tr class="even"><td>スマートフォンサイト制作</td><td>レスポンシブがきてます。</td> </tr>
 <tr class="odd"><td>サポートプラン</td><td>安心の無償更新プラン。</td> </tr>
 <tr class="even"><td>Drupalサイト開発</td><td>モジュールでもテーマでもなんでも。</td> </tr>
 <tr class="odd"><th rowspan="4">Design</th><td>グラフィックデザイン制作</td><td>パンフレットや名刺など。</td> </tr>
 <tr class="even"><td>ロゴマークデザイン制作</td><td>ブランドの顔といっても過言ではありません。</td> </tr>
 <tr class="odd"><td>パッケージデザイン制作</td><td>商品の魅力をアピールします。</td> </tr>
 <tr class="even"><td>キャラクター/イラスト制作</td><td>イラストも描けます。</td> </tr>
</tbody>
</table>

結果(表示):

Studio Umi+のサービス一覧(2014.06.12現在)
名前概要
WEBホームページ制作主軸となります。基本はDrupalでの作成です。
スマートフォンサイト制作レスポンシブがきてます。
サポートプラン安心の無償更新プラン。
Drupalサイト開発モジュールでもテーマでもなんでも。
Designグラフィックデザイン制作パンフレットや名刺など。
ロゴマークデザイン制作ブランドの顔といっても過言ではありません。
パッケージデザイン制作商品の魅力をアピールします。
キャラクター/イラスト制作イラストも描けます。

とまあこんな感じにルールに沿ったデータさえ用意してあげればいい感じに出力してくれます。
コードが見やすいですよね!
theme関数は自分で作成することもできますがそれはまた今度の機会にでも紹介します・w・☆