icon: module

drupal 複数のtermを指定していると、texonomy/term/n/allで重複されて検出される件

ノードに、親が同じ複数の子 termを指定すると、texonomy/term/n/allで重複して検出される問題をコードの改変で対応した。

drupalの taxonomyは、要素である termが、親 termを持つ事が可能であり、それによって構造的な分類区別を行う事が可能である。

そして、Nodeは複数の termに属する事が出来る。さらに検索時には、URLに taxonomy/term/[tid]/allと指定すれば、[tid]の子termに属する全ての Nodeを検出する事が出来る。しかし、この様に、taxonomy/term/[tid]/all(若しくはtaxonomy/term/[tid]/[depth])を指定した場合、複数の子 termに属する Nodeが存在すると、その Nodeは属する子 termの数だけ表示されてしまう。以下例。

  • Web(term 1)
    • drupal(term 2)
      • Node「drupalのspam対策」
      • Node「drupalインストール」
    • span(term 3)
      • Node「drupalのspam対策」
  • Windows(term 4)

term「Web」は、term「drupal」「spam」を持ち、Node(記事)「drupalのspam対策」は、term「drupal」「spam」の両方に属する。この場合、taxonomy/term/2/allを実行すると、Node「drupalのspam対策」が 2つリストされてしまう。

  • Node「drupalのspam対策」
  • Node「drupalのspam対策」
  • Node「drupalインストール」

修正コード

この現象を簡単に解決してみた。おそらく drupalの作法的によろしくない解決方法であり、尚且つ副作用が発生する可能性もある為、お勧めはしません。

viewsモジュールの views_query.inc 301行から304行の「$primary_table.$primary_field」を「DISTINCT」で囲む。

    if ($primary_field) {
      $this->fields = array($alias_prefix ."DISTINCT($primary_table.$primary_field)");
    }
    $this->count_field = $alias_prefix ."DISTINCT($primary_table.$primary_field)";

このサイトで利用中の drupalに適用しており、問題なく動いているようだが、この修正を施し、なんらかの障害が発生しても、当方は一切の責任を持てませんので御了承ください。

動作確認モジュール

  • Drupal 5.23
  • views_query.inc,v 1.51.2.12 2008/01/10 20:15:40

以前のバージョン

  • Drupal 5.7
  • views_query.inc,v 1.51.2.11 2007/04/12 15:18:59

この記事と関連性の高い記事

drupal node_image.module の書き換え

icon: module
node_image.moduleを自分勝手に変更したのでメモ 表示数を「0」にしても表示されてしまうので変更。 556行 if (isset($count) && $count === 0) re……

Drupal5 これは必須だろと思うmodules

icon: module
Drupal5をインストール後、個人的に必須と思ったモジュールをリストするメモ。随時更新予定。更新日時を確認の事。

drupal module mobi_loaderで携帯対応

icon: module
2009年12月 20日現在、Drupal5用の mobi_loaderは、サポートされていない。携帯対応にするには、マルチドメイン機能で、i.diary.haz.jp等を用意し、モバイル用……

drupal 5 SPAMモジュールとの別れ

icon: module
Drupal5インストール以来、有効にしていた SPAMモジュールの使用を止めた。

drupal5 Advanced cache 5.x-1.6をインストールしてみた

icon: module
drupal5に Advanced cache 5.x-1.6(advcache)をインストールしてみた。 このモジュールは、通常通りに有効にした後、コマンドラインからpatchコマンドで有効化……