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

13

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 views_embed_view()fonction dans le hook_node_view()et de l'affecter au nœud afin de pouvoir 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 à la manière de Drupal 8?

TiMESPLiNTER
la source

Réponses:

19

Twig Views Embed

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

{{ 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 des développeurs.

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

Vous pouvez trouver view_machine_name ici

Pas de sueur
la source
@TiMESPLiNTER vous donne juste un avertissement.
Pas de Sssweat le
Depuis quand? Version?
Vishal Kumar Sahu
1
@VishalKumarSahu depuis que ma réponse a été publiée, le 18 mars 16. Je pense que le module fonctionne toujours, c'est juste qu'il n'est plus maintenu ou développé.
Pas de Sssweat
Parfaitement parfait. Cela fonctionne très bien et j'en ai une bonne expérience. Merci
Vishal Kumar Sahu
Twig Tweak! Bon module
Harish ST
5

C'est ainsi que cela a fonctionné pour moi dans le sous-thème Drupal 8 beta 12 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 de brindille. 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 %}
George
la source
4

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 user_user_view () fait cela. Cela vous permet de configurer le poids / placement de la vue dans le UI et également le masquer sur certains modes d'affichage.
  • 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 pager, voir comment_entity_build_defaults_alter () pour un exemple (pas une vue, mais c'est l'exemple le plus proche du noyau).
Berdir
la source
Tout d'abord merci pour cette excellente réponse. Eh bien, j'ai "activé" settings.local.phpet effacé tous les caches. Mais mon crochet themename_node_view()dans themename.themeencore se pas appelé. Avez-vous une idée pourquoi cela pourrait être le cas?
TiMESPLiNTER
1
Il y a un extrait dans settings.php que vous devez décommenter (à la fin). pour vous assurer que settings.local.php est chargé, ajoutez un PHP non valide qui entraîne une erreur fatale. si votre site n'échoue pas, le fichier n'est pas chargé.
Berdir
2

Comme Berdir a fait allusion à View-> buildRenderable, c'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 }}
ummdorian
la source
1
Tout cela était un seul paquebot dans Drupal 7. Intéressant.
WM
0

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 "Uniquement 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é!

Luke Rehmann
la source
Merci pour votre réponse :-). Mais je dois alors créer une zone de contenu pour chaque cas. Donc, si j'aime avoir le premier texte, puis la vue, puis à nouveau le texte. Ou si j'aime avoir d'abord le texte puis la vue ou d'abord la vue puis le texte. Ensuite, je dois créer 3 zones de contenu différentes que je rend dans les thèmes de nœuds spécifiques. Mais l' views_embed_view()approche est beaucoup plus facile et plus propre, je suppose.
TiMESPLiNTER
0

Je sais que vous mentionnez que vous souhaitez utiliser des modèles de brindilles, 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é pouvant être mise en champ afin que les éditeurs de contenu puissent configurer la vue / sortie.

joekers
la source