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] で渡された値、すなわちカテゴリ名が入って、ビューのタイトルとなる
・・・という仕掛けだが、正直わかりずらい!!!俺もよくここまでできたもんだ(笑)
トラックバック URL: https://perltips.twinkle.cc/trackback/283