Làm cách nào để truy cập dữ liệu trường trong Twig?


15

Tôi có một trường danh sách cho loại khối tùy chỉnh trông như thế này:

left|Align left
right|Align right

Tôi có thể truy cập khóa trong Twig bằng cách làm như thế này:

{% block content %}
  {{ content.field_align }}  {# outputs 'right' #}
{% endblock %}

Tuy nhiên, nếu tôi làm một so sánh đơn giản, nó xuất ra FALSE.

{{ kint(content.field_align == 'right') }}

Các mã sau đây trả về TRUE.

{{ kint(content.field_align['#items'].getValue()|first.value == 'right') }}

Có phiên bản ngắn hơn để nhận chuỗi "thực" để tôi có thể sử dụng bộ lọc chuỗi Twigs và giữ cho nó gọn gàng không?


Câu trả lời:


16

content chứa các mảng kết xuất dựa trên các trình định dạng được cấu hình.

Nếu bạn muốn truy cập các giá trị thực tế, bạn muốn truy cập chúng thông qua đối tượng thực thể. Thông thường, điều đó đã có sẵn cho mẫu của bạn, ví dụ node. Đối với trường hợp của bạn, nó hơi đặc biệt vì block_content được hiển thị trong nội dung khối mà không có mẫu riêng của nó, vì vậy bạn phải tự cung cấp nó theo cách yourtheme_preprocess_block($variables)như sau:

if (isset($variables['elements']['content']['#block_content'])) {
  $variables['block_content'] = $variables['elements']['content']['#block_content'];
}

Sau đó, bạn có thể truy cập một giá trị trường với block_content.field_name.property. Vì vậy, trong trường hợp của bạn , block_content.field_align.value. Thuộc tính valuedành cho hầu hết các loại trường, cho các tham chiếu, bạn có thể sử dụng target_idcho ID hoặc entitycho đối tượng thực thể được tham chiếu. Có, bạn có thể truy cập trực tiếp vào các trường trên đó, nhưng hãy đảm bảo luôn kiểm tra xem tham chiếu có tồn tại không nếu không bạn có thể gặp phải lỗi nghiêm trọng hoặc ngoại lệ. Ví dụ, để truy cập nhãn của một tham chiếu hạn, bạn có thể truy cập nó dưới dạng block_content.field_tags.entity.name.value.

Nếu bạn không chỉ định trường delta, nó sẽ mặc định là trường đầu tiên. Nếu bạn muốn truy cập một delta khác, bạn có thể sử dụng entity.field_name.1.valuevà cứ thế. Bạn cũng có thể lặp qua chúng.

Đây là tất cả các bản đồ trực tiếp tới PHP, bạn cũng có thể thực hiện $block_content->field_tags->entity->name->valuetrong tiền xử lý và các nơi khác mà bạn có block_content.


Cảm ơn câu trả lời của bạn! Khi tôi đang làm điều này từ mẫu twig khối nơi đối tượng nút không có sẵn (chủ đề phụ "Classy"), tôi có cần xử lý trước các giá trị và tiêm chúng vào không?
estrar

Xin lỗi, tôi đã bỏ lỡ phần block_content. Cập nhật câu trả lời.
Berdir

Hoàn hảo! Tôi có thể nhận được các giá trị bằng cách làm điều này: block_content.field_name.value Cảm ơn bạn đã giúp tôi hiểu!
estrar

6

Đây là một cách thay thế, mẫu duy nhất cho phép bạn kết xuất một mảng kết xuất và kiểm tra giá trị của nó (cho phép kiểm tra biến như thể bạn đang in nó, bởi vì in trong Drupal 8 Twig sẽ tự động kết xuất các biến là mảng kết xuất):

{{ kint(content.field_align|render == 'right') }}

Hoặc một tùy chọn khác để lưu kết xuất thêm nếu bạn đang in biến sau:

{% set field_align = content.field_align|render %}
{{ kint(field_align == 'right') }}

{{ field_align }}

Rất hữu ích và tốt để biết! Cảm ơn các đầu vào.
estrar

2

Bạn có thể sử dụng mô-đun Twig Field Value trong trường hợp này. Nó cho phép lấy dữ liệu một phần từ mảng kết xuất trường. Dành cho người cũ content.field_name | field_value -get giá trị của trường. Bạn có thể sử dụng nó trong câu lệnh IF

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.