Drupal で、カテゴリごとにエントリーのタイトル一覧(リスト)を表示する方法

このブログでは、サイドバーのカテゴリ(ブロック)のところでカテゴリ名を選択すると、そのカテゴリ中のエントリーのタイトル一覧を表示するようにしている。これは Drupal でどうやっているのかというと・・・

まず、前準備として、カテゴリ名を URLエイリアスで作っておく(英数字で)。たとえば本ブログを実際の例として挙げると、taxonomy/term/31 に drupal という URL エイリアスを設定している。

次に、View モジュールで以下のコードをインポートする

$view = new stdClass(); $view->name = 'category'; $view->description = 'カテゴリ'; $view->access = array ( 0 => '3', 1 => '1', 2 => '2', ); $view->view_args_php = '$result = db_fetch_array(db_query("SELECT src FROM {url_alias} WHERE dst = \'$args[0]\'")); $url = $result[\'src\']; $tid = preg_replace ("/taxonomy\\/term\\//", \'\', $url); $vocabularies = taxonomy_get_vocabularies(); foreach($vocabularies as $voc) { $taxnomies = taxonomy_get_tree($voc->vid, 0); foreach ($taxnomies as $term) {
if($term->tid == $tid) {
  $args[0] = $term->name;
  return args;
}
} }'; $view->page = TRUE; $view->page_title = ''; $view->page_header = ' '; $view->page_header_format = '1'; $view->page_footer = ''; $view->page_footer_format = '1'; $view->page_empty = ''; $view->page_empty_format = '1'; $view->page_type = 'table'; $view->url = 'list'; $view->use_pager = TRUE; $view->nodes_per_page = '1000'; $view->sort = array (
array (
  'tablename' => 'node',
  'field' => 'created',
  'sortorder' => 'ASC',
  'options' => 'normal',
),
); $view->argument = array (
array (
  'type' => 'taxletter',
  'argdefault' => '2',
  'title' => '%1',
  'options' => '',
  'wildcard' => '',
  'wildcard_substitution' => '',
),
); $view->field = array (
array (
  'tablename' => 'node',
  'field' => 'title',
  'label' => '',
  'handler' => 'views_handler_field_nodelink',
  'defaultsort' => 'ASC',
  'options' => 'link',
),
); $view->filter = array (
array (
  'tablename' => 'node',
  'field' => 'type',
  'operator' => 'OR',
  'options' => '',
  'value' => array (
0 => 'blog', ),
),
array (
  'tablename' => 'node',
  'field' => 'status',
  'operator' => '=',
  'options' => '',
  'value' => '1',
),
); $view->exposed_filter = array ( ); $view->requires = array(node); $views[$view->name] = $view;

実際には、

  1. 渡された URL (これはカテゴリの URL エイリアスとなっている)から taxonomy の tid を割り出して(上のコードでは $tid = preg_replace ("/taxonomy\\/term\\//", \'\', $url); の部分)、
  2. さらに tid からカテゴリ名(上のコードでは $term->name)を割り出して、
  3. そのカテゴリ名を View モジュールの Argument に $args[0] = $term->name; として渡す。
  4. View モジュールの Argument の設定では、Taxonomy: Term Name を指定。
  5. この Argument の設定で、タイトルのところに %1 と入れておくと、この %1 に args[0] で渡された値、すなわちカテゴリ名が入って、ビューのタイトルとなる

・・・という仕掛けだが、正直わかりずらい!!!俺もよくここまでできたもんだ(笑)