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.


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?


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.


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 %}

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 %}

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.