Lặp lại qua nhiều trường nội dung giá trị trong mẫu Twig


23

Tôi cần kiểm soát việc hiển thị field_admin_tagstrường trong node.html.twigmẫu.

Những công việc này:

  • {{ content.field_admin_tags }} - Hiển thị mọi thứ (nhãn + tất cả các giá trị trường)
  • {{ content.field_admin_tags.0 }} - Chỉ hiển thị giá trị đầu tiên trong trường và không có nhãn

VẤN ĐỀ: Tôi không kiểm soát được đánh dấu xung quanh các thẻ, ví dụ <ul><li>...</li></ul>.

Vì vậy, ý tưởng của tôi là lặp đi lặp lại trên mảng render .

Nhưng điều đó KHÔNG làm việc:

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

Tôi nhận được : Exception: Object of type Drupal\node\Entity\Node cannot be printed.

Tôi nghĩ rằng tôi đang lặp lại các khóa / giá trị của mảng kết xuất so với các mục bên trong trường (nếu tôi in ra một chữ "X" trong mỗi vòng lặp, tôi nhận được 20 X trong khi tôi chỉ có hai hoặc ba giá trị trong trường này) .

Tôi muốn để lặp qua content.field_admin_tags.0, content.field_admin_tags.1vv

Bất kỳ ý tưởng làm thế nào để khắc phục điều này? Cảm ơn.


1
Vấn đề trên do drupal.org/node/2776307
gagarine

Câu trả lời:


15

Bạn có thể sửa lỗi này trong một cành cây. Ở đó bạn có thể sử dụng vòng lặp hiện có để lặp lại các mục trường:

node.html.twig

{{ content.field_admin_tags }}

trường - trường-admin-tags.html.twig

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

Ví dụ này thay thế <div>bằng <ul>. Không xóa {{ attributes }}hoặc bỏ qua mẫu trường, xem Điều gì có thể phá vỡ quickedit và làm cách nào để khắc phục nó?


Điều này được gọi từ mẫu chính với{{ content.field_admin_tags }}
aydow

23

Đồng ý với 4k4, mẫu trường là nơi tốt nhất, nếu bạn thực sự muốn nó trong mẫu thực thể (ví dụ nút), bạn có thể làm một cái gì đó như thế này:

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

Nhưng thành thật mà nói tôi nghĩ nó hơi xấu, mẫu trường là đúng nơi.


1
Đồng ý, nó hơi xấu. ;) Cảm ơn vì đoạn mã, mặc dù.
AngularChef

Hoạt động hoàn hảo với các loại quyền lợi khác nhau
Barshe CARON

11

Nếu bạn, giống như tôi, đang tìm cách lặp lại các đoạn trên mẫu twig của một nút, đây là cách thực hiện:

Giả sử bạn có một nút với trường đoạn văn đa trị, vì vậy trình soạn thảo nội dung có thể tạo nhiều đoạn và bạn muốn lặp lại qua từng đoạn trên mẫu twig của nút (ví dụ: để thêm một trình bao quanh mỗi đoạn):

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

CẬP NHẬT: Tôi cần tìm một cách khác để in tất cả các đoạn mà không sử dụng nội dung. Biến nội dung chứa mọi thứ bạn thiết lập trong phần 'Quản lý hiển thị' của nút, nhưng phương pháp công việc hiện tại của tôi là không bao giờ sử dụng 'Quản lý hiển thị' cũng như bố cục vì bạn thực sự có thể truy cập tất cả dữ liệu trong tệp twig nút và gần như tất cả cài đặt bạn sẽ thực hiện trên 'Quản lý hiển thị', như áp dụng kiểu ảnh hoặc đặt định dạng ngày, ... bạn có thể thực hiện trực tiếp trong twig.

Đối với tôi đây là một lợi thế bởi vì tôi biết rằng mọi thứ tôi thấy đều xuất phát từ tệp twig và tôi không cần phải tìm một số cài đặt trường tối nghĩa có thể thêm các lớp ở đâu đó. Vì vậy, mọi thứ tôi thấy chỉ đến từ một nơi (tệp twig nút) chứ không phải là sự kết hợp của tệp twig và màn hình hiển thị quản lý.

Dù sao, bằng cách sử dụng mô-đun Twig Tweak tuyệt vời, đây là cách in trường đoạn đa giá trị trong tệp twig của nút mà không phải sử dụng biến nội dung:

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

1

Tôi đã tìm thấy #itemstài sản hữu ích khi xây dựng các vòng có độ dài không xác định trong 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

Nếu bạn muốn đặt các hàm bao bổ sung xung quanh các trường bên trong trường đoạn văn hoặc vì lý do nào đó một giá trị trường tham chiếu đoạn cụ thể, bạn có thể làm như sau:

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

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

{% endfor %}

Bằng cách thực hiện {{kint(content.paragraph_field_name[key])}}, bạn sẽ thấy rằng các trường có thể truy cập được bên trong phần ['#par Đoạn'] của mảng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.