web-dev-qa-db-fra.com

Comment intégrer une vue dans un nœud spécifique?

J'essaie d'incorporer une vue dans un nœud spécifique. J'ai trouvé des tutoriels pour le faire avec Drupal 7 et PHP-Templates:

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

Mais je cherche un moyen dans Drupal 8 avec des modèles de brindilles. J'ai essayé d'appeler la fonction views_embed_view() dans la hook_node_view() et de l'affecter à la pour que je puisse l'imprimer dans le modèle de brindille. Mais il semble que ce crochet ne soit jamais appelé.

Toutes les astuces/solutions comment faire cela de la manière Drupal 8?

13
TiMESPLiNTER

Twig Views Embed

Ce module permet d'intégrer des vues avec une fonction twig.

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

Le module ci-dessus a été amorti au profit de

Twig Tweak

Le module Twig Tweak fournit une extension Twig avec quelques fonctions et filtres utiles qui peuvent améliorer l'expérience du développeur.

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

Vous pouvez trouver le view_machine_nameici

19
No Sssweat

C'est ainsi que cela a fonctionné pour moi dans Drupal 8 beta 12 sous-thème de Classy.

Dans le fichier 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);
}  

J'ai copié le node.html.twig et entouré les balises d'article (ou la zone que vous souhaitez remplacer) avec un bloc twig. J'ai placé cela dans le dossier/template/content.

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

    ...

  </article>  
{% endblock replace_area %}

Ensuite, j'ai créé un nœud - 2.html.twig (remplacez 2 par le nœud souhaité) dans le dossier/template/content avec le code suivant.

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

{% block replace_page %}
  {{ my_view }}
{% endblock %}
5
George

Le premier problème avec lequel vous vous battez est que les entités rendues comme les nœuds sont désormais mises en cache par défaut, donc hook_node_view () n'est appelé qu'une seule fois après un effacement du cache/enregistrement de ce nœud.

Cependant, c'est assez facile à désactiver, voir settings.local.php.

Ensuite, mettre la sortie d'une vue dans $ build est assez facile et fonctionne plus ou moins comme dans 7.x. Au lieu d'utiliser la fonction incorporée, pensez à utiliser $ views = Views :: getView () puis $ views-> buildRenderable ()

Deux astuces:

  • Rendez la clé que vous utilisez pour $ build disponible en tant que champ supplémentaire dans hook_entity_extra_field_info () , puis vérifiez l'affichage si le composant est activé (voyez comment ser_user_view () fait cela. Cela vous permet de configurer le poids/placement de la vue dans l'interface utilisateur et également de la masquer sur certains modes de vue.
  • Si votre vue a une page, c'est un peu plus compliqué, car la sortie du nœud est mise en cache. Vous devez alors rendre la clé de cache consciente du pageur, voir comment_entity_build_defaults_alter () pour un exemple (pas une vue, mais c'est l'exemple le plus proche du noyau).
4
Berdir

Comme Berdir y a fait allusion View-> buildRenderable est ce que vous recherchez, mais pour donner un peu plus de contexte dans un module, vous devrez faire ce qui suit.

//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));

}

Ensuite, dans votre modèle de page, vous pouvez y accéder avec

{{ page.content.theme_name_content }}
2
ummdorian

Dans les vues, vous pouvez créer un bloc avec vos données pertinentes.

Après la création du bloc, vous pouvez attribuer le bloc à apparaître dans la zone de contenu souhaitée (pied de page/en-tête/contenu/etc.). Attribuez-le, puis cliquez sur "configurer". Vous devriez pouvoir "Afficher le bloc sur des pages spécifiques". La sélection de "Seulement les pages répertoriées" et l'ajout de/node/your-node-number à la spécification de page devrait limiter cette vue/bloc à n'apparaître qu'avec le nœud souhaité.

À votre santé!

0
Luke Rehmann

Je sais que vous mentionnez que vous souhaitez utiliser les modèles twig mais vous pouvez utiliser le module Views Reference Field pour éviter d'avoir à fouiller dans les modèles. Donne également l'avantage de pouvoir l'ajouter à n'importe quelle entité champable afin que les éditeurs de contenu puissent configurer la vue/sortie.

0
joekers