ビューで各用語の最新の投稿を3つだけ表示するにはどうすればよいですか?


14

別の質問の助けを借りて:ビューで各分類用語の最新ノードを表示する必要なビューを作成できましたが、各用語のすべての投稿が表示されます(用語ごとにグループ化されます)?各用語を最新の投稿のうち3つだけを表示するように制限するにはどうすればよいですか。

例えば

期間1-
投稿1-
投稿2-
投稿3

期間2-
投稿1-
投稿2-
投稿3

期間3-
投稿1-
投稿2-
投稿3

回答:


9

必要なノードが1つだけの場合は、「代表ノード」関係を使用できます。ただし、各用語ごとに3つのノードが必要な場合は、ビューフィールドビューなどを使用します

1)コンテンツの「子」ビューを作成します。このようなもの: ここに画像の説明を入力してください

分類用語の引数、ポケットベルの制限、ソートなどを追加します。 ここに画像の説明を入力してください

これで、このビューを別のビューに添付できます。

2)分類法ビューを作成します。 ここに画像の説明を入力してください

非表示の用語IDフィールドを追加してから、「Global:View」フィールドを追加します。 ここに画像の説明を入力してください

キャッシングを設定することを忘れないでください。以下からのビューフィールドを表示ページ:

このモジュールをビューのキャッシュと組み合わせて使用​​することを強くお勧めします。ビューコンテンツキャッシュとキャッシュアクションは、ビューをキャッシュする良い方法です。


Kalabroに感謝します。あなたのアプローチも正しいです。私はもともとこのルートに行っていましたが、大量のビューを作成し、ビューの後にビューを埋め込むよりも良い方法があるかどうかを見たかったです。
ナイジェルウォーターズ

2
@NigelWaters、それはトンではありません。それはたった2つです。1つはノード用、もう1つは用語用です。このソリューションは非常に安定しており、非標準のビューリストに使用しています。
kalabro

私の誤解。各グループのビューを作成する必要があると思いました。
ナイジェルウォーターズ

これは私のユースケースにほぼ最適です。私の唯一の問題は、子ビューの「詳細」リンク、同じビューへのリンク、および限られた数の要素のみを表示することです!親ビューのタイトルは、必要に応じて機能する分類法にリンクしています。
マーク14

Ahah-最初のn個のアイテムだけが表示され、リンクが追加された子ビューのブロック表示を作成しました。詳細リンクはページ表示に移動し、すべてのアイテムをページャーで表示します。すごい!唯一の問題はヘッダー(マスタービュー)の分類用語へのリンクですが、リンクを解除するか、子ビューのページ表示を同じURLに変更できます。
マーク14

7

さらに調査すると、Peek Summaryはまさにあなたが望むものであるように思われます。ドキュメントのスクリーンショットはDrupal 6用であり、Drupal 7では若干異なるため、更新されたスクリーンショットを添付しました。

  • 「コンテキストフィルター」から「ピークサマリー」を選択します>「フィルター値がURLにない場合」>「サマリーを表示」>「フォーマット」

「コンテキストフィルター」から「ピークサマリー」を選択します>「フィルター値がURLにない場合」>「サマリーを表示」>「フォーマット」

  • サブビューのビューが表示されます。制限するグループのページャーの横にある歯車をクリックします。

ページャー設定アイコンをクリック

  • ページャーオプションに表示する最大アイテムを入力します。

ページャーオプションの下の最初のフィールド

制限するグループごとにページャーを編集する必要がありますが、これは残念です。1つのグループのポケットベルを編集すると、すべてのグループの設定が変更されます。グループの総数とは異なるグループごとのノードの数を表示したい場合は、「コンテキストフィルター」の下の「フォーマット」設定(紫色の最初のスクリーンショット)でそれをオーバーライドします。

基本的に[n]グループの[n]ビューを作成するというデメリットがあります。これは、使用するグループの数によってはパフォーマンスの問題になる可能性がありますが、クエリは表示するセットのみに制限されます。ユースケースによっては、これによりパフォーマンスが向上する場合があります。いつものように、責任を持ってキャッシュしてください。


ページャーはグループごとにオーバーライドできないようです。グループ内のページャーで編集を押すと、マスターページャー設定が表示されます。私が何かを逃していない限り?
ナイジェルウォーターズ

ああ、そうだね。さて、それは完璧です。それらをすべて一度に制限できます。
ベス

残念ながら、それはポケットベルが表示されるグループの数にも影響することを意味します。私の元の投稿は誤解を招くと思われます。例では、それぞれ3つの投稿を持つ3つの用語しか示していません。1ページに用語ごとに3つの投稿がある10個以上の用語を表示する必要があります。近い:(
ナイジェルウォーターズ

「表示するアイテムを上書きする」が何もしないのは間違っていました。これを使用して、表示するグループの数を決定します。「0」を入力すると、グループが無限になります。
ベス

2

コードでこれを制限する方法は、次のようなものをカスタムモジュールに追加することです。

function custom_views_pre_render(&$view) {
  //get the rows from the view just before render
  $results = $view->result;
  //create a counter
  $count = '';
  //we're going to built up a new $result array
  $new_results = array();
  //iterate through each view row
  foreach($results as $result) {
    //find the taxonomy term
    $term = $result->taxonomy_term_data_name;
    //add the term to a string of all the terms we've seen so far
    $count .= $term;
    //make sure to separate them with spaces to make them easier to count
    $count .= ' ' ;
    //count how many rows have the same term as the current one
    $term_count = array_count_values(str_word_count($count, 1));

    if($term_count[$term] <= 3){
      //if this is the third or fewer row with this term, add it to the new result array
      $new_results[] = $result;
    }
  }
  //instead of the normal view output, only show the results we put in our array.
  $view->result = $new_results;
}

これは、関係を介してノードに接続されている分類用語のビュー用です。ノードのビューだけがある場合、走行距離は異なる場合があります。

用語ごとに3つ以上の表示はできませんが、これはクエリが各用語のすべての結果を返すことを妨げないため、SQLのパフォーマンスはまったく向上しません。用語ごとに非常に多くの結果がある場合、CTools Page Managerのようなものを使用して、個別のビューパネル表示を作成し、それらをすべて1つの領域に配置して、巨大なクエリを実行しないようにします。

いつものように、実稼働環境でこのようなものをキャッシュしたいと思うでしょう。


2
私の性別についてコメントする必要はありません。それは非常に有害です。t.co/i1dKE8hQ t.co/ATfV3mBGとにかく、Hook_views_pre_build()またはhook_build_pre_execute()パフォーマンスヒットを減らすこのようなものに使用できるかもしれませんが、私はそれらに精通していません。または、前にこの質問に対する私の答えが好きかもしれません。
ベス

更新:「1つのクエリで各グループを個別に制限することはできません。レンダリング段階で行う必要があります。SQLはそれを行うことができません。」また、「できることは一連のユニオンクエリである」と述べましたが、ビューもそれができるとは考えていません。
ベス

ああ、私はあなたをOPと間違えました。いずれにせよ、Peek Summaryモジュールはこの場合に役立つかもしれませんが、それ自体のパフォーマンスの問題を提示します。その作成者は、それは「一種の大げさだが、一種のクール」だと警告している。
ベス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.