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?
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
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_name
ici
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 %}
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:
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 }}
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é!
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.