ฉันจะเข้าถึงข้อมูลฟิลด์ใน Twig ได้อย่างไร


15

ฉันมีช่องรายการสำหรับประเภทบล็อกที่กำหนดเองที่มีลักษณะดังนี้:

left|Align left
right|Align right

ฉันสามารถเข้าถึงกุญแจในทวิกได้โดยทำสิ่งนี้:

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

อย่างไรก็ตามถ้าฉันทำการเปรียบเทียบแบบง่าย ๆ มันจะแสดงผลออกFALSEมา

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

TRUEผลตอบแทนที่ได้รหัสต่อไปนี้

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

มีรุ่นที่สั้นกว่าสำหรับการรับสตริง "ของจริง" เพื่อให้ฉันสามารถใช้ตัวกรองสตริง Twigs และเก็บเป็นระเบียบหรือไม่


ที่เกี่ยวข้อง: drupal.stackexchange.com/a/228393/15055
leymannx

คำตอบ:


16

content มีอาร์เรย์เรนเดอร์ตามรูปแบบที่กำหนดไว้

หากคุณต้องการเข้าถึงค่าจริงคุณต้องการเข้าถึงค่าเหล่านั้นผ่านวัตถุเอนทิตี โดยปกติจะมีให้สำหรับแม่แบบของคุณnodeแล้ว สำหรับกรณีของคุณมันค่อนข้างพิเศษเพราะ block_content ถูกแสดงในเนื้อหาบล็อกโดยไม่มีเทมเพลตของตัวเองดังนั้นคุณต้องทำให้มันเป็นyourtheme_preprocess_block($variables)แบบนี้:

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

block_content.field_name.propertyจากนั้นคุณสามารถเข้าถึงข้อมูลที่มีค่า block_content.field_align.valueดังนั้นในกรณีของคุณ คุณสมบัติvalueสำหรับชนิดฟิลด์ส่วนใหญ่สำหรับการอ้างอิงคุณสามารถใช้target_idสำหรับ ID หรือentityสำหรับวัตถุเอนทิตีที่อ้างอิง ใช่คุณสามารถเข้าถึงฟิลด์ต่างๆได้โดยตรง แต่อย่าลืมตรวจสอบเสมอว่ามีการอ้างอิงอยู่มิฉะนั้นคุณอาจพบข้อผิดพลาดหรือข้อยกเว้นร้ายแรง block_content.field_tags.entity.name.valueในการเข้าถึงป้ายชื่อของการอ้างอิงคำตัวอย่างเช่นคุณสามารถเข้าถึงได้เป็น

หากคุณไม่ได้ระบุเขตข้อมูลเดลต้ามันจะเริ่มต้นที่แรก หากคุณต้องการเข้าถึงเดลต้าอื่นคุณสามารถใช้entity.field_name.1.valueและอื่น ๆ นอกจากนี้คุณยังสามารถวนซ้ำพวกเขา

แผนที่ทั้งหมดนี้ตรงไปยัง PHP คุณยังสามารถทำ$block_content->field_tags->entity->name->valuepreprocess และสถานที่อื่น ๆ ที่คุณมี block_content


ขอบคุณสำหรับคำตอบ! ขณะที่ฉันทำสิ่งนี้จากเทมเพลตทวิบล็อกที่วัตถุโหนดไม่สามารถใช้งานได้ (sub-theming "Classy") ฉันจะต้องประมวลผลค่าล่วงหน้าแล้วฉีดเข้าไปหรือไม่?
estrar

ขออภัยฉันพลาดส่วน block_content อัปเดตคำตอบ
Berdir

ที่สมบูรณ์แบบ! ฉันสามารถรับค่าด้วยการทำเช่นนี้: block_content.field_name.value ขอบคุณที่ช่วยฉันเข้าใจ!
estrar

6

นี่คือทางเลือกเทมเพลตวิธีเดียวที่ให้คุณเรนเดอร์เรนเดอร์เรนเดอร์และตรวจสอบค่าของมัน (อนุญาตให้ตรวจสอบตัวแปรราวกับว่าคุณกำลังพิมพ์เพราะการพิมพ์ใน Drupal 8 Twig ทำให้ตัวแปรที่เรนเดอร์

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

หรือตัวเลือกอื่นเพื่อบันทึกการเรนเดอร์พิเศษหากคุณกำลังพิมพ์ตัวแปรในภายหลัง:

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

{{ field_align }}

มีประโยชน์มากและรู้ดี! ขอบคุณสำหรับการป้อนข้อมูล
estrar

2

คุณสามารถใช้โมดูลค่าฟิลด์ทวิกได้ในกรณีนี้ อนุญาตให้รับข้อมูลบางส่วนจากอาร์เรย์เรนเดอร์ฟิลด์ สำหรับอดีต content.field_name | field_value -get ค่าของฟิลด์ คุณสามารถใช้มันในคำสั่ง IF

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.