Wie zeige ich in einer Ansicht nur 3 der neuesten Beiträge für jeden Begriff an?

14

Mit Hilfe einer anderen Frage: Neueste Knoten für jeden Taxonomiebegriff in Ansichten anzeigen Ich konnte die von mir benötigte Ansicht erstellen, mit der Ausnahme, dass alle Beiträge für jeden Begriff angezeigt werden (gruppiert nach Begriffen). Wie beschränke ich die Anzeige der letzten 3 Einträge in den einzelnen Begriffen?

z.B

Term 1
- Post 1
- Post 2
- Post 3

Term 2
- Post 1
- Post 2
- Post 3

Term 3
- Beitrag 1
- Beitrag 2
- Beitrag 3

Nigel Waters
quelle

Antworten:

9

Wenn Sie nur einen Knoten benötigen, können Sie die Beziehung "Repräsentativer Knoten" verwenden. Wenn Sie jedoch drei Knoten pro Term benötigen, verwenden Sie eine Ansicht wie die Ansicht "Ansichten" .

1) Erstellen Sie eine "untergeordnete" Ansicht für den Inhalt. Etwas wie das: Bildbeschreibung hier eingeben

Fügen Sie Taxonomiebegriffsargumente, Pager-Limits, Sortierungen usw. hinzu: Bildbeschreibung hier eingeben

Jetzt können Sie diese Ansicht an eine andere anhängen.

2) Taxonomieansicht erstellen: Bildbeschreibung hier eingeben

Fügen Sie das ID-Feld für versteckte Begriffe hinzu und fügen Sie dann das Feld "Global: View" hinzu: Bildbeschreibung hier eingeben

Vergessen Sie nicht, das Caching zu konfigurieren. Von Ansichten Field View Seite:

Es wird dringend empfohlen, dieses Modul in Verbindung mit dem Caching von Ansichten zu verwenden. Ansichten Inhaltscache und Cache-Aktionen sind gute Möglichkeiten zum Zwischenspeichern von Ansichten.

kalabro
quelle
Vielen Dank, Kalabro. Ihr Ansatz ist auch richtig. Ich war ursprünglich auf diesem Weg, wollte aber herausfinden, ob es einen besseren Weg gibt, als eine Menge Ansichten zu erstellen, und dann Ansicht für Ansicht einbetten.
Nigel Waters
2
Das ist keine Tonne, @NigelWaters. Das sind nur zwei: einer für Knoten und einer für Terme. Diese Lösung ist ziemlich stabil und ich verwende sie für nicht standardmäßige Ansichtslisten.
Kalabro
Mein Missverständnis. Ich dachte, ich müsste eine Ansicht für jede Gruppe erstellen.
Nigel Waters
Dies ist fast perfekt für meinen Anwendungsfall. Mein einziges Problem ist der Link "more" für eine untergeordnete Ansicht, der auf dieselbe Ansicht verweist und nur die begrenzte Anzahl von Elementen anzeigt! Die Titel der übergeordneten Ansicht verweisen auf die Taxonomie, die wie gewünscht funktioniert.
Mark
Ahah - Ich habe eine Blockanzeige für meine untergeordnete Ansicht erstellt, in der nur die ersten n Elemente und ein weiterer Link angezeigt werden. Je mehr Links zur Seitenanzeige navigieren, desto mehr Elemente werden mit einem Pager angezeigt. Groß! Jetzt ist das einzige Problem, dass die Kopfzeile (in der Hauptansicht) mit dem Taxonomiebegriff verknüpft ist, aber ich kann entweder die Verknüpfung aufheben oder die Seitenanzeige der untergeordneten Ansicht auf dieselbe URL ändern.
Mark
7

Nach weiteren Untersuchungen scheint Peek Summary genau das zu sein, was Sie wollen. Die Screenshots in der Dokumentation beziehen sich auf Drupal 6 und unterscheiden sich geringfügig von Drupal 7. Daher habe ich einige aktualisierte Screenshots angehängt.

  • Wählen Sie unter "Kontextfilter"> "Wenn der Filterwert nicht in der URL enthalten ist"> "Zusammenfassung anzeigen"> "Format" die Option "Zusammenfassung anzeigen".

Wählen Sie unter "Kontextfilter"> "Wenn der Filterwert nicht in der URL enthalten ist"> "Zusammenfassung anzeigen"> "Format" die Option "Zusammenfassung anzeigen".

  • Sie sehen eine Ansicht von Unteransichten. Klicken Sie auf das Zahnrad neben dem Pager für die Gruppe, die Sie einschränken möchten.

Klicken Sie auf das Pager-Voreinstellungssymbol

  • Geben Sie die Höchstzahl der Elemente ein, die in den Pageroptionen angezeigt werden sollen.

Erstes Feld unter Pager-Optionen

Sie müssen den Pager für jede Gruppe, die Sie einschränken möchten, bearbeiten, was unglücklich ist.Wenn Sie den Pager für eine Gruppe bearbeiten, werden die Einstellungen für alle Gruppen geändert. Wenn Sie eine andere Anzahl von Knoten pro Gruppe als die Gesamtzahl der Gruppen anzeigen möchten, überschreiben Sie diese in den Einstellungen unter "Kontextfilter" (auf dem ersten Screenshot in Lila).

Dies hat den Nachteil, dass im Wesentlichen [n] Ansichten für [n] Gruppierungen erstellt werden. Dies kann je nach Anzahl der Gruppierungen zu Performanceproblemen führen, beschränkt die Abfrage jedoch nur auf die anzuzeigende Anzahl. Dies kann je nach Anwendungsfall zu einer Leistungsverbesserung führen. Cache wie immer verantwortungsbewusst.

Beth
quelle
Es scheint, dass ein Pager nicht pro Gruppe überschrieben werden kann. Wenn Sie auf einem Pager in einer Gruppe auf Bearbeiten klicken, werden die Master-Pager-Einstellungen aufgerufen. Es sei denn, ich vermisse etwas?
Nigel Waters
Ah, richtig du bist. Das ist dann perfekt. Sie können alle auf einmal begrenzen.
Beth
Das bedeutet leider, dass der Pager auch die Anzahl der angezeigten Gruppen beeinflusst. Ich nehme an, mein ursprünglicher Beitrag ist irreführend, da das Beispiel nur drei Begriffe mit jeweils drei Beiträgen zeigt. Ich muss 10 oder mehr Begriffe mit 3 Beiträgen pro Begriff auf einer einzelnen Seite anzeigen. So nah :(
Nigel Waters
Ich habe mich geirrt, weil die Funktion "Anzuzeigende Elemente überschreiben" nichts bewirkt hat. Hiermit bestimmen Sie, wie viele Gruppen angezeigt werden sollen. Wenn Sie '0' eingeben, erhalten Sie unendlich viele Gruppen.
Beth
2

Eine Möglichkeit, dies im Code einzuschränken, besteht darin, einem benutzerdefinierten Modul Folgendes hinzuzufügen:

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;
}

Dies ist eine Ansicht der Taxonomiebegriffe, die über eine Beziehung mit Knoten verbunden sind. Wenn Sie nur eine Ansicht der Knoten haben, kann Ihr Kilometerstand variieren.

Dadurch wird zwar die Anzeige von mehr als 3 pro Begriff verhindert, die Abfrage kann jedoch nicht alle Ergebnisse für jeden Begriff zurückgeben, sodass die SQL-Leistung überhaupt nicht verbessert wird. Wenn Sie für jeden Begriff eine sehr große Anzahl von Ergebnissen haben, können Sie mithilfe von CTools Page Manager separate Anzeigefenster erstellen und alle Ergebnisse in einer Region zusammenfassen, damit keine großen Abfragen ausgeführt werden.

Wie immer werden Sie dieses Zeug in der Produktion zwischenspeichern wollen.

Beth
quelle
2
Es gibt wirklich keinen Grund, mein Geschlecht zu kommentieren. Es ist ziemlich schädlich. t.co/i1dKE8hQ t.co/ATfV3mBG Egal , Hook_views_pre_build()oder hook_build_pre_execute()könnte für so etwas verwendet werden, das die Leistung beeinträchtigt , aber ich kenne mich damit nicht so gut aus. Oder Sie möchten vielleicht meine Antwort auf diese Frage zuvor .
Beth
Update: Ich habe die Autorität (Crell und Stevector), dass "Sie nicht jede Gruppe einzeln in einer einzelnen Abfrage einschränken können. Sie müssen es in der Rendering-Phase tun. SQL kann das leider nicht." Sie sagten auch "Das Beste, was Sie tun können, ist eine Reihe von Gewerkschaftsabfragen", aber sie glauben auch nicht, dass Views dies kann.
Beth
Ah, ich habe Sie für das OP gehalten. In jedem Fall kann das Peek Summary- Modul in diesem Fall hilfreich sein, obwohl es eigene Leistungsprobleme aufweist. Sein Schöpfer warnt, dass es "irgendwie ekelhaft, aber irgendwie cool" ist.
Beth