web-dev-qa-db-fra.com

Comment accéder aux données de terrain dans Twig?

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?

15
estrar

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.valueetc. 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.

16
Berdir

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 }}
6
Cottser

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

2
Andrew Kozoriz