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; } }