Necesito establecer un valor de campo como clase CSS en una plantilla de página. ¿Cómo puedo hacerlo al estilo Twig?
{{attributes.addClass('class-name')}}
es la forma de configurar la clase manualmente.
Tengo un campo de lista para permitir al usuario establecer un color de fondo para una parte del sitio. En Drupal 7 usé este código.
<div class="<?php print render($content['field_background']); ?>">
En Drupal 8, puedo imprimir el campo con {{ content.field_background }}
, pero <div class="{{ content.field_background }}">
no funciona.
{% set classes = [ ...
y luego imprimiendo las clases<article{{ attributes.addClass(classes) }}>
o también puede hacer algo<div{{ content_attributes.addClass('foobar' | clean_class) }}>
así. Como dice la nota anterior, creo que necesitamos más información. Si desea un valor de campo como clase, sería útil usar la depuración de Kint y Twig también y es posible que necesite establecer un var con una función de preproceso, pero tal vez no sea necesario.Respuestas:
Esto se puede hacer de varias maneras, puede hacerlo todo en la plantilla de nodo con Twig o puede crear una función de preproceso y crear una variable para usar en la plantilla de nodo. La clave para aprender lo que hay en la matriz es usar Devel Kint. Sin eso, no sabrás qué hay en la matriz.
Primero instale Kint que viene con el módulo Devel para Drupal 8. Luego, elija su plantilla de nodo (pero esto se puede hacer en cualquier tipo de plantilla) y examine la variable de contenido de esta manera (idealmente en la parte inferior de la plantilla).
A partir de esto, obtenemos información de depuración impresa en la página y si expande la matriz, verá una gran cantidad de información. De inmediato, veo mi valor de fondo y puedo construir una ruta para imprimir esto como
Ahora puede imprimir esto como un estilo de fondo o una clase en un div
He probado esto y funciona muy bien, el div mostró el color de fondo que había seleccionado en mi lista de campos en la edición de nodos.
Ahora, esto no es ideal, por lo que probablemente queremos crear una variable para esto en un preprocess_node en el archivo .theme de nuestro tema.
Ahora que tengo una var creada, es mucho más limpio imprimir esto:
Una nota para lo anterior, probablemente debería envolver esto con una declaración if para verificar si está vacío o no.
Esto funcionaría o estructuraría la declaración if donde le guste
fuente
En una plantilla de nodo, los campos están en
{{ content }}
. En una plantilla de página no hay una variable de contenido, en cambio hay una variable de página que contiene regiones{{ page.region }}
.Como usted preguntó acerca de la plantilla de la página, no podemos usarla
content
.Pero puede usar {{node}} en ambas plantillas. El objeto de nodo siempre está en una plantilla de nodo y en la plantilla de página, cuando la página muestra un nodo.
Entonces esto debería funcionar en ambas plantillas:
fuente
fielditemlist
.value
obtiene con un poco de magia de ramita y el campo objeto el valor del primer elemento. En un campo de valores múltiples puede acceder a cualquier elemento insertando un número que comience en cero:node.field_myfield.0.value