Jak uzyskać dostęp do danych pól w Twig?

15

Mam pole listy dla niestandardowego typu bloku, który wygląda następująco:

left|Align left
right|Align right

Mogę uzyskać dostęp do klucza w Twig, wykonując coś takiego:

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

Jeśli jednak zrobię proste porównanie, wynik będzie FALSE.

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

Zwraca następujący kod TRUE.

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

Czy istnieje krótsza wersja pozwalająca uzyskać „prawdziwy” ciąg, dzięki czemu mogę używać filtrów ciągów Twigs i utrzymywać porządek?

estrar
źródło

Odpowiedzi:

16

content zawiera tablice renderujące oparte na skonfigurowanych formatatorach.

Jeśli chcesz uzyskać dostęp do rzeczywistych wartości, chcesz uzyskać do nich dostęp poprzez obiekt encji. Zwykle jest to już dostępne na przykład w szablonie node. W twoim przypadku jest to trochę wyjątkowe, ponieważ zawartość bloku jest renderowana w treści bloku bez własnego szablonu, więc musisz udostępnić ją w następujący sposób yourtheme_preprocess_block($variables):

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

Następnie możesz uzyskać dostęp do wartości pola za pomocą block_content.field_name.property. Więc w twoim przypadku block_content.field_align.value. Właściwość dotyczy valuewiększości typów pól. W przypadku odwołań można użyć target_ididentyfikatora lub entityobiektu encji , do której istnieje odwołanie. Tak, możesz bezpośrednio uzyskać do niego dostęp do pól, ale pamiętaj, aby zawsze sprawdzać, czy istnieje odwołanie, w przeciwnym razie mogą wystąpić poważne błędy lub wyjątki. Aby na przykład uzyskać dostęp do etykiety odwołania do terminu, możesz uzyskać do niego dostęp jako block_content.field_tags.entity.name.value.

Jeśli nie określisz delty pola, domyślnie będzie to pierwsza. Jeśli chcesz uzyskać dostęp do innej delty, możesz użyć entity.field_name.1.valuei tak dalej. Możesz także nad nimi zapętlić.

To wszystko mapuje bezpośrednio na PHP, możesz to zrobić również $block_content->field_tags->entity->name->valuew procesie wstępnym i innych miejscach, w których masz zawartość block_content.

Berdir
źródło
Dziękuję za odpowiedź! Gdy robię to z szablonu gałązki bloku, w którym obiekt węzła nie jest dostępny (pod-tematyczne „Classy”), czy musiałbym wstępnie przetwarzać wartości i jakoś je wstrzykiwać?
estrar
Przepraszam, brakowało mi części block_content. Zaktualizowałem odpowiedź.
Berdir
Doskonały! Mógłbym uzyskać wartości, robiąc to: block_content.field_name.value Dziękuję za pomoc w zrozumieniu!
estrar
6

Oto alternatywny sposób, tylko szablonowy, który pozwala renderować tablicę renderującą i sprawdzać jej wartość (pozwala sprawdzać zmienną tak, jakbyś ją drukował, ponieważ drukowanie w Drupal 8 Twig automatycznie renderuje zmienne, które są tablicami renderującymi):

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

Lub inna opcja zapisania dodatkowego renderowania, jeśli drukujesz zmienną później:

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

{{ field_align }}
Cottser
źródło
Bardzo przydatne i dobrze wiedzieć! Dzięki za wkład.
estrar
2

W takim przypadku możesz użyć modułu Twig Field Value . Pozwala uzyskać częściowe dane z tablic renderujących pola. Np. content.field_name | field_value -get wartość pola. Możesz go użyć w instrukcji IF

Andrew Kozoriz
źródło