J'ai un champ de liste pour un type de bloc personnalisé qui ressemble à ceci:
left|Align left
right|Align right
Je peux accéder à la clé dans Twig en faisant quelque chose comme ceci:
{% block content %}
{{ content.field_align }} {# outputs 'right' #}
{% endblock %}
Cependant, si je fais une comparaison simple, il génère FALSE
.
{{ kint(content.field_align == 'right') }}
Le code suivant renvoie TRUE
.
{{ kint(content.field_align['#items'].getValue()|first.value == 'right') }}
Existe-t-il une version plus courte pour obtenir la "vraie" chaîne afin que je puisse utiliser les filtres de chaîne Twigs et la garder en ordre?
content
contient les tableaux de rendu basés sur les formateurs configurés.
Si vous souhaitez accéder aux valeurs réelles, vous souhaitez y accéder via l'objet entité. Habituellement, cela est déjà disponible pour votre modèle, par exemple node
. Pour votre cas, c'est un peu spécial car le block_content est rendu dans le contenu du bloc sans son propre modèle, vous devez donc le rendre disponible vous-même dans une yourtheme_preprocess_block($variables)
comme ceci:
if (isset($variables['elements']['content']['#block_content'])) {
$variables['block_content'] = $variables['elements']['content']['#block_content'];
}
Ensuite, vous pouvez accéder à une valeur de champ avec block_content.field_name.property
. Donc dans votre cas, block_content.field_align.value
. La propriété est value
pour la plupart des types de champs, pour les références, vous pouvez utiliser target_id
pour l'ID ou entity
pour l'objet entité référencé. Oui, vous pouvez accéder directement aux champs à ce sujet, mais assurez-vous de toujours vérifier qu'une référence existe sinon vous pouvez vous retrouver avec des erreurs fatales ou des exceptions. Pour accéder au libellé d'une référence de terme par exemple, vous pouvez y accéder en tant que block_content.field_tags.entity.name.value
.
Si vous ne spécifiez pas le delta de champ, il est par défaut le premier. Si vous souhaitez accéder à un autre delta, vous pouvez utiliser entity.field_name.1.value
etc. Vous pouvez également les parcourir en boucle.
Tout cela mappe directement sur PHP, vous pouvez également faire $block_content->field_tags->entity->name->value
dans le prétraitement et d'autres endroits où vous avez le block_content.
Voici une alternative, un modèle uniquement qui vous permet de rendre un tableau de rendu et de vérifier sa valeur (permet de vérifier la variable comme si vous l'imprimiez, car l'impression en Drupal 8 Twig rend automatiquement les variables qui sont des tableaux de rendu):
{{ kint(content.field_align|render == 'right') }}
Ou une autre option pour enregistrer le rendu supplémentaire si vous imprimez la variable plus tard:
{% set field_align = content.field_align|render %}
{{ kint(field_align == 'right') }}
{{ field_align }}
Vous pouvez utiliser le module Twig Field Value dans ce cas. Il permet d'obtenir des données partielles à partir de tableaux de rendu de champ. Par exemple. content.field_name | field_value -get valeur du champ. Vous pouvez l'utiliser dans l'instruction IF