Score:3

ฉันจะสร้างอาร์เรย์เรนเดอร์ที่ให้ผลลัพธ์เป็นสตริงแทนที่จะเป็นวัตถุ Drupal\Core\Render\Markup ได้อย่างไร

ธง in

ฉันต้องการใช้ Twig Tweak's drupal_view() เพื่อแสดงมุมมองในเทมเพลตย่อหน้าของฉัน ฉันมีฟิลด์อ้างอิงเอนทิตีสองสามฟิลด์ในย่อหน้า และต้องการ ID ของเอนทิตีที่อ้างอิงผ่านเป็นอาร์กิวเมนต์ตัวกรองตามบริบท

ฉันสร้าง สตริงตัวกรองบริบท ตัวจัดรูปแบบฟิลด์เพื่อจัดรูปแบบสตริงตัวกรองบริบทโดยหวังว่าจะสามารถส่งผ่านเป็นค่าของอาร์กิวเมนต์ได้โดยตรง ตัวจัดรูปแบบจะกลับมา ทั้งหมด หากฟิลด์อ้างอิงว่างเปล่า มิฉะนั้น จะส่งคืน ID เอนทิตีที่อ้างอิงเป็นสตริงที่มีตัวคั่น AND/OR เช่น 1,2,3 สำหรับ และ หรือ 1+2+3 สำหรับ OR

ภายในเทมเพลตของฉัน ฉันกำลังพยายามแสดงมุมมองด้วยกิ่งไม้ต่อไปนี้:

{% set arg1 = content.field_arg1|แสดงผล %}
{% set arg2 = content.field_arg2|เรนเดอร์ %}

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

แต่มันไม่ทำงาน!

ตัวแปร arg ของฉันแทนที่จะเป็นสตริง Drupal\Core\Render\มาร์กอัป วัตถุเพื่อให้อาร์กิวเมนต์ไม่ถูกส่งผ่านไปยังมุมมองอย่างถูกต้อง

หลังจากการค้นคว้า ฉันพบว่าฉันสามารถแก้ไขปัญหานี้ได้โดยการกรองตัวแปร arg ของฉันด้วยตัวกรอง php ที่ส่งคืนสตริง ตัวอย่างเช่น การใช้ตัวกรองการตัดแต่งทำงาน:

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

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

ถ้าเป็นไปได้ ฉันต้องการสร้างอาร์เรย์การเรนเดอร์ที่ไม่ต้องใช้ฟุตเวิร์กแฟนซีใดๆ ในเทมเพลตเพื่อส่งค่าไปยัง drupal_view() การทำงาน. เช่น. อาร์เรย์เรนเดอร์ที่ฉันสามารถผ่านไปได้ content.field_arg1 หรือ content.field_arg|แสดงผล โดยตรงเป็นข้อโต้แย้ง เป็นไปได้ไหม

Render arrays ที่ฉันได้ลองใช้งานไม่ได้:

$อินไลน์_เทมเพลต = [
  '#type' => 'inline_template',
  '#template' => '{{ contextual_filter_string }}', // ลองด้วย |trim filter ที่นี่ด้วย
  '#บริบท' => [
    'contextual_filter_string' => '1+2+3',
  ]
];

$มาร์คอัพ = [
  '#markup' => '1+2+3',
];

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

หมายเหตุ: ที่ไม่แสดงในอาร์เรย์เรนเดอร์ด้านบนคือข้อมูลเมตาแคช (แท็ก) สำหรับเอนทิตีที่อ้างอิงในฟิลด์

ใช่ มีวิธีอื่นในการรับค่าฟิลด์เหล่านี้และส่งต่อไปยัง drupal_view()แต่นั่นไม่ใช่ประเด็นของคำถามนี้ ฉันต้องการใช้ตัวจัดรูปแบบฟิลด์เพื่อส่งคืนอาร์เรย์เรนเดอร์ (ฉันคิดว่าฉันต้องส่งคืนอาร์เรย์เรนเดอร์) ซึ่งส่งผลให้สตริงพร้อมที่จะส่งผ่านโดยตรงไปยัง drupal_view(). สิ่งนี้ทำให้ฉันสามารถกำหนดค่ารูปแบบของอาร์กิวเมนต์ใน UI โดยไม่ต้องแตะโค้ด ฉันสงสัยว่านี่เป็นไปไม่ได้

แนวทางอื่นที่ฉันพิจารณา:

  • ฉันสามารถประมวลผลย่อหน้าล่วงหน้าและเพิ่มสตริงตัวกรองเหล่านี้ใน $ตัวแปร อาร์เรย์
  • ฉันสามารถสร้างฟังก์ชันกิ่งไม้ของตัวเองเพื่อสร้างสตริงตัวกรองตามบริบทเหล่านี้
  • ฉันสามารถรับค่าได้โดยตรงจากเอนทิตีในเทมเพลตของฉัน เช่น ย่อหน้า.field_arg1.target_id ดังที่ Les Lim ตอบ แต่สิ่งนี้ใช้ไม่ได้กับฟิลด์ที่มีหลายค่า

แก้ไข: ดูเหมือนว่าจะเป็นไปไม่ได้ ดังนั้นการยอมรับคำตอบของ Les Lim เป็นทางเลือกที่ดีที่สุด

4uk4 avatar
cn flag
สำหรับ PHP โปรดดู https://drupal.stackexchange.com/questions/207699/how-to-get-an-array-of-referenced-entity-ids-from-an-entity-reference-field หากคุณใช้ Drupal Twig เวอร์ชัน 2.14 เวอร์ชันปัจจุบัน ก็สามารถทำได้ใน Twig ดู https://twig.symfony.com/doc/2.x/filters/column.html
Les Lim avatar
us flag
ฉันแก้ไขคำตอบแล้วรีเฟรชเพื่อดูภาคผนวกของคำถามที่ด้านล่าง ฉันไม่แน่ใจว่าฉันมีคำตอบโดยตรงสำหรับคุณ ฉันคิดว่าสิ่งที่คุณกำลังค้นพบคือระบบตัวจัดรูปแบบฟิลด์ไม่ได้ออกแบบมาให้ใช้ในแบบที่คุณกำลังพยายามใช้อยู่ โดยจะถือว่าควรส่งคืนมาร์กอัป HTML ที่กรอง/ใช้ Escape ไม่ใช่สตริงดิบที่ไม่ใช้ Escape ที่คุณต้องการใช้เป็นอาร์กิวเมนต์ View
sonfd avatar
in flag
@LesLim - ใช่ ขอบคุณ นั่นคือความประทับใจของฉันเช่นกัน ฉันต้องการให้ฟอร์แมตเตอร์ทำงานได้อย่างหมดจดจริงๆ เพราะมันจะทำให้กำหนดค่าและนำกลับมาใช้ใหม่ได้ง่ายโดยไม่ต้องมีความรู้เรื่อง PHP หรือ Twig มากนัก การแก้ไขของคุณมีประโยชน์ แม้ว่าท้ายที่สุดแล้วจะไม่ตอบคำถามของฉันก็ตาม
Les Lim avatar
us flag
@ 4k4 ขอบคุณสำหรับคำแนะนำเกี่ยวกับตัวกรองคอลัมน์ของ Twig! ฉันแก้ไขคำตอบอีกครั้ง
Score:7
ธง us

คำตอบเดิม โดยสมมติว่าคุณต้องการเพียงค่าเดียวจากแต่ละฟิลด์:

แทนที่จะใช้เอาต์พุตฟิลด์ที่แสดงผลซึ่งคุณได้รับจากรายการใน {{ เนื้อหา }} อาร์เรย์ คุณน่าจะใช้ค่าดิบโดยตรงจากเอนทิตีค่าดิบมีแนวโน้มที่จะเป็นสิ่งที่อาร์กิวเมนต์ Views ของคุณกำลังมองหาตั้งแต่แรก

ใน Drupal 8/9 ถ้าเอนทิตีดิบพร้อมใช้งานสำหรับเทมเพลต Twig (และสำหรับเทมเพลตย่อหน้า) คุณสามารถใช้รูปแบบ Entity API เพื่อรับค่าดิบที่แน่นอนจากเอนทิตีของคุณ:

{% set arg1 = paragraph.field_arg1.target_id %}
{% ตั้ง arg2 = วรรค.field_arg2.target_id %}

ภาคผนวก สำหรับการรวมค่าฟิลด์ดิบหลายค่าเข้าด้วยกัน

หลังจากอ่านคำถามอีกครั้ง ฉันรู้ว่าคุณต้องการค่าดิบทั้งหมดจากฟิลด์ที่รวมเข้าด้วยกันด้วยสตริง โมดูลสนับสนุน Twig Field Value มอบเครื่องมือทั่วไปที่มีประโยชน์สำหรับจุดประสงค์นี้ ในกรณีนี้ คุณจะใช้มัน field_raw กรอง:

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

แก้ไข: รวมค่าฟิลด์ดิบหลายค่าโดยไม่มีค่าฟิลด์ทวิก (ขอบคุณ 4k4 สำหรับคำแนะนำ)

คุณไม่จำเป็นต้องใช้ Twig Field Value เพื่อรับ target_id ค่าจากฟิลด์หลายค่า - คุณสามารถแยกค่าหลายค่าจากฟิลด์เอนทิตีดิบโดยใช้ในตัวของ Twig คอลัมน์ กรอง.

{% set arg1 = paragraph.field_arg1|column('target_id')|safe_join('+') %}
{% set arg2 = paragraph.field_arg2|column('target_id')|safe_join(',') %}
sonfd avatar
in flag
ใส่ `|default('all')` ต่อท้าย และคุณยังสามารถรับ `all` เป็นค่าได้หากฟิลด์นั้นว่างเปล่า

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา