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) {

    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;
}
?>
トラックバック URL: https://perltips.twinkle.cc/trackback/273