Blenden Sie eine Ansicht aus, wenn weniger als N Ergebnisse erzielt werden

6

Ich frage mich, ob es möglich ist, eine Ansicht (als Blockansicht) auszublenden, wenn sie weniger als X Ergebnisse hat.

Disko
quelle

Antworten:

1

Es dauert ein bisschen, um die Ansichten Haken zu lernen. Kennen Sie das Anzeigen von Vorlagendateien? Wenn dies schnell und unkompliziert möglich ist, müssen Sie überprüfen, wie viele Zeilen in der Ansichtsvorlagendatei der höchsten Ebene die Anzeigeausgabe enthalten. Wenn Sie das Devel-Modul installiert haben, können Sie es dpm($variables)in views-view.tpl.php verwenden (wahrscheinlich möchten Sie die für Ihre Ansicht eindeutige Anzeigeausgabe verwenden).
Ich kann mich nicht erinnern, wo, aber irgendwo in $variablesist eine Zeilenanzahl; Sie können der Vorlagendatei die Logik hinzufügen, um sie nicht auszudrucken, $rowswenn sie Ihren Kriterien nicht entspricht.

Jepedo
quelle
1
Es wird davon abgeraten, diese Art von Logik in die Vorlagendatei einzufügen. @ googletorps Vorschlag, einen Vorprozess zu verwenden, ist besser.
tim.plunkett
Hast du den Teil verpasst, den ich über schnell und schmutzig gesagt habe? Dirty unterstellt, dass dies keine bewährte Methode ist.
Jepedo
8

Basierend auf dem Hinweis, den googletorp gegeben hat, besteht meine einfache Lösung darin, dies in meine template.php einzufügen:

function MY_THEME_NAME_preprocess_views_view(&$vars) {
  if ($vars['display_id'] == 'MY_DISPLAY_ID' && count($vars['view']->result) < 2) {
    $vars['view']->result = NULL;
  }
}

In diesem Fall verstecke ich die Ansicht, wenn sie weniger als zwei Ergebnisse hat.

Vielen Dank!

Yan
quelle
2
Wenn Sie diesen Code verwenden, stellen Sie zunächst sicher, dass MY_DISPLAY_ID für die gesamte Site eindeutig ist (Sie können ihn in der Ansicht unter Andere - Computername bearbeiten). Oft ist es etwas sehr Allgemeines wie "Block", weil es nur innerhalb einer Ansicht eindeutig sein muss.
Yuri
8

Sie können in einer Vorlagenvorverarbeitungsfunktion leicht die Anzahl der Ergebnisse (Zeilen) einer Ansicht erkennen und die Ausgabe auf eine leere Zeichenfolge setzen, wenn dies der Fall ist.

Damit dies funktioniert, müssen Sie möglicherweise ein wenig in der Vorlage arbeiten, da Views immer umhüllendes HTML hinzufügt, das Sie wahrscheinlich nicht möchten, wenn die Ansicht leer ist.

Ich würde wahrscheinlich am einfachsten in der Vorverarbeitungsfunktion template_preprocess_views_view () tun . Sie können die Ansichtsoberfläche konsultieren, um Hinweise zu Vorlagen zu erhalten.

googletorp
quelle
Ich verstehe das überhaupt nicht. Wenn Sie ohnehin in einer tpl.php-Datei arbeiten müssen, um sicherzustellen, dass der gesamte Wrapper-HTML-Code entfernt wird, wozu sollten Sie dann auch die Datei template.php ändern? Es scheint nur so, als würden Sie zusätzliche Arbeit schaffen.
Lester Peabody
1
@LesterPeabody Best Practice besteht darin, Logik in den Vorprozess einzufügen und nur das Markup in der Vorlage zu verarbeiten. Macht Ihren Code wartbarer.
googletorp
Es gibt überall Logik in Ansichtsvorlagendateien ... Vielleicht könnten Sie ein Beispiel liefern? Zum Beispiel habe ich einfach eine Instanz der views-view.tpl.phpDatei mit <?php if ($rows): ?> ... <?php endif; ?>. My understanding currently is there is no way to eliminate the extraneous wrapper HTML otherwise. If the einer Variablen umgeben, die mir in dieser Datei bereits zur Verfügung steht. Warum sollte ich zusätzliche Arbeit leisten template.php?
Lester Peabody
@LesterPeabody Generisch: Es ist üblich, vor dem Rendern herauszufinden, ob etwas vorhanden ist. Eine spezielle Logik für eine bestimmte Ansicht gehört jedoch nicht in eine Vorlagendatei. Es ist schwieriger zu warten, und wenn Sie komplexe Websites erstellen, die Sie warten müssen, wird dies offensichtlicher.
Googletorp
1

Wenn der Grund dafür hauptsächlich auf die Anzeige ausgerichtet ist (z. B. wenn Sie ein Raster erstellen und eine gerade / ungerade Anzahl von Elementen erzwingen möchten), ist das Hinzufügen einer benutzerdefinierten Logik auf der Themenebene sicherlich die logischste. Die anderen Antworten haben dies abgedeckt, denke ich. Wir haben jedoch festgestellt, dass einige Ansichtsvariablen, die möglicherweise geändert werden müssen (z. B. $view->result = NULL), im Rahmen einer Vorverarbeitungsfunktion nicht sicher geändert werden können. Es scheint, dass das interne Caching von Ansichten einige Variablen so generieren kann, dass einige Kombinationen der Cache-Einstellungen für "gerenderte Ausgabe" und "Abfrageergebnis" mit keiner der vorhandenen Lösungen kompatibel sind.

Eine Alternative besteht darin, die Ergebnisse der ausgeführten Abfrage selbst zu ändern, was eine Kontrolle auf einer viel niedrigeren Ebene bietet. Dies kann auch einige Probleme beim Ausblenden von Wrapper-Markups umgehen, da eine "leere" Ergebnismenge simuliert wird, noch bevor das Markup erstellt wird.

/**
 * Implements hook_views_post_execute().
 */
function MYMODULE_views_post_execute(&$view) {
  $view_name = 'myviewname';
  $view_display = 'mydisplay';
  // Don't show the view if there is only one item.
  if ($view->name == $view_name && $view->current_display == $view_display && count($view->result) < 2) {
    $view->result = array();
  }
}

Dies kann natürlich nicht in einem Thema implementiert werden, da es nicht mit einem Thema oder einem Änderungshaken zusammenhängt, aber ich denke, es ist immer noch erwähnenswert für Leute, die sich für diese Frage interessieren.

rjacobs
quelle
0

In einigen Fällen ist es besser, diese Art von Bedingung in die Ansicht aufzunehmen, damit der Builder versteht, was im Kontext der Bearbeitungsansicht geschieht, nicht in einem anderen Modul oder Themen-Hook.

Wenn Sie diese Logik lieber auf der Seite zum Bearbeiten der Ansicht haben möchten, können Sie Folgendes tun:

  1. Fügen Sie ein globales Text- / HTML-Fußzeilenfeld hinzu und legen Sie den Textformat-PHP-Code fest
  2. Stellen Sie den Administratornamen dieses Felds auf einen sehr klaren Wert ein, z. B. "Diese Ansicht ausblenden, wenn weniger als 5 Ergebnisse vorliegen", damit zukünftige Site-Builder nicht verwirrt werden (warum verschwindet meine Ansicht!?!?)
  3. Ändern Sie den folgenden PHP-Code entsprechend Ihren Anforderungen und verwenden Sie ihn vor Ort:
<?php
$view = views_get_current_view();
if ( count($view->result) < 5 ) {
    $view->result = null;
}
?>
Roger Roger
quelle
Hmmmm. Das hört sich so an, als würde es funktionieren, aber das Hinzufügen von PHP-Code zur Datenbank ist normalerweise nicht wünschenswert, wenn es eine andere Möglichkeit gibt.
Squarecandy
Stimmen Sie mit Ihnen @squarecandy überein und bieten Sie nur als mögliche Alternative für bestimmte Fälle an.
RogerRoger
0

Sie können dies auch mithilfe der Themenvorlage tun:

  • Kopieren Sie views-view.phpin Ihr Themen- / Vorlagenverzeichnis
  • Machen Sie eine Kopie dieser Datei und benennen Sie sie views-view--view-name--display-name.tpl.php
  • (Weitere Informationen zum Auswählen und Überschreiben von Dateinamen finden Sie unter Erweitert> Andere> Thema: Informationen. Je nach Bedarf können Sie mehr oder weniger spezifische Informationen erhalten.)
  • Fügen Sie if (count($rows) < $n):Ihrem Code hinzu, um ihn basierend auf der Anzahl der Ergebnisse nach Bedarf zu bearbeiten
squarecandy
quelle