Como incorporar uma exibição em um nó específico?


13

Eu tento incorporar uma exibição em um nó específico. Encontrei tutoriais para fazer isso com o Drupal 7 e o PHP-Templates:

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

Mas eu procuro uma maneira no Drupal 8 com modelos de galho. Tentei chamar a views_embed_view()função no hook_node_view()e atribuí-lo ao nó para que eu possa imprimi-lo no modelo galho. Mas parece que esse gancho nunca é chamado.

Alguma dica / solução de como fazer isso no Drupal 8?

Respostas:


19

Visualizações de galho Incorporar

Este módulo permite incorporar vistas com uma função de galho.

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

O módulo acima foi depreciado em favor de

Twig Tweak

O módulo Twig Tweak fornece uma extensão Twig com algumas funções e filtros úteis que podem melhorar a experiência do desenvolvedor.

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

Você pode encontrar o view_machine_name aqui


@TiMESPLiNTER apenas dando um aviso.
No Sssweat

Desde quando? Versão?
Vishal Kumar Sahu

1
@VishalKumarSahu desde que minha resposta foi publicada, 18 de março de 16. Eu acho que o módulo ainda funciona, mas ele não está mais sendo mantido ou desenvolvido.
Não Sssweat

Perfeitamente perfeito. Funciona muito bem e estou tendo uma boa experiência com ele. Obrigado
Vishal Kumar Sahu

Twig Tweak! Bom módulo
Harish ST

5

Foi assim que funcionou para mim no subtema Drupal 8 beta 12 do Classy.

No arquivo 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);
}  

Copiei o node.html.twig e coloquei as tags dos artigos (ou a área que você deseja substituir) com um bloco de galho. Coloquei isso na pasta / template / content.

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

    ...

  </article>  
{% endblock replace_area %}

Então, criei um nó - 2.html.twig (substitua 2 pelo nó desejado) na pasta / template / content com o seguinte código.

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

{% block replace_page %}
  {{ my_view }}
{% endblock %}

4

O primeiro problema com o qual você está lutando é que entidades renderizadas, como nós, agora são armazenadas em cache por padrão; portanto, hook_node_view () é chamado apenas uma vez após o cache limpar / salvar esse nó.

No entanto, isso é bastante fácil de desativar, consulte settings.local.php.

Em seguida, colocar a saída de uma visualização em $ build é bastante fácil e mais ou menos funciona como no 7.x. Em vez de usar a função incorporar, considere usar $ views = Views :: getView () e depois $ views-> buildRenderable ()

Duas dicas:

  • Disponibilize a chave usada para $ build como um campo extra em hook_entity_extra_field_info () e verifique a exibição se o componente está ativado (veja como user_user_view () faz isso. Isso permite configurar o peso / posicionamento da visualização na UI e também ocultá-lo em certos modos de exibição.
  • Se sua visualização tiver uma página, será um pouco mais complicada, pois a saída do nó é armazenada em cache. Você precisa tornar a chave de cache ciente do pager, consulte comment_entity_build_defaults_alter () para um exemplo (não uma exibição, mas esse é o exemplo mais próximo que o núcleo possui).

Antes de tudo, agradeço pela ótima resposta. Bem, eu "habilitei" o settings.local.phpe limpei todos os caches. Mas o meu anzol themename_node_view()no themename.themeainda não é chamado. Você tem alguma idéia de por que esse poderia ser o caso?
TiMESPLiNTER

1
Há um trecho no settings.php que você precisa descomentar (no final). para garantir que o settings.local.php esteja carregado, adicione PHP inválido que resulte em erro fatal. se o seu site não falhar, o arquivo não será carregado.
Berdir

2

Como Berdir aludiu a View-> buildRenderable é o que você está procurando, mas para fornecer mais contexto em um módulo, você precisará fazer o seguinte.

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

}

Em seguida, no seu modelo de página, você pode acessá-lo com

{{ page.content.theme_name_content }}

1
Tudo isso era único no Drupal 7. Interessante.
WM

0

Nas visualizações, você pode criar um bloco com seus dados relevantes.

Após a criação do bloco, você pode atribuir o bloco a aparecer na área de conteúdo desejada (rodapé / cabeçalho / conteúdo / etc). Atribua e clique em "configurar". Você deve conseguir "Mostrar bloco em páginas específicas". A seleção de "Apenas as páginas listadas" e a adição de / node / your-node-number à especificação da página devem limitar essa exibição / bloco a aparecer apenas com o nó desejado.

Felicidades!


Obrigado pela sua resposta :-). Mas então eu tenho que criar uma área de conteúdo para cada caso. Então, se eu gostaria de ter o primeiro texto, a visualização e o texto novamente. Ou se eu gostaria de ter o primeiro texto e depois a visualização ou primeiro a visualização e depois o texto. Então eu tenho que criar 3 áreas de conteúdo diferentes que eu renderizo nos nós de tema específicos. Mas a views_embed_view()abordagem é muito mais fácil e limpa, eu acho.
TiMESPLiNTER

0

Eu sei que você mencionou que gostaria de usar modelos de galho, mas você poderia usar o módulo Campo de Referência de Vistas para evitar ter que procurar em modelos. Também oferece a vantagem de poder adicioná-lo a qualquer entidade em campo para que os editores de conteúdo possam configurar a visualização / saída.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.