Iteruj przez pole zawartości o wielu wartościach w szablonie Twig

23

Muszę przejąć kontrolę nad renderowaniem field_admin_tagspola w node.html.twigszablonie.

To działa:

  • {{ content.field_admin_tags }} - Renderuje wszystko (etykieta + wszystkie wartości pól)
  • {{ content.field_admin_tags.0 }} - Renderuje tylko pierwszą wartość w polu i brak etykiety

PROBLEM: Nie mam kontroli nad znacznikami otaczającymi tagi, np <ul><li>...</li></ul>.

Więc moim pomysłem było iterowanie po tablicy renderowania .

Ale to NIE DZIAŁA:

{% for tag in content.field_admin_tags %}
  {{ tag }}
{% endfor %}

I otrzymujemy: Exception: Object of type Drupal\node\Entity\Node cannot be printed.

Myślę , że iteruję po kluczach / wartościach tablicy renderowania w porównaniu do elementów wewnątrz pola (jeśli wydrukuję „X” w każdej pętli, dostanę 20 X, a mam tylko dwie lub trzy wartości w tym polu) .

Chciałbym iteracyjne nad content.field_admin_tags.0, content.field_admin_tags.1itp

Jakiś pomysł jak to naprawić? Dzięki.

AngularChef
źródło
1
Problem na stronie do drupal.org/node/2776307
gagarine

Odpowiedzi:

15

Możesz to naprawić za pomocą gałązki polowej. Tam możesz użyć istniejącej pętli do iteracji elementów pola:

node.html.twig

{{ content.field_admin_tags }}

field - field-admin-tags.html.twig

<ul{{ attributes }}>
  {% for item in items %}
    <li>{{ item.content }}</li>
  {% endfor %}
</ul>

Ten przykład zastępuje <div>się <ul>. Nie usuwaj {{ attributes }}ani nie omijaj szablonu pola, zobacz Co może zepsuć quickedit i jak to naprawić?

4k4
źródło
Jest to wywoływane z szablonu nadrzędnego za pomocą{{ content.field_admin_tags }}
aydow
23

Zgadzam się z 4k4, szablon pola jest najlepszym miejscem, jeśli naprawdę chcesz go w szablonie encji (np. Węzeł), możesz zrobić coś takiego:

{% for key, item in content.field_tags if key|first != '#' %}
  <div class="item-{{ key + 1 }}">{{ item }}</div>
{% endfor %}

Ale szczerze mówiąc, myślę, że to trochę brzydkie, szablon pola jest właściwym miejscem.

Jeff Burnz
źródło
1
Zgadzam się, to trochę brzydkie. ;) Jednak dziękuję za fragment kodu.
AngularChef
Działa doskonale z różnymi rodzajami przystawek
Christophe CARON
11

Jeśli, podobnie jak ja, szukasz sposobu na iterację akapitów na szablonie gałązki węzła, oto jak to zrobić:

Załóżmy, że masz węzeł z polem akapitu wielowartościowego, więc edytor treści może tworzyć wiele akapitów i chcesz iterować każdy akapit w szablonie gałązek węzłów (na przykład, aby dodać opakowanie wokół każdego akapitu):

{% for key,value in node.my_paragraph_field.value %}
    {{ content.my_paragraph_field[key] }}
{% endfor %}

AKTUALIZACJA: Musiałem znaleźć inny sposób na wydrukowanie wszystkich akapitów bez korzystania z treści. Zmienna content zawiera wszystko, co skonfigurowałeś w sekcji „Zarządzaj wyświetlaniem” węzła, ale moją obecną metodą pracy jest nigdy nie używać „Zarządzaj wyświetlaniem” ani układów, ponieważ możesz faktycznie uzyskać dostęp do wszystkich danych w pliku gałki węzła i prawie wszystkich ustawienia, które możesz wprowadzić w „Zarządzaj wyświetlaniem”, takie jak zastosowanie stylu obrazu lub ustawienie formatu daty, ... możesz to zrobić bezpośrednio za pomocą gałązki.

Dla mnie jest to zaleta, ponieważ wiem, że wszystko, co widzę, pochodzi z pliku gałązki i nie muszę szukać pewnych niejasnych ustawień pól, które mogłyby gdzieś dodawać klasy. Więc wszystko, co widzę, pochodzi tylko z jednego miejsca (plik gałązek węzłów), a nie z kombinacji pliku gałązki i ekranu zarządzania.

W każdym razie, korzystając z niesamowitego modułu Twig Tweak, oto jak wydrukować pole akapitu o wielu wartościach w pliku gałązki węzła bez konieczności używania zmiennej content:

{% for item in node.field_paragraphs %}
    {{ drupal_entity('paragraph', item.target_id) }}
{% endfor %}
użytkownik33560
źródło
1

Uważam, że #itemswłaściwość ta jest przydatna podczas tworzenia pętli o nieznanej długości w Gałązce:

print number of values within field:
{{ content.field_admin_tags['#items']|length }}

---

{# remember length in variable (minus 1 because it starts from 0): #}
{% set numTagsIndex = content.field_admin_tags['#items']|length - 1 %}

{# loop until the max value is reached: #}
{% for i in 0..numTagsIndex %}
  {{ content.field_admin_tags[i] }}
{% endfor %}
Chris Ruppel
źródło
0

Jeśli chcesz umieścić dodatkowe opakowania wokół pól wewnątrz pola akapitu lub z jakiegoś powodu potrzebujesz określonej wartości pola odwołania do akapitu, możesz wykonać następujące czynności:

{% for key,value in node.paragraph_field_name.value %}

<div class="example-wrapper">
{{ content.paragraph_field_name[key]['#paragraph'].field_content.value }}
</div>

{% endfor %}

W ten sposób {{kint(content.paragraph_field_name[key])}}zobaczysz, że pola są dostępne w części ['#paragraph'] tablicy.

Brent Schuddinck
źródło