web-dev-qa-db-ja.com

任意の深さの単純な分類法ブラウザを構築するクリーンな方法

私は何日も費やして、次のことを行うためのクリーンな方法を決定しようとしました:

  1. トップレベルのすべての用語とその子用語へのリンクを含む語彙のリストを表示する
  2. リンクをクリックすると、those用語の子のリストが表示されます。
  3. その用語でタグ付けされたノードのリストが表示される最低レベルの用語まで無限に広告を表示します。

これはかなり一般的に必要とされる機能のようですが、特にすべての用語ツリーが同じ深さまで下降していない場合は特に、任意の深さを処理できるソリューションを見つけることができません。

理想的なソリューションは、ビュー3、コンテキスト、EntityFieldQueries、またはDrupal 7。

私はほぼ 3つのノード:用語の関係(用語、用語の親、および用語の親の親)を使用して単純なビューを作成し、それらを順次コンテキストフィルターに使用することで、まさに私が望むことを実行できます。これの唯一の問題は、深さが少なすぎる用語パスを持つノードがある場合、「未分類」としてリストされ、デッドリンクが生成されることです。そうする代わりに、利用可能な次の子の用語にリンクしたいと思います。

23
beth

Viewsモジュールのみでこれを行う方法を見つけました。それは完璧ではありません—単一の深さの分類法に対する私のソリューションが行うような方法で、分類系統を持つニースURLとブレッドクラムを生成しません。

静的深度ブラウザ

静的な深さの分類(すべての用語の子項目の深さが同じである)の場合、次のようにします。

  1. nodesのビューを作成します
  2. 分類用語(用語)に関係を追加する
  3. 用語(親)からアクセス可能な、分類用語の親への関係の追加
  4. 分類用語の親に関係を追加します。親(親の親)からアクセスできます。
  5. 分類法の深さに応じて、手順4を必要なだけ繰り返します。
  6. それぞれにコンテキストフィルターを追加し、適切な順序になっていることを確認します。フィルターがURLにない場合に要約を表示するように設定します。
  7. おそらく、各フィルターのブレッドクラムとタイトルをオーバーライドする必要があります。
  8. ???
  9. 利益

可変深度ブラウザ

変数の深さの分類法(一部の用語ツリーのネストのレベルが他よりも深い場合)の場合、これは少し複雑になります。

  1. 新しいトップレベルの用語(Foo)を語彙に追加し、他のすべての用語をその下に置きます。
  2. 用語名を表示するページでtermsのビューを作成します
  3. コンテキストフィルターの追加:分類用語:親用語
  4. デフォルト値がURLにない場合は、デフォルト値を入力します
  5. デフォルト値をトップレベルの用語名(Foo)に設定します
  6. 検証基準を指定してください
    • バリデーター:分類用語
    • 基準:あなたの語彙名
    • フィルター値タイプ:用語IDに変換された用語名
  7. ビューに添付ファイルを追加するには、ビューパネルの上部にある[+追加]ボタンをクリックします。
  8. この添付ファイルにのみ追加(オーバーライド)関係:分類用語:用語を含むコンテンツ
  9. この添付ファイルにのみ追加(上書き)表示:フィールド:ノードにリンクされたノードタイトル、および削除(この添付ファイルからのみ!)表示:フィールド:用語名
  10. この添付ファイルにのみ追加(オーバーライド)コンテキストフィルター:分類用語:名前
  11. フィルター値を使用できない場合は、デフォルト値を提供します。URLからの生の値:パスコンポーネント:2(ページパスに> 1コンポーネントがある場合はそれ以上)
  12. 添付ファイル設定:添付先:[作成したページ表示の名前]
  13. ???
  14. 利益

参照用のビューのUIのスクリーンショット: enter image description here

23
beth
  1. タイプ分類のビューを作成します
  2. タイプのコンテキストフィルターを追加します分類用語:親用語
  3. デフォルト値を提供を設定し、修正したままにします。最上位の親用語の用語IDを与える
  4. Taxonomy term IDをフィールドとして追加し、表示から除外します
  5. 分類用語名をクリックして、このフィールドをリンクとして配置します。リンクを「path-you-set-in-view/[tid]」として指定します
    注:「このフィールドをその分類用語ページにリンクする」のチェックを外す必要があります

ビューページにアクセスすると、最上位の親の子が表示されます。あなたが得る例によると:

  • 期間1
  • 期間2

Term1をクリックすると、子が表示されます。 term1.1.1に到達するまで。 term1.1.1をクリックしても、結果は表示されません。そのためには、上のビューにもう1つのビューブロックを作成する必要があります。

  1. ブロックを追加
  2. 既存のコンテキストフィルターとフィールドを削除する
    注:それらを削除するときは、必ずこのページ(Over Ride)を上部のドロップダウンから選択してくださいForそうしないと、ページで作成したフィールドとコンテキストフィルターも失われます。
  3. 新しいコンテキストフィルターを追加分類用語:用語ID
  4. 関係を追加分類用語:用語を含むコンテンツ
  5. Content Titleを追加すると、上部のドロップダウンから関係を使用できます。
  6. ビューを保存して、作成したページに戻ります(これが重要でない場合は、次のステップを完了できません。
  7. [〜#〜] footer [〜#〜] OR [〜#〜] header [〜#〜]にフィールドを追加する=
  8. リストから「グローバル:ビュー領域」を選択し、ドロップダウンから作成したブロックを選択します挿入するビューがある間にチェックコンテキストフィルターを継承を通過できるようにしますこのビューからブロックまでの値
  9. チェックビューに結果がない場合でも表示このビューに結果が表示されない場合でもブロックが表示されるようにします

ビューを保存すれば完了です。

8

あなたが望んでいるのは Views Tree 、分類用語のツリーを作成するために Views を使用するcontribモジュールだと思います。

(ちょっと教えてください、それを使用する簡単なハウツーを書いて、税フィールドを表示します)

どうやらそのモジュールには issue があり、分類用語を処理できません。ブー。

とはいえ、私はあなたが望んでいることをしているように見える次のコードを見つけました(かなり基本的なjQueryコードを使用して要素を表示/非表示にすることができます):

<?php

// The ID of the taxonomy vocabulary for which you'd like to create a nested list
$vid = 10;

$depth = 0;
$num_at_depth = 0;
$tree = taxonomy_get_tree($vid);

print "<ul class=\"menu\">\n<li>";
foreach ($tree as $term) {
  $diffdepth = 0;
  if ($term->depth > $depth) {
    print "\n<ul>\n<li>";
    $depth = $term->depth;
    $num_at_depth = 0;
  }
  if ($term->depth < $depth) {
    $diffdepth = $depth - $term->depth;
    while ($diffdepth > 0) {
      print "</li>\n</ul>\n";
      $diffdepth--;
    }
    $depth = $term->depth;
  }
  if (($term->depth == $depth) && ($num_at_depth > 0)) {
    print "</li>\n<li>";
  }
  print l($term->name, 'taxonomy/term/' . $term->tid);
  $num_at_depth++;
}
print "</li>\n</ul>\n";

" ページへのリンクを含むネストされたカテゴリリスト "経由。

3
aendrew

動的な分類参照ページのセットだけが必要な場合は、次のようにします。3つのビュー+ Taxonomy Display モジュールを使用して、ビューを表示できるようにします。 _taxonomy/term/%_ページの内容:

  1. トップレベルの用語-親がnullである用語のリスト
  2. Mid Level Terms-親がnullではない用語をリストします。結果なし:ビュー#3を表示
  3. 用語付きのノード-用語でタグ付けされたノードをリストします。

ビュー1と2はおそらく同じようにテーマ化されるので、それらをディスプレイとして1つのビューにマージすることを検討するかもしれません-より簡単に管理できます。

私は分類法にそのアプローチをうまく使用しました。幸いにも、それは各レベルで同種でした-特定の枝は葉(ノード)または枝(用語)のいずれかで終わりましたが、両方ではありませんでした。これが制限になる場合は、最初にテストしてください。

もちろん、これは「疑似コード」です。検証とフィルター、および構造を反映するための見栄えがよく、論理的に見えるパスオートパターンを設定する必要があります。

0
Artur