Durchsuchen Sie das Inhaltsfeld mit mehreren Werten in der Twig-Vorlage

23

Ich muss die Kontrolle über das Rendern eines field_admin_tagsFelds in einer node.html.twigVorlage übernehmen.

Das funktioniert:

  • {{ content.field_admin_tags }} - Rendert alles (Label + alle Feldwerte)
  • {{ content.field_admin_tags.0 }} - Rendert nur den ersten Wert im Feld und keine Beschriftung

PROBLEM: Ich habe keine Kontrolle über das Markup, das die Tags umgibt, z <ul><li>...</li></ul>.

Meine Idee war es also, über das Render-Array zu iterieren .

Aber das funktioniert nicht:

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

Erhalte ich: Exception: Object of type Drupal\node\Entity\Node cannot be printed.

Ich denke, ich iteriere über die Schlüssel / Werte des Render-Arrays im Vergleich zu den Elementen im Feld. .

Ich möchte iterieren content.field_admin_tags.0, content.field_admin_tags.1usw.

Irgendeine Idee, wie man das behebt? Vielen Dank.

AngularChef
quelle
1
Das Problem auf do drupal.org/node/2776307
gagarine

Antworten:

15

Sie können dies in einem Feld Zweig beheben. Dort können Sie die vorhandene Schleife verwenden, um die Feldelemente zu durchlaufen:

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>

Dieses Beispiel ersetzt <div>mit <ul>. Entfernen {{ attributes }}oder umgehen Sie die Feldvorlage nicht. Weitere Informationen finden Sie unter Was kann quickedit beschädigen und wie kann ich das Problem beheben?

4k4
quelle
Dies wird von der übergeordneten Vorlage mit{{ content.field_admin_tags }}
aydow
23

Wenn Sie mit 4k4 einverstanden sind, ist die Feldvorlage der beste Ort. Wenn Sie sie wirklich in der Entitätsvorlage (z. B. Knoten) haben möchten, können Sie Folgendes tun:

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

Aber ehrlich gesagt finde ich es ein bisschen hässlich, die Feldvorlage ist der richtige Ort.

Jeff Burnz
quelle
1
Einverstanden, es ist ein bisschen hässlich. ;) Danke aber für den Code-Schnipsel.
AngularChef
Funktioniert perfekt mit verschiedenen Arten von Elementen
Christophe CARON
11

Wenn Sie wie ich nach einer Möglichkeit suchen, Absätze in der Zweigvorlage eines Knotens zu durchlaufen, gehen Sie wie folgt vor:

Angenommen, Sie haben einen Knoten mit einem mehrwertigen Absatzfeld, sodass ein Inhaltseditor mehrere Absätze erstellen kann, und Sie möchten jeden Absatz in der Knoten-Zweigvorlage durchlaufen (beispielsweise, um jeden Absatz einen Umbruch hinzuzufügen):

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

UPDATE: Ich musste einen anderen Weg finden, um alle Absätze ohne Inhalt zu drucken. Die Inhaltsvariable enthält alles, was Sie im Abschnitt "Anzeige verwalten" des Knotens eingerichtet haben. Meine derzeitige Arbeitsmethode ist jedoch, niemals "Anzeige verwalten" oder Layouts zu verwenden, da Sie auf alle Daten in der Knotenzweigdatei zugreifen können, und fast alle Einstellungen, die Sie unter 'Anzeige verwalten' vornehmen würden, z. B. das Anwenden eines Bildstils oder das Einstellen eines Datumsformats, können Sie direkt in twig vornehmen.

Für mich ist dies ein Vorteil, da ich weiß, dass alles, was ich sehe, aus der Zweigdatei stammt und ich nicht nach dunklen Feldeinstellungen suchen muss, die möglicherweise irgendwo Klassen hinzufügen. Alles, was ich sehe, kommt von nur einer Stelle (der Knoten-Zweig-Datei) und nicht von einer Kombination aus der Zweig-Datei und dem Verwaltungsbildschirm.

Wie auch immer, mit dem fantastischen Twig Tweak-Modul können Sie ein mehrwertiges Absatzfeld in der Twig-Datei eines Knotens drucken, ohne die Inhaltsvariable verwenden zu müssen:

{% for item in node.field_paragraphs %}
    {{ drupal_entity('paragraph', item.target_id) }}
{% endfor %}
user33560
quelle
1

Ich habe festgestellt, dass die #itemsEigenschaft nützlich ist, wenn in Twig Schleifen unbekannter Länge erstellt werden:

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
quelle
0

Wenn Sie zusätzliche Wrapper um die Felder innerhalb des Absatzfelds platzieren möchten oder aus irgendeinem Grund einen bestimmten Absatzreferenzfeldwert benötigen, können Sie Folgendes tun:

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

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

{% endfor %}

Auf diese Weise sehen {{kint(content.paragraph_field_name[key])}}Sie, dass auf die Felder im Teil ['#paragraph'] des Arrays zugegriffen werden kann.

Brent Schuddinck
quelle