Drupal で、エントリーのフッタ(リンク)を作る。

このブログの個々のエントリーの最後には必ず Posted on yyyy-mm-dd by 投稿者名 | カテゴリ名 | 新しいコメントの追加 | パーマリンク | 印刷用ページ | 人気blogランキング | はてブに追加 | はてブ数 という書式のフッターが付くようにしている。Movable Type のデフォルトのテンプレートの形式に近いものだ(はてブとかランキングとか枝葉はついていますが)。これと同じものを Drupal で実現するにはどうしたらいいのだろう?ヒントはテーマにありそうだ。具体的には、_phptemplate_variables の中でこのフッターを1行を表す変数(例えば $node_footer で、$node_footer の中には HTML 文が入っている)を定義し、node.tpl.php で使用する。 ここで、リンクの作成方法が Drupal 独特のものである。Drupal 流のスマートなリンクの記述の仕方は、array() を使うというものである。 Drupal では各種の定義に関するものはほとんど array()、つまりハッシュ変数で定義するようになっている。この array() がネスト構造になるために、それが Drupal のとっつきにくさ(私も未だ慣れない)でもあり、今までにないプログラミングパラダイムを可能にしている。PHP の言語構造と合ってはいるが、ここまで徹底してなんでもかんでも array() を使うと、Drupal とは PHP の文法を借りた Drupal というスクリプト言語と考えた方がいいかもしれない。つまり CMS 用の記述言語として Drupal が登場してきたのである。 さて、次に紹介するコード(実際にこのブログのフッタとして template.php に書いたもの)では、
  1. template.php の中の _phptemplate_variables で $node_footer を定義するために、
  2. switch 文を使って $hook の内容を調べて $hook == 'node' (つまり case 'node': )であれば、
  3. $node_footer = array(...) を定義する。array(...) の中には、各種のリンク要素が入る。
  4. そのリンク要素はどのように記述するかというとやはり array(...) であり、その書式は フッタの HTML = array(リンクの名前=>array('href'=>リンク, 'title'=>タイトル)) となっている。
  5. フッタの HTML = array(...) の中は、 リンクの名前=>array('href'=>リンク, 'title'=>タイトル), リンクの名前=>array('href'=>リンク, 'title'=>タイトル), リンクの名前=>array('href'=>リンク, 'title'=>タイトル), ... と、繰り返し書くと個々の array(...) で定義したリンクを連結してくれる。
  6. 最後に、これが大事なのだが、上で定義したフッタの HTML を phptemplate_links に引数として渡す。phptemplate_links は、Drupal の theme_links 関数を Drupal のテーマの中 (template.php) からオーバーライドするものである。
以下がコード全体。 <?php function _phptemplate_variables($hook, $vars = array()) { global $base_url; switch ($hook) { <pre>case 'node': $node_url = $base_url . $vars['node_url']; $node_title = $vars['title']; $vars['permalink'] = "&raquo; 「<a href=\"$node_url\" title=\"$node_title\">$node_title" . '」の 続きを読む</a>'; // ノードのフッタ $node_footer = array( 'permalink'=>array( 'href' =>$node_url, 'title'=>'| パーマリンク' ), 'printer_friendly'=>array( 'href' =>$node_url . '?print=y', 'title'=>'| 印刷用ページ' ), 'blogranking'=>array( 'href' =>'https://blog.with2.net/link.php?351190', 'title'=>'| <img src="' . $base_url . '/' . file_directory_path() . '/images/blogranking_blue.gif"' . ' title="ランキングへの協力お願いいたします。"' . ' alt="人気blogランキング"' . ' width="80"' . ' height="15"' . ' border="no"' . ' vertical-align="middle">' ), 'hatena_append'=>array( 'href' =>'https://b.hatena.ne.jp/append?' . $node_url, 'title'=>'| <img src="' . $base_url . '/' . file_directory_path() . '/images/hatena_append.gif"' . ' title="はてなブックマークに追加"' . ' alt="はてなブックマークに追加"' . ' width="16"' . ' height="12"' . ' border="no"' . ' vertical-align="middle">' ), 'hatena'=>array( 'href' =>'https://b.hatena.ne.jp/entry/' . $node_url, 'title'=>'| <img src="https://b.hatena.ne.jp/entry/image/large/' . $node_url . '"' . ' border="no">', 'attributes'=>array('title'=>$node_title) ), ); } $vars['node_footer'] = phptemplate_links($node_footer); break; return $vars; } ?>