Wie greife ich in Twig auf Felddaten zu?

15

Ich habe ein Listenfeld für einen benutzerdefinierten Blocktyp, der wie folgt aussieht:

left|Align left
right|Align right

Ich kann auf den Schlüssel in Twig zugreifen, indem ich Folgendes mache:

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

Wenn ich jedoch einen einfachen Vergleich vornehme, wird er ausgegeben FALSE.

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

Der folgende Code wird zurückgegeben TRUE.

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

Gibt es eine kürzere Version, um die "echte" Saite zu bekommen, damit ich Twigs-Saitenfilter verwenden und sie sauber halten kann?

estrar
quelle

Antworten:

16

content enthält die Render-Arrays basierend auf den konfigurierten Formatierern.

Wenn Sie auf die tatsächlichen Werte zugreifen möchten, möchten Sie über das Entitätsobjekt darauf zugreifen. In der Regel ist dies beispielsweise bereits für Ihre Vorlage verfügbar node. Für Ihren Fall ist dies etwas Besonderes, da der block_content im Blockinhalt ohne eigene Vorlage gerendert wird, sodass Sie ihn folgendermaßen selbst zur Verfügung stellen müssen yourtheme_preprocess_block($variables):

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

Dann können Sie mit auf einen Feldwert zugreifen block_content.field_name.property. Also in deinem Fall block_content.field_align.value. Die Eigenschaft gilt valuefür die meisten Feldtypen. Für Verweise können Sie sie entweder target_idfür die ID oder entityfür das Entitätsobjekt verwenden, auf das verwiesen wird. Ja, Sie können direkt auf Felder zugreifen, aber stellen Sie sicher, dass immer ein Verweis vorhanden ist. Andernfalls können schwerwiegende Fehler oder Ausnahmen auftreten. Um beispielsweise auf die Bezeichnung einer Termreferenz zuzugreifen, können Sie darauf zugreifen als block_content.field_tags.entity.name.value.

Wenn Sie das Feld Delta nicht angeben, wird standardmäßig das erste verwendet. Wenn Sie auf ein anderes Delta zugreifen möchten, können Sie entity.field_name.1.valueund so weiter verwenden. Sie können sie auch in einer Schleife durchlaufen.

Dies alles ordnet PHP direkt zu, was Sie auch $block_content->field_tags->entity->name->valuean Preprocess- und anderen Stellen tun können, an denen Sie den block_content haben.

Berdir
quelle
Danke für deine Antwort! Da ich dies aus der Block-Zweig-Vorlage mache, in der das Knotenobjekt nicht verfügbar ist (Unterthema "Nobel"), muss ich die Werte vorverarbeiten und sie irgendwie einfügen?
Am
Entschuldigung, ich habe den block_content-Teil verpasst. Die Antwort wurde aktualisiert.
Berdir
Perfekt! Ich könnte die Werte dadurch erhalten: block_content.field_name.value Danke, dass du mir geholfen hast zu verstehen!
Am
6

Hier ist eine alternative Methode, mit der Sie ein Render-Array rendern und dessen Wert überprüfen können (Sie können die Variable so prüfen, als würden Sie sie drucken, da beim Drucken in Drupal 8 Twig automatisch Variablen gerendert werden, die Render-Arrays sind):

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

Oder eine andere Option, um das zusätzliche Rendering zu speichern, wenn Sie die Variable später drucken:

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

{{ field_align }}
Cottser
quelle
Sehr nützlich und gut zu wissen! Danke für die Eingabe.
Am
2

In diesem Fall können Sie das Twig Field Value- Modul verwenden. Es ermöglicht das Abrufen von Teildaten von Feldrender-Arrays. Zum Beispiel. content.field_name | field_value -get Feldwert. Sie können es in der IF-Anweisung verwenden

Andrew Kozoriz
quelle