*.tpl.phpファイルの変数の値をちょっと変えたいときに、preprocess_* 関数を使う

Last edited on 2012/04/22 (日) - 10:35

Drupalのテーマでは、ページなりノードなりブロックなりの表示内容を変えたいときに、テンプレートファイル(*.tpl.php)をoverrideしたり、template.php ファイルの中に関数を書いてoverride することで実現できる。

*.tpl.phpファイルの変数の値をちょっと変えたいときには、*.tpl.php をoverride する方法と、template.phpファイルの中で preprocess_* 関数を使う方法がある。例えば、ノードを表示する時に $links(ノード下部に表示するリンクのリスト)に何か追加したいときがそうだ。

Drupalで見ているページのQRコードを表示する」では、ブロックの内容($block->contentという変数)を変えたかったので、block-block-3.tpl.phpというテンプレートファイルで特定のブロックについて内容をoverrideした。

これと同じことが、template.php に preprocess_block関数 を書くことで実現できる。

以下のような関数を書いておくと、ブロックの表示の前に実行され、contentの内容を変更することができる。ここでは、QRコード表示用のブロックの時だけQRコードの生成を行ってブロックの内容を入れ替えている。

function nyanchew_preprocess_block(&$vars, $hook) {
  if ( ($vars['block']->module == "block") && ($vars['block']->delta == 3) ) {
    $path = trim($_GET['q'], '/');
    $path = drupal_get_path_alias($path);
    $path = 'http://nyanchew.com/' . $path;
    $arguments[] = array('name' => 'thisnode', 'data' => 'link', 'type' => 'qr', 'size' => 'small');
    $vars['block']->content = theme_mobilecode($path, $arguments). '
'. $path; } }