web-dev-qa-db-fra.com

Comment rendre deux vues dans le même modèle twig

Je veux rendre deux vues dans le même modèle twig, mais une seule d'entre elles est rendue, et la seconde est toujours prioritaire avec le même contenu que la première.
J'ai un type de contenu "contacts" et lorsque ses nœuds sont affichés (vue complète), je veux rendre deux vues sur la même page après les champs du nœud. J'utilise un nœud de modèle twig - contacts.html.twig:

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

Et ma function my_theme_preprocess_node(&$variables) dans mon fichier .theme:

....  
$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();
.....

Comme je l'ai dit, la deuxième vue montre toujours le même contenu que la première. Si j'inverse l'ordre de rendu, le contenu est également inversé, et celui qui est rendu en premier est le seul que je vois, et toujours deux fois. C'est comme {{ viewCalls }} Et {{ viewAppointments }} Ont toujours le même contenu.

6
briast

La raison pour laquelle vous obtenez le même contenu est due à la propriété #cache Du tableau de rendu que vous obtenez lorsque vous appelez la méthode render().

Plus précisément, en appelant setOffset() plus tôt dans votre code, vous définissez implicitement une clé de cache sur le tableau de rendu, (voir ici ):

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

Ce paramètre de clé de cache, en combinaison avec la propriété #theme Du tableau de rendu (views_view), Qui est la même pour les deux vues, se traduira par l'obtention d'une version en cache de la première lors de l'inclusion le second, car la combinaison [#theme] + [#cache] [touches] est identique pour les deux vues.

Pour contourner ce problème, vous pouvez:

  1. Supprimez complètement la mise en cache pour ces vues, ou
  2. Évitez d'utiliser setOffset(), ou
  3. Ajoutez des clés plus spécifiques au cache afin d'avoir un cache différent pour chaque vue. Par exemple.

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

J'ai testé votre cas en utilisant l'option 3. et cela a fonctionné comme prévu, je pense qu'avant de passer à l'utilisation d'un autre module, vous pouvez essayer de vous en tenir à votre code d'origine et de modifier de manière appropriée la propriété #cache Des deux tableaux de rendu.

Bonne chance!

10
Stefanos Petrakis

Rendre deux vues dans le même modèle Twig avec l'élément de rendu 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

Il y a au moins une faute de frappe dans votre code. Supprimez l'espace dans $variables['viewAppointments '].


Alternativement, vous pouvez également utiliser Twig Tweak . Ce qui vous fournira une fonction que vous pouvez utiliser pour placer des vues directement dans vos modèles.

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

Twig Tweak est un petit module qui fournit une extension Twig avec quelques fonctions et filtres utiles qui peuvent améliorer l'expérience de développement.

Lisez le guide complet sur Twig Tweak and Views .

La méthode drupal_view() de Twig Tweak permet d'accéder aux vues intégrées dans n'importe quel code Twig, y compris de manière dynamique à partir de chaque ligne d'une autre vue. Cette fonctionnalité fournit une autre méthode pour effectuer l'imbrication fournie par le module Vue du champ Vues .

3
leymannx