Điểm:3

Làm cách nào tôi có thể tạo mảng kết xuất dẫn đến chuỗi thay vì đối tượng Drupal\Core\Render\Markup?

lá cờ in

tôi muốn sử dụng Twig Tweak's drupal_view() để hiển thị dạng xem trong mẫu đoạn văn của tôi. Tôi có một vài trường tham chiếu thực thể trên đoạn văn và cần ID của các thực thể được tham chiếu được chuyển dưới dạng đối số bộ lọc theo ngữ cảnh.

tôi đã xây dựng một Chuỗi bộ lọc theo ngữ cảnh bộ định dạng trường để định dạng chuỗi bộ lọc theo ngữ cảnh với hy vọng rằng nó có thể được chuyển trực tiếp dưới dạng giá trị của đối số. Trình định dạng sẽ trở lại tất cả các nếu trường tham chiếu trống, nếu không, nó sẽ trả về ID thực thể được tham chiếu dưới dạng một chuỗi có dấu phân cách AND/OR, ví dụ: 1,2,3 cho VÀ hoặc 1+2+3 Cho hoặc.

Bên trong mẫu của tôi, tôi đang cố hiển thị chế độ xem bằng nhánh sau:

{% set arg1 = content.field_arg1|render %}
{% set arg2 = content.field_arg2|render %}

{{ drupal_view('my_view', 'my_display', arg1, arg2) }}

Dường như không hiệu quả!

Thay vì chuỗi, các biến arg của tôi thực sự là Drupal\Core\Render\Markup các đối tượng để các đối số không được truyền chính xác cho dạng xem.

Sau khi nghiên cứu, tôi thấy rằng tôi có thể giải quyết vấn đề này bằng cách lọc các biến đối số của mình bằng bộ lọc php trả về một chuỗi. Ví dụ: sử dụng bộ lọc trim hoạt động:

{% set arg1 = content.field_arg1|render|trim %}
{% set arg2 = content.field_arg2|render|trim %}

{{ drupal_view('my_view', 'my_display', arg1, arg2) }}

Nếu có thể, tôi muốn xây dựng một mảng kết xuất không yêu cầu bất kỳ bước chân ưa thích nào trong mẫu để chuyển các giá trị cho drupal_view() chức năng. I E. một mảng kết xuất nơi tôi có thể vượt qua nội dung.field_arg1 hoặc nội dung.field_arg|render trực tiếp như các đối số. Điều này có thể không?

Kết xuất các mảng tôi đã thử nhưng không hoạt động:

$inline_template = [
  '#type' => 'inline_template',
  '#template' => '{{ contextual_filter_string }}', // cũng đã thử với bộ lọc |trim tại đây
  '#bối cảnh' => [
    'contextual_filter_string' => '1+2+3',
  ],
];

đánh dấu $ = [
  '#markup' => '1+2+3',
];

$plain_text = [
  '#plain_text' => '1+2+3',
];

Lưu ý: không được hiển thị trong các mảng kết xuất ở trên là siêu dữ liệu bộ đệm (thẻ) cho các thực thể được tham chiếu trong trường.

Có, có nhiều cách khác để lấy các giá trị trường này và chuyển chúng tới drupal_view(), tuy nhiên đó không phải là vấn đề của câu hỏi này. Tôi muốn sử dụng Trình định dạng trường để trả về một mảng kết xuất (tôi nghĩ rằng tôi phải trả về một mảng kết xuất) dẫn đến một chuỗi sẵn sàng được chuyển trực tiếp tới drupal_view(). Điều này cho phép tôi định cấu hình định dạng của đối số trong giao diện người dùng mà không cần chạm vào mã. Tôi nghi ngờ điều này là không thể.

Một số phương pháp thay thế mà tôi đã xem xét:

  • Tôi có thể xử lý trước đoạn văn của mình và thêm các chuỗi bộ lọc này vào biến $ mảng.
  • Tôi có thể xây dựng hàm twig của riêng mình để tạo các chuỗi bộ lọc theo ngữ cảnh này.
  • Tôi có thể lấy các giá trị trực tiếp từ thực thể trong mẫu của mình, ví dụ: đoạn.field_arg1.target_id như Les Lim đã trả lời, nhưng điều này không hoạt động rõ ràng đối với các trường đa giá trị.

Chỉnh sửa: Có vẻ như điều này là không thể nên chấp nhận câu trả lời của Les Lim là giải pháp thay thế tốt nhất.

4uk4 avatar
lá cờ cn
Đối với PHP, hãy xem https://drupal.stackexchange.com/questions/207699/how-to-get-an-array-of-referenced-entity-ids-from-an-entity-reference-field. Nếu bạn sử dụng Drupal Twig phiên bản 2.14 hiện tại, điều này cũng có thể thực hiện được trong Twig. Xem https://twig.symfony.com/doc/2.x/filters/column.html
Les Lim avatar
lá cờ us
Tôi đã chỉnh sửa câu trả lời của mình và sau đó làm mới để xem phần phụ lục của bạn cho câu hỏi ở phía dưới. Tôi không chắc mình có câu trả lời trực tiếp cho bạn; Tôi nghĩ điều bạn đang khám phá là hệ thống định dạng trường không được thiết kế để sử dụng theo cách mà bạn đang cố gắng sử dụng. Nó giả định rằng nó sẽ trả về đánh dấu HTML đã lọc/thoát, không phải các chuỗi thô chưa thoát mà bạn muốn sử dụng làm đối số Chế độ xem.
sonfd avatar
lá cờ in
@LesLim - Vâng, cảm ơn bạn, đó cũng là ấn tượng của tôi. Tôi thực sự muốn trình định dạng hoạt động trơn tru vì nó giúp dễ dàng định cấu hình và sử dụng lại mà không cần nhiều kiến ​​thức về PHP hoặc Twig. Các chỉnh sửa của bạn rất hữu ích, mặc dù cuối cùng nó không trả lời được câu hỏi của tôi.
Les Lim avatar
lá cờ us
@ 4k4 Cảm ơn mẹo về bộ lọc cột của Twig! Tôi đã chỉnh sửa lại câu trả lời của mình.
Điểm:7
lá cờ us

Phản hồi ban đầu, giả sử bạn chỉ cần một giá trị từ mỗi trường:

Thay vì sử dụng đầu ra trường được hiển thị mà bạn nhận được với các mục trong {{ Nội dung }} mảng, có lẽ bạn nên sử dụng các giá trị thô trực tiếp từ thực thể.Các giá trị thô có nhiều khả năng là những gì đối số Chế độ xem của bạn đang tìm kiếm ngay từ đầu.

Trong Drupal 8/9, nếu thực thể thô có sẵn cho mẫu Twig (và nó dành cho mẫu Đoạn văn), bạn có thể sử dụng ký hiệu API Thực thể để nhận các giá trị thô chính xác từ thực thể của mình:

{% đặt arg1 = đoạn.field_arg1.target_id %}
{% đặt arg2 = đoạn.field_arg2.target_id %}

Phụ lục, vì cần nhiều giá trị trường thô được kết hợp với nhau

Sau khi đọc lại câu hỏi, tôi nhận ra rằng bạn cần tất cả các giá trị thô từ một trường được nối với nhau bằng một chuỗi. Mô-đun đóng góp Giá trị trường Twig cung cấp cho bạn các công cụ chung tiện dụng cho mục đích chính xác này. Trong trường hợp này, bạn sẽ sử dụng nó trường_raw lọc:

{% set arg1 = content.field_arg1|field_raw('target_id')|safe_join('+') %}
{% set arg2 = content.field_arg2|field_raw('target_id')|safe_join(',') %}

Chỉnh sửa: Tham gia nhiều giá trị trường thô mà không có Giá trị trường Twig (cảm ơn 4k4 về mẹo)

Bạn không thực sự cần Giá trị Trường Twig để có được target_id các giá trị từ trường nhiều giá trị - bạn có thể trích xuất nhiều giá trị từ trường thực thể thô bằng cách sử dụng tích hợp sẵn của Twig cột lọc.

{% set arg1 = đoạn.field_arg1|column('target_id')|safe_join('+') %}
{% set arg2 = đoạn.field_arg2|column('target_id')|safe_join(',') %}
sonfd avatar
lá cờ in
Ném `|default('all')` vào cuối và bạn thậm chí có thể lấy `all` làm giá trị nếu trường trống.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.