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


23

私は何日もかけて次のことを行うためのクリーンな方法を決定しようとしました。

  1. ボキャブラリーのすべてのトップレベル用語のリストを、それらの子用語へのリンクとともに表示します
  2. リンクをクリックすると、それらの用語の子のリストが表示されます。
  3. 最下位レベルの用語まで無限に広告を表示し、その用語でタグ付けされたノードのリストが表示されます。

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

理想的なソリューションは、ビュー3、コンテキスト、EntityFieldQueries、またはDrupal 7で十分にサポートされている他のものを使用するソリューションです。

用語関係(用語、用語の親、用語の親の親)と順次コンテキストフィルターのユーザーの3つのノードで簡単なビューを作成することで、ほぼ正確に必要なことを実行できます。これに関する唯一の問題は、termpathの深さが深すぎるノードがある場合、「未分類」としてリストされ、デッドリンクが生成されることです。それを行う代わりに、利用可能な次の子用語にリンクしてほしい。

回答:


23

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

静的深度ブラウザ

静的な深さの分類(すべての用語が同じ深さの子用語を持つ)の場合、次のようにします。

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

可変深度ブラウザ

可変深さの分類(一部の用語ツリーは他の用語ツリーよりも深いネストレベルを持っている)では、もう少し複雑です:

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

参照用のビューのUIのスクリーンショット: ここに画像の説明を入力してください


うまくできました!質問とあなたの答えの両方を支持する-それはする必要があるかなり一般的なことのようであり、あなたの解決策は最初に答えようとしたときに見つけた何よりも優れています。
12

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

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

  • term1
  • term2

term1をクリックすると、子が取得されます。term1.1.1に達するまで。term1.1.1をクリックしても、結果は得られません。それを実現するには、上記のビューにもう1つのビューブロックを作成する必要があります。

  1. ブロックを追加する
  2. 既存のコンテキストフィルターとフィールドを削除します。
    注:削除する場合は、上部のドロップダウンから[ このページ(オーバーライド)]を選択してください。の場合は、ページで作成された他の賢明なフィールドとコンテキストフィルタもなくなってしまいます。
  3. 新しいコンテキストフィルター分類用語を追加:用語ID
  4. 関係分類用語を追加:用語を含むコンテンツ
  5. コンテンツタイトルを追加するをし、上部のドロップダウンから関係を使用します。
  6. ビューを保存して、作成したページに戻ります(これは、次のステップを完了できない場合に重要です
  7. FOOTERまたはHEADERにフィールドを追加します
  8. リストから[グローバル:ビューエリア]を選択し、ドロップダウンビューから作成したブロックを選択して、そこにいる間に挿入しコンテキストフィルターの継承をチェックします。我々がうまくとしてブロックに、このビューから値を渡すことができるように
  9. ビューに結果がない場合でも表示をチェックして、このビューに結果が表示されない場合でもブロックが表示されるようにします

ビューを保存すると、完了です。


モハメッドシャミームの明確な説明に従いました。ありがとう、完璧に動作します!!
スティーブン

3

あなたが望んでいるのはViews Treeで、ビューを使用して分類用語のツリーを構築するcontribモジュールだと思います。

(ちょっと待ってください。それを使って税務フィールドを表示する方法を簡単に説明します)

どうやらそのモジュールには問題があります分類用語で動作するのを妨げるあります。ブー。

そうは言っても、私はあなたがしたいことをするように見える次のコードを見つけました(いくつかの非常に初歩的な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";

ページへのリンクを持つネストされたカテゴリリスト」経由。


そのモジュールを有効にして、試してみましたが、次の2つの問題があります。1。複数ページのブラウジングエクスペリエンスではなく、単なるフラットリストが表示されると思う。ハウツーが最も役立つでしょう。
ベス

更新された回答。申し訳ありませんが、Views Treeには未解決の問題があります:分類用語を使用します。別の回答が投稿されました。
12

これは、順次ページングされたブラウザではなく、単純なネストされたリストを提供するようです。
ベス

@beth-親/子アイテムがクリックされたときにそのリストの要素を表示/非表示にするjQueryを作成すれば十分でしょうか?
-aendrew

JavaScriptに依存したくありません。
ベス

0

動的な分類参照ページのセットが必要な場合は、次の方法で、ビューを使用してページのコンテンツを表示できる3つのビュー+ 分類表示モジュールが必要になりますtaxonomy/term/%

  1. トップレベルの用語 -親がnullである用語を一覧表示します
  2. 中レベル用語 -親がnullでない用語をリストします。結果なし:ビュー#3を表示
  3. 利用規約とノード -リストのノードが条件でタグ付けされました。

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.