it-swarm.com.de

So rendern Sie zwei Ansichten in derselben Vorlage twig Vorlage)

Ich möchte zwei Ansichten in derselben Vorlage rendern twig Vorlage, aber nur eine davon wird gerendert, und die zweite wird immer mit demselben Inhalt wie die erste überschrieben.
Ich habe einen Inhaltstyp 'Kontakte' und wenn seine Knoten angezeigt werden (Vollansicht), möchte ich zwei Ansichten auf derselben Seite nach den Knotenfeldern rendern. Ich benutze einen twig Vorlagenknoten - contacts.html.twig:

.....  node fields twig template .... 
{{ viewCalls }}  
....  
{{ viewAppointments }}  
....

Und meine function my_theme_preprocess_node(&$variables) in meiner .theme-Datei:

....  
$view = \Drupal\views\Views::getView('view_calls');
$view->setDisplay('default');
$view->setArguments(array($variables['node']->id()));
$view->setOffset(0);
$view->execute();
$variables['viewCalls'] = $view->render();

$view2 = \Drupal\views\Views::getView('view_appointments');
$view2->setDisplay('default');
$view2->setArguments(array($variables['node']->id()));
$view2->setOffset(0);
$view2->execute();
$variables['viewAppointments'] = $view2->render();
.....

Wie gesagt, die zweite Ansicht zeigt immer den gleichen Inhalt wie die erste. Wenn ich die Reihenfolge des Renderns umkehre, ist auch der Inhalt umgekehrt, und derjenige, der zuerst gerendert wird, ist der einzige, den ich sehe, und immer zweimal. Es ist so, dass {{ viewCalls }} Und {{ viewAppointments }} Immer den gleichen Inhalt erhalten.

6
briast

Der Grund, warum Sie denselben Inhalt erhalten, liegt in der Eigenschaft #cache Des Render-Arrays, die Sie beim Aufrufen der Methode render() erhalten.

Insbesondere setzen Sie durch Aufrufen von setOffset() früher in Ihrem Code implizit einen Cache-Schlüssel für das Render-Array (siehe hier ):

$this->element['#cache']['keys'][] = 'offset:' . $offset;

Diese Cache-Schlüsseleinstellung in Kombination mit der Eigenschaft #theme Des Render-Arrays (views_view), Die für beide Ansichten gleich ist, führt beim Einschließen zu einer zwischengespeicherten Version der ersten die zweite, da die Kombination [#theme] + [#cache] [Schlüssel] für beide Ansichten identisch ist.

Um das zu umgehen, könnten Sie:

  1. Entfernen Sie das Caching für diese Ansichten vollständig, oder
  2. Vermeiden Sie die Verwendung von setOffset() oder
  3. Fügen Sie dem Cache spezifischere Schlüssel hinzu, sodass Sie für jede Ansicht einen anderen Cache haben. Z.B.

    $variables['viewCalls']['#cache']['keys'] = 
      array_merge(
        $variables['viewCalls']['#cache']['keys'], 
        array('viewCalls')
      );
    ...
    $variables['viewAppointments']['#cache']['keys'] = 
      array_merge(
        $variables['viewAppointments']['#cache']['keys'],
        array('viewAppointments')
      );
    

Ich habe Ihren Fall mit der Option 3. getestet und es hat wie erwartet funktioniert. Bevor Sie sich für die Verwendung eines anderen Moduls entschieden haben, können Sie versuchen, an Ihrem ursprünglichen Code festzuhalten und die Eigenschaft #cache Beide Render-Arrays entsprechend zu ändern.

Viel Glück!

10

Rendern Sie zwei Ansichten in derselben Vorlage Twig Vorlage mit dem Renderelement view:

$variables['viewCalls'] = [
  '#type' => 'view',
  '#name' => 'view_calls',
  '#display_id' => 'default',
  '#arguments' => [$variables['node']->id()],
];

$variables['viewAppointments'] = [
  '#type' => 'view',
  '#name' => 'view_appointments',
  '#display_id' => 'default',
  '#arguments' => [$variables['node']->id()],
];
4
user89751

Ihr Code enthält mindestens einen Tippfehler. Entfernen Sie das Leerzeichen in $variables['viewAppointments '].


Alternativ können Sie auch Twig Tweak verwenden. Damit erhalten Sie eine Funktion, mit der Sie Ansichten direkt in Ihre Vorlagen einfügen können.

{{ drupal_view('who_s_new', 'block_1', arg_1, arg_2, arg_3) }}`

Twig Tweak ist ein kleines Modul, das eine Twig -Erweiterung mit einigen nützlichen Funktionen und Filtern bietet, die die Entwicklungserfahrung verbessern können.

Lesen Sie die vollständige Anleitung zu Twig Tweak and Views .

Die drupal_view() - Methode von Twig Tweak bietet Zugriff auf das Einbetten von Ansichten in einen beliebigen Twig - Code, auch dynamisch aus jeder Zeile einer anderen Ansicht. Diese Funktion bietet eine alternative Methode zum Durchführen der bereitgestellten Verschachtelung durch das Modul Ansichten Feldansicht .

3
leymannx