Iterar a través del campo de contenido de valor múltiple en la plantilla Twig


23

Necesito tomar el control sobre la representación de un field_admin_tagscampo en una node.html.twigplantilla.

Esto funciona:

  • {{ content.field_admin_tags }} - Representa todo (etiqueta + todos los valores de campo)
  • {{ content.field_admin_tags.0 }} - Representa solo el primer valor en el campo, y sin etiqueta

PROBLEMA: No tengo control sobre el marcado que rodea las etiquetas, por ejemplo <ul><li>...</li></ul>.

Entonces mi idea era iterar sobre la matriz de renderizado .

Pero eso no funciona:

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

Me sale: Exception: Object of type Drupal\node\Entity\Node cannot be printed.

Creo que estoy iterando sobre las claves / valores de la matriz de renderizado frente a los elementos dentro del campo (si imprimo una "X" en cada bucle, obtengo 20 X mientras solo tengo dos o tres valores en este campo) .

Me gustaría para repetir content.field_admin_tags.0, content.field_admin_tags.1etc.

¿Algúna idea de cómo arreglar esto? Gracias.


1
El problema en do drupal.org/node/2776307
gagarine

Respuestas:


15

Puedes arreglar esto en una rama de campo. Allí puede usar el bucle existente para iterar sobre los elementos de campo:

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>

Este ejemplo reemplaza <div>con <ul>. No elimine {{ attributes }}ni omita la plantilla de campo, consulte ¿Qué puede interrumpir quickedit y cómo puedo solucionarlo?


Esto se llama desde la plantilla principal con{{ content.field_admin_tags }}
aydow

23

De acuerdo con 4k4, la plantilla de campo es el mejor lugar, si realmente lo desea en la plantilla de entidad (por ejemplo, nodo) puede hacer algo como esto:

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

Pero, sinceramente, creo que es un poco feo, la plantilla de campo es el lugar correcto.


1
De acuerdo, es un poco feo. ;) Gracias por el fragmento de código, sin embargo.
AngularChef

Funciona perfectamente con diferentes tipos de atracciones
Christophe CARON

11

Si, como yo, está buscando una manera de recorrer los párrafos de la plantilla de ramita de un nodo, aquí le mostramos cómo hacerlo:

Suponga que tiene un nodo con un campo de párrafo de varios valores, de modo que un editor de contenido puede crear varios párrafos y desea recorrer cada párrafo en la plantilla de ramita de nodos (por ejemplo, para agregar un contenedor alrededor de cada párrafo):

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

ACTUALIZACIÓN: necesitaba encontrar otra forma de imprimir todos los párrafos sin usar contenido. La variable de contenido contiene todo lo que configuró en la sección 'Administrar pantalla' del nodo, pero mi método de trabajo actual es nunca usar 'Administrar pantalla' ni diseños, ya que realmente puede acceder a todos los datos en el archivo de ramita del nodo, y casi todos configuraciones que haría en 'Administrar pantalla', como aplicar un estilo de imagen o configurar un formato de fecha, ... puede hacerlo directamente en rama.

Para mí, esto es una ventaja porque sé que todo lo que veo proviene del archivo twig, y no necesito buscar algunas configuraciones de campo oscuras que puedan agregar clases en alguna parte. Entonces, todo lo que veo proviene de un solo lugar (el archivo de ramita de nodos) y no una combinación del archivo de ramita y la pantalla de visualización de administración.

De todos modos, utilizando el impresionante módulo Twig Tweak, aquí se explica cómo imprimir un campo de párrafo de valores múltiples en el archivo twig de un nodo sin tener que usar la variable de contenido:

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

1

He encontrado que la #itemspropiedad es útil al construir bucles de longitud desconocida en Twig:

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

Si desea colocar contenedores adicionales alrededor de los campos dentro del campo de párrafo o necesita por alguna razón un valor de campo de referencia de párrafo particular, puede hacer lo siguiente:

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

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

{% endfor %}

Al hacerlo {{kint(content.paragraph_field_name[key])}}, verá que los campos son accesibles dentro de la parte ['#párrafo'] de la matriz.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.