Renderice un campo de nodo dentro de page.html.twig

12

Tengo un campo de imagen en mi tipo de contenido (field_hero_image).

No quiero que se procese en el archivo node.html.twig. Sin embargo, quiero renderizarlo en el archivo page.html.twig. Específicamente, quiero representarlo junto al título de la página.

¿Qué código usaría en mi archivo page.html.twig para acceder a los campos de nivel de nodo y representarlos?

(Hay una pregunta similar publicada, pero no pude usar la respuesta provista allí para resolver mi problema).

Esto para Drupal 8 tematización.

kraftybasterd
fuente
2
@kiamlaluno: ¿por qué editaste mi pregunta? Tener "Drupal 8" en el título Y en la pregunta hace que sea obvio para los posibles proveedores de respuestas Y hace que sea mucho más fácil encontrarlo en Google, dada la prevalencia del contenido de Drupal 6 y 7; Hacer que las preguntas / respuestas de Drupal 8 sean muy claras es útil para la comunidad en general que busca respuestas específicas para D8. Me preguntaba cuál era su razonamiento para cambiarlo.
kraftybasterd
No duplique etiquetas en los títulos de las preguntas; las etiquetas son visibles en todos los lugares donde se ve una pregunta, por lo que no es necesario usar etiquetas también en el título de la pregunta.
kiamlaluno
2
Obviamente, soy nuevo aquí ... pero ¿ayudan las metaetiquetas (en este caso, "8") con los resultados del motor de búsqueda? Siento que los títulos de contenido que contienen Drupal 8 o Drupal 7 podrían potencialmente ayudar a las personas que buscan respuestas a través de Google ... solo una idea.
kraftybasterd

Respuestas:

26

Después de investigar un poco más, pude encontrar suficientes piezas en otras preguntas y en drupal.org para lograr lo que quería hacer.

No se necesita preprocesamiento para esta respuesta, por lo que no es necesario agregar código a su archivo mytheme.theme.
Todas estas variables ya están accesibles en page.html.twig por defecto.

Para representar el valor predeterminado de un campo dentro de page.html.twig, normalmente usaría una variable Twig como en {{ node.field_some_name.value }}.

Si tiene un campo de imagen y desea representar la URL de la imagen almacenada en ese campo dentro de la plantilla page.html.twig, debería utilizarla {{ file_url(node.field_some_image.entity.fileuri) }}.

Finalmente, si desea representar el título de un nodo dentro de la plantilla page.html.twig, lo usaría {{ node.label }}.

También aprendí a usar algunos condicionales Twig para mi problema particular, pero eso está más allá del alcance de esta pregunta / respuesta.

kraftybasterd
fuente
Era escéptico, teniendo la impresión de que en D7 este tipo de cosas siempre debería estar, por ejemplo, en una función de preproceso. Sin embargo, el ejemplo de file_url()en los documentos ( drupal.org/docs/8/theming/twig/functions-in-twig-templates ) hace exactamente esto, así que votó positivamente.
Graham C
¿Cómo recorre un tipo de contenido específico y genera los valores de sus campos dentro page.html.twig?
Naourass Derouichi
2

Hay tres métodos útiles para trabajar con esto, todos los cuales le ahorran tiempo de excavación en matrices de renderizado complicadas.

  1. Con Display Suite (con el submódulo ds_extras) puede asignar a la región del héroe un bloque ("región de bloque") que es un modo de visualización diferente (es decir, solo uno que contiene la imagen del héroe). De este modo, se muestran dos modos de visualización diferentes a la vez. Tenga en cuenta que algunos ganchos de preproceso pueden no dispararse como podría esperar si hace esto.

  2. El módulo twig_tweak simplifica enormemente tales tareas y puede proporcionar declaraciones de ramita más fáciles para los valores de campo. Eche un vistazo a la hoja de trucos para algunos usos comunes: {{ drupal_field('field_image', 'node', 1) }}La firma de la función es:drupalField($field_name, $entity_type, $id = NULL, $view_mode = 'default', $langcode = NULL)

  3. El módulo twig_field_value hace declaraciones de ramita más simples. Por README.txt:<img src={{ file_url(content.field_image|field_target_entity.uri.value) }} alt={{ content.field_image|field_raw('alt') }} />

Si hubiera sabido esto antes, ¡me habría ahorrado mucho tiempo!

HongPong
fuente
1
Esta es la respuesta correcta. En mi experiencia, {{ node.field_some_name.value }}no representa el campo. No invoca el sistema de temas completo (función de preproceso, plantilla, etc.). OTOH, si usa el twig_tweakmódulo, puede obtener el campo completo con{{ node.field_some_name|view }}
kentr