¿Cómo accedo a los datos de campo en Twig?

15

Tengo un campo de lista para un tipo de bloque personalizado que se ve así:

left|Align left
right|Align right

Puedo acceder a la clave en Twig haciendo algo como esto:

{% block content %}
  {{ content.field_align }}  {# outputs 'right' #}
{% endblock %}

Sin embargo, si hago una comparación simple, sale FALSE.

{{ kint(content.field_align == 'right') }}

El siguiente código vuelve TRUE.

{{ kint(content.field_align['#items'].getValue()|first.value == 'right') }}

¿Existe una versión más corta para obtener la cadena "real" para que pueda usar los filtros de cadena Twigs y mantenerlo ordenado?

estrar
fuente

Respuestas:

16

content contiene las matrices de renderizado basadas en los formateadores configurados.

Si desea acceder a los valores reales, desea acceder a ellos a través del objeto de entidad. Por lo general, eso ya está disponible para su plantilla, por ejemplo node. Para su caso, es un poco especial porque el contenido de bloque se representa en el contenido del bloque sin su propia plantilla, por lo que debe ponerlo a su disposición de la yourtheme_preprocess_block($variables)siguiente manera:

if (isset($variables['elements']['content']['#block_content'])) {
  $variables['block_content'] = $variables['elements']['content']['#block_content'];
}

Luego, puede acceder a un valor de campo con block_content.field_name.property. Entonces en tu caso block_content.field_align.value,. La propiedad es valuepara la mayoría de los tipos de campo, para referencias, puede usar target_idpara el ID o entitypara el objeto de entidad referenciado. Sí, puede acceder directamente a los campos en eso, pero asegúrese de verificar siempre que exista una referencia; de lo contrario, puede terminar con errores fatales o excepciones. Para acceder a la etiqueta de una referencia de término, por ejemplo, puede acceder a ella como block_content.field_tags.entity.name.value.

Si no especifica el campo delta, el valor predeterminado es el primero. Si desea acceder a un delta diferente, puede usar, entity.field_name.1.valueetc. También puedes recorrerlos.

Todo esto se asigna directamente a PHP, también puede hacerlo $block_content->field_tags->entity->name->valueen preprocesos y otros lugares donde tiene el contenido de bloque.

Berdir
fuente
¡Gracias por tu respuesta! Como estoy haciendo esto desde la plantilla de ramita de bloques donde el objeto de nodo no está disponible (subtemando "Classy"), ¿necesitaría preprocesar los valores e inyectarlos de alguna manera?
estrar
Lo siento, me perdí la parte block_content. Se actualizó la respuesta.
Berdir
¡Perfecto! Podría obtener los valores haciendo esto: ¡ block_content.field_name.value Gracias por ayudarme a entender!
estrar
6

Aquí hay una forma alternativa de plantilla que le permite renderizar una matriz de renderizado y verificar su valor (permite verificar la variable como si la estuviera imprimiendo, porque imprimir en Drupal 8 Twig renderiza automáticamente las variables que son matrices de renderizado):

{{ kint(content.field_align|render == 'right') }}

O otra opción para guardar el render extra si está imprimiendo la variable más tarde:

{% set field_align = content.field_align|render %}
{{ kint(field_align == 'right') }}

{{ field_align }}
Cottser
fuente
Muy útil y bueno saberlo! Gracias por el aporte.
estrar
2

Puede usar el módulo Twig Field Value en este caso. Permite obtener datos parciales de matrices de renderizado de campo. Por ej. content.field_name | field_value -get valor del campo. Puede usarlo en la declaración IF

Andrew Kozoriz
fuente