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

15

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 sort FALSE.

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

Le code suivant revient 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?

estrar
la source
EN RELATION
leymannx

Réponses:

16

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 de la manière yourtheme_preprocess_block($variables)suivante:

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 valuepour la plupart des types de champs, pour les références, vous pouvez soit l'utiliser target_idpour l'ID, soit entitypour 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.valueet ainsi de suite. Vous pouvez également les parcourir en boucle.

Tout cela mappe directement sur PHP, vous pouvez également le faire $block_content->field_tags->entity->name->valueen pré-traitement et dans d'autres endroits où vous avez le block_content.

Berdir
la source
Merci pour votre réponse! Comme je le fais à partir du modèle de brindille de bloc où l'objet nœud n'est pas disponible (sous-thème "Classy"), aurais-je besoin de prétraiter les valeurs et de les injecter d'une manière ou d'une autre?
estrar
Désolé, j'ai raté la partie block_content. Mis à jour la réponse.
Berdir
Parfait! Je pourrais obtenir les valeurs en faisant ceci: block_content.field_name.value Merci de m'aider à comprendre!
estrar
6

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 dans 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 }}
Cottser
la source
Très utile et bon à savoir! Merci pour la contribution.
estrar
2

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

Andrew Kozoriz
la source