web-dev-qa-db-ja.com

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

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

例えば.

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

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

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

13
Nigel Waters

ノードが1つだけ必要な場合は、「代理ノード」関係を使用できます。ただし、各用語に3つのノードが必要な場合は、 Views Field View のようなものを使用します。

1)コンテンツの「子」ビューを作成します。このようなもの: enter image description here

分類用語の引数、ポケットベルの制限、並べ替えなどを追加します。 enter image description here

これで、このビューを別のビューにアタッチできます。

2)分類ビューを作成します。 enter image description here

非表示の用語IDフィールドを追加してから、「グローバル:ビュー」フィールドを追加します。 enter image description here

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

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

9
kalabro

さらに調査すると、 Peek Summary のように思われるかもしれません。ドキュメントのスクリーンショットはDrupal 6のものであり、Drupal 7とは少し異なるため、更新されたスクリーンショットをいくつか添付しました。

  • [コンテキストフィルター]> [フィルター値がURLにない場合]> [概要を表示]> [形式]から[概要を確認]を選択します

Choose Peek Summary from 'Contextual Filters' > 'When the filter value is not in the URL' > 'Display a summary' > 'Format'

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

Click pager preferences icon

  • ページャーオプションに表示する最大項目を入力します。

First field under Pager Options

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

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

7
beth

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

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
beth