Wie binde ich eine Ansicht in einen bestimmten Knoten ein?


13

Ich versuche, eine Ansicht in einen bestimmten Knoten einzubetten. Ich habe Tutorials dafür mit Drupal 7 und PHP-Templates gefunden:

<?php print views_embed_view('view_name'); ?>

Aber ich suche in Drupal 8 einen Weg mit Zweig-Templates. Ich habe versucht, die views_embed_view()Funktion in aufzurufen hook_node_view()und sie dem Knoten zuzuweisen, damit ich sie im Zweig-Template ausdrucken kann. Aber es scheint, dass dieser Haken nie aufgerufen wird.

Irgendwelche Tipps / Lösungen, wie man das mit Drupal 8 macht?

Antworten:


19

Twig Views Einbetten

Dieses Modul ermöglicht das Einbetten von Ansichten mit einer Zweigfunktion.

{{ views_embed_view('view_name', 'view_id') }}

Das obige Modul wurde zugunsten von abgeschrieben

Twig Tweak

Das Twig Tweak-Modul bietet eine Twig-Erweiterung mit einigen nützlichen Funktionen und Filtern, die das Entwicklererlebnis verbessern können.

Ex: <dd>{{ drupal_view('view_name', 'view_machine_name') }}</dd>

Die findest du view_machine_name hier


@TiMESPLiNTER gibt Ihnen nur einen Kopf nach oben.
Kein Sssweat

Seit wann? Ausführung?
Vishal Kumar Sahu

1
@VishalKumarSahu seit meine Antwort gepostet wurde, 18. März 16. Ich denke, das Modul funktioniert immer noch, es wird nur nicht mehr gewartet oder weiterentwickelt.
Kein Sssweat

Absolut perfekt. Es funktioniert super und ich habe gute Erfahrungen damit. Vielen Dank
Vishal Kumar Sahu

Twig Tweak! Gutes Modul
Harish ST

5

So hat es bei mir im Drupal 8 Beta 12-Unterthema von Classy funktioniert.

In der Datei your_theme.info.theme

function stjameskidsclub_preprocess_node(&$variables){
  $stuff  = views_embed_view('policy_documents', 'embed_1', 28);
  $variables["my_view"] = \Drupal::service('renderer')->renderRoot($stuff);
}  

Ich habe die node.html.twig kopiert und die Artikel-Tags (oder den Bereich, den Sie ersetzen möchten) mit einem Zweigblock umgeben. Ich habe dies im Ordner / template / content abgelegt.

{% block replace_area %}
  <article{{ attributes.addClass(classes) }}>

    ...

  </article>  
{% endblock replace_area %}

Dann habe ich einen Knoten - 2.html.twig (ersetze 2 durch den gewünschten Knoten) im Ordner / template / content mit dem folgenden Code erstellt.

{% extends "node.html.twig" %}

{% block replace_page %}
  {{ my_view }}
{% endblock %}

4

Das erste Problem, mit dem Sie zu kämpfen haben, besteht darin, dass gerenderte Entitäten wie Knoten jetzt standardmäßig zwischengespeichert werden, sodass hook_node_view () nur einmal aufgerufen wird, nachdem der Cache dieses Knotens geleert / gespeichert wurde.

Dies ist jedoch ziemlich einfach zu deaktivieren, siehe settings.local.php.

Dann ist die Ausgabe einer Ansicht in $ build ziemlich einfach und funktioniert mehr oder weniger wie in 7.x. Verwenden Sie statt der Einbettungsfunktion $ views = Views :: getView () und dann $ views-> buildRenderable ().

Zwei Tipps:

  • Stellen Sie den für $ build verwendeten Schlüssel als zusätzliches Feld in hook_entity_extra_field_info () zur Verfügung und überprüfen Sie, ob die Komponente aktiviert ist (siehe dazu user_user_view ()) . Auf diese Weise können Sie die Gewichtung / Platzierung der Ansicht in konfigurieren Benutzeroberfläche und verstecken es auch in bestimmten Ansichtsmodi.
  • Wenn Ihre Ansicht eine Seite enthält, ist dies etwas komplizierter, da die Knotenausgabe zwischengespeichert wird. Sie müssen den Cache-Schlüssel dann auf den Pager aufmerksam machen, siehe comment_entity_build_defaults_alter () für ein Beispiel (keine Ansicht, aber das ist das nächste Beispiel, das der Core hat).

Zunächst einmal vielen Dank für diese tolle Antwort. Nun, ich habe das "aktiviert" settings.local.phpund alle Caches gelöscht. Aber mein Hook- themename_node_view()In wird themename.themeimmer noch nicht angerufen. Haben Sie eine Idee, warum dies der Fall sein könnte?
TiMESPLiNTER

1
In settings.php gibt es ein Snippet, das du (am Ende) auskommentieren musst. Um sicherzustellen, dass settings.local.php geladen ist, fügen Sie ungültiges PHP hinzu, das zu einem schwerwiegenden Fehler führt. Wenn Ihre Site nicht fehlschlägt, wird die Datei nicht geladen.
Berdir

2

Da Berdir auf View-> buildRenderable anspielt, suchen Sie nach etwas mehr Kontext in einem Modul.

//use core libraries
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;

//use views class
use \Drupal\views\Views;

function hook_node_view(&$build, $node, $display, $view_mode){

 $thisView = Views::getView('view_name');

 $build['arbitrary_render_array_key_here'] = $thisView->buildRenderable('block_1',array($your_arguments));

}

Dann können Sie in Ihrer Seitenvorlage mit darauf zugreifen

{{ page.content.theme_name_content }}

1
All dies war ein einziger Liner in Drupal 7. Interessant.
WM

0

Innerhalb von Ansichten können Sie einen Block mit Ihren relevanten Daten erstellen.

Nach der Blockerstellung können Sie den Block so zuweisen, dass er in Ihrem gewünschten Inhaltsbereich (Fußzeile / Kopfzeile / Inhalt / usw.) angezeigt wird. Weisen Sie es zu und klicken Sie dann auf "Konfigurieren". Sie sollten in der Lage sein, "Block auf bestimmten Seiten anzeigen". Wenn Sie "Nur die aufgelisteten Seiten" auswählen und der Seitenspezifikation / node / your-node-number hinzufügen, sollte diese Ansicht / dieser Block nur mit dem gewünschten Knoten angezeigt werden.

Prost!


Danke für deine Antwort :-). Dann muss ich aber für jeden Fall einen Inhaltsbereich anlegen. Also wenn ich erst text haben will, dann die ansicht und dann nochmal text. Oder wenn ich erst Text und dann die Ansicht haben möchte oder erst die Ansicht und dann Text. Dann muss ich 3 verschiedene Inhaltsbereiche erstellen, die ich in den spezifischen Knotentemapltes rendere. Aber der views_embed_view()Ansatz ist viel einfacher und sauberer, denke ich.
TiMESPLiNTER

0

Ich weiß, dass Sie erwähnen, dass Sie Zweigvorlagen verwenden möchten, aber Sie können das Modul " Ansichten - Referenzfeld" verwenden , um zu vermeiden, dass Sie in Vorlagen herumwühlen müssen. Es bietet außerdem den Vorteil, dass es zu jeder feldfähigen Entität hinzugefügt werden kann, sodass Inhaltseditoren die Ansicht / Ausgabe konfigurieren können.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.