Pregunta:
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, da como resultado FALSE
.
{{ kint(content.field_align == 'right') }}
El siguiente código devuelve TRUE
.
{{ kint(content.field_align['#items'].getValue()|first.value == 'right') }}
¿Existe una versión más corta para obtener la cadena "real" para poder usar los filtros de cadena Twigs y mantenerla ordenada?
Respuesta:
content
contiene las matrices de procesamiento 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 block_content se representa en el contenido del bloque sin su propia plantilla, por lo que debe hacer que esté disponible usted mismo en un yourtheme_preprocess_block($variables)
como este:
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 su caso, block_content.field_align.value
. La propiedad es un value
para la mayoría de los tipos de campo; para las referencias, puede usar target_id
para el ID o entity
para el objeto de entidad al que se hace referencia. Sí, puede acceder directamente a los campos sobre 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.value
y así sucesivamente. También puede recorrerlos.
Todo esto se asigna directamente a PHP, también puede hacer $block_content->field_tags->entity->name->value
en preproceso y otros lugares donde tiene el block_content.