¿Cómo incrustar una vista en un nodo específico?

13

Intento incrustar una vista en un nodo específico. Encontré tutoriales para hacer esto con Drupal 7 y Plantillas PHP:

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

Pero busco un camino en Drupal 8 con plantillas de ramitas. Intenté llamar a la views_embed_view()función en hook_node_view()y asignarla al nodo para poder imprimirla en la plantilla de ramita. Pero parece que este gancho nunca se llama.

¿Alguna sugerencia / solución sobre cómo hacer esto de la manera Drupal 8?

INSTALADOR DE TIEMPO
fuente

Respuestas:

19

Twig Views Embed

Este módulo permite incrustar vistas con una función de ramita.

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

El módulo anterior fue depreciado a favor de

Twig Tweak

El módulo Twig Tweak proporciona una extensión Twig con algunas funciones y filtros útiles que pueden mejorar la experiencia del desarrollador.

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

Puedes encontrarlo view_machine_name aquí

No Sssweat
fuente
@TiMESPLiNTER solo te avisa.
No Sssweat
¿Desde cuando? ¿Versión?
Vishal Kumar Sahu
1
@VishalKumarSahu desde que se publicó mi respuesta, 18 de marzo de 16. Creo que el módulo aún funciona, es solo que ya no se mantiene ni se desarrolla más.
No Sssweat
Perfectamente perfecto. Funciona muy bien y estoy teniendo una buena experiencia con él. Gracias
Vishal Kumar Sahu
Twig Tweak! Buen módulo
Harish ST
5

Así es como me funcionó en el subtema Drupal 8 beta 12 de Classy.

En el archivo 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);
}  

Copié el node.html.twig y rodeé las etiquetas del artículo (o el área que desea reemplazar) con un bloque de ramas. Coloqué esto en la carpeta / template / content.

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

    ...

  </article>  
{% endblock replace_area %}

Luego creé un nodo: 2.html.twig (reemplace 2 con el nodo deseado) en la carpeta / template / content con el siguiente código.

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

{% block replace_page %}
  {{ my_view }}
{% endblock %}
Jorge
fuente
4

El primer problema con el que está luchando es que las entidades renderizadas como los nodos ahora se almacenan en caché de forma predeterminada, por lo que hook_node_view () solo se llama una vez después de que un caché borre / guarde ese nodo.

Sin embargo, esto es bastante fácil de deshabilitar, vea settings.local.php.

Luego, poner la salida de una vista en $ build es bastante fácil y funciona más o menos como en 7.x. En lugar de usar la función de inserción , considere usar $ views = Views :: getView () y luego $ views-> buildRenderable ()

Dos consejos:

  • Haga que la clave que usa para $ build esté disponible como un campo adicional en hook_entity_extra_field_info () , luego verifique la pantalla si el componente está habilitado (vea cómo user_user_view () lo hace. Eso le permite configurar el peso / ubicación de la vista en el IU y también ocultarlo en ciertos modos de vista.
  • Si su vista tiene una página, entonces es un poco más complicado, ya que la salida del nodo se almacena en caché. Debe hacer que la clave de caché conozca el buscapersonas, consulte comment_entity_build_defaults_alter () para ver un ejemplo (no una vista, pero ese es el ejemplo más cercano que tiene el núcleo).
Berdir
fuente
En primer lugar gracias por esta gran respuesta. Bueno, "habilité" settings.local.phpy borré todas las cachés. Pero mi gancho themename_node_view()en themename.themetodavía no se llama. ¿Tienes alguna idea de por qué este podría ser el caso?
TIMESPLiNTER
1
Hay un fragmento en settings.php que debes descomentar (al final). para asegurarse de que settings.local.php está cargado, agregue PHP no válido que resulte en un error fatal. Si su sitio no falla, el archivo no se carga.
Berdir
2

Como Berdir aludió a Ver-> buildRenderable es lo que está buscando, pero para dar más contexto en un módulo, deberá hacer lo siguiente.

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

}

Luego, en su plantilla de página, puede acceder a ella con

{{ page.content.theme_name_content }}
ummdorian
fuente
1
Todo esto fue un trazador de líneas único en Drupal 7. Interesante.
WM
0

Dentro de las vistas, puede crear un bloque con sus datos relevantes.

Después de la creación del bloque, puede asignar el bloque para que aparezca en el área de contenido que desee (pie de página / encabezado / contenido / etc.). Asignelo y luego haga clic en "configurar". Debería poder "Mostrar bloque en páginas específicas". Seleccionar "Solo las páginas enumeradas" y agregar / node / your-node-number a la especificación de la página debería limitar esa vista / bloque a aparecer solo con el nodo deseado.

¡Salud!

Luke Rehmann
fuente
Gracias por tu respuesta :-). Pero luego tengo que crear un área de contenido para cada caso. Entonces, si me gusta tener el primer texto, luego la vista y luego nuevamente el texto. O si me gusta tener el primer texto y luego la vista o primero la vista y luego el texto. Luego tengo que crear 3 áreas de contenido diferentes que represento en el tema específico del nodo. Pero el views_embed_view()enfoque es mucho más fácil y limpio, supongo.
TIEMPOSPLICADOR
0

Sé que mencionas que te gustaría usar plantillas de ramitas, pero podrías usar el módulo Campo de referencia de vistas para evitar tener que buscar en las plantillas. También ofrece la ventaja de poder agregarlo a cualquier entidad de campo para que los editores de contenido puedan configurar la vista / salida.

joekers
fuente