ฉันมีรูปแบบการสร้างโหนดที่กำหนดเอง ฉันกำลังแสดงผลภายใน hook การประมวลผลล่วงหน้าของมุมมอง ในแบบฟอร์มนั้น ฉันมีช่องอ้างอิงเอนทิตีสองช่อง ฉันกำลังตั้งค่า [#value] และ [#default_value] ของฟิลด์อ้างอิงเหล่านั้นโดยทางโปรแกรม
ในแบบฟอร์ม การส่งค่าที่ฉันตั้งไว้จะถูกสร้างขึ้น แต่ถ้าฟิลด์นั้น "แก้ไขได้" โดยผู้ใช้ ฉันต้องการทำให้ฟิลด์ "ปิดใช้งาน" และ/หรือ "ซ่อน" จากผู้ใช้ ไม่เพียงแค่ซ่อนด้วย CSS แต่ด้วยวิดเจ็ตเติมข้อความอัตโนมัติทั้งหมดที่ไม่สามารถเข้าถึงได้ ช่องนี้ต้องเป็นประเภท "ซ่อน"
ฉันจะทำให้การอ้างอิงเอนทิตีเติมข้อความอัตโนมัติถูกปิดใช้งานและ/หรือไม่สามารถเข้าถึงได้โดยผู้ใช้ที่สร้างเนื้อหาได้อย่างไร
หรือพูดอีกอย่างคือ ฉันจะเพิ่มค่าอ้างอิงเอนทิตีโดยทางโปรแกรมในการส่งแบบฟอร์มโดยที่ผู้ใช้ไม่สามารถโต้ตอบกับฟิลด์ได้อย่างไร
นี่คือบางสิ่งที่ฉันได้ลองแล้วไม่ได้ผล:
- $form['field_entity_reference']['#access'] = เท็จ; // การตั้งค่า #access เป็นเท็จดูเหมือนว่าควรใช้งานได้เนื่องจากช่องแบบฟอร์มยังคงอยู่เมื่อดีบัก $form แต่ใช้งานไม่ได้เนื่องจากป้องกันไม่ให้ส่งค่า
- การเพิ่ม ['#attributes']['readonly'], เปลี่ยน ['#type'] เป็นซ่อนหรือวิดเจ็ตประเภทอื่น, เพิ่ม ['#attributed']['disabled'] ไม่มีการทำงาน
- เติมข้อมูลเอนทิตีล่วงหน้า - สิ่งนี้ใช้ไม่ได้กับสถานการณ์เฉพาะนี้เนื่องจากโทเค็นไม่สามารถระบุค่าบางค่าได้
รหัสสำหรับการอ้างอิง
ฟังก์ชัน <ธีม>_preprocess_views_view_field(&$ตัวแปร) {
$view = $ตัวแปร['ดู'];
ถ้า ($view->id() == '<view>') {
$field = $ตัวแปร['field'];
สวิตช์ ($field->ตัวเลือก['id']) {
กรณี '<view_field>':
$node = \Drupal::entityTypeManager()
->getStorage('โหนด')
->สร้าง (['type' => '<node_type>']);
$form = \Drupal::service('entity.form_builder')->getForm($node, 'secondary');
// ตั้งค่า default_value และค่า
$form['field_entity_reference']['widget']['#default_value'] = (int)$cid; // โปรดทราบว่านี่ใช้วิดเจ็ต "เลือกรายการ" สำหรับฟิลด์อ้างอิงเอนทิตี
$form['field_entity_reference']['widget']['#value'] = (int)$cid; //เหมือนข้างบน
//สิ่งที่ใช้ไม่ได้ ค่าจะไม่ส่งเว้นแต่ผู้ใช้จะแก้ไขฟิลด์ได้ หรือฟิลด์นั้นไม่ถูกซ่อน/ปิดใช้งาน
$form['field_entity_reference']['#access'] = เท็จ; // ค่าไม่ส่ง
$form['field_entity_reference']['widget'][0]['#attributes']['readonly'] = 'อ่านอย่างเดียว'; // ไม่ทำให้ฟิลด์อ่านอย่างเดียว
$form['field_entity_reference']['widget'][0]['value']['#type'] = 'ซ่อน'; // ดูเหมือนว่าวิดเจ็ตเติมข้อความอัตโนมัติและวิดเจ็ตที่เลือกไม่มีประเภท "ซ่อน"
$form['field_entity_reference']['widget'][0]['target_id']['#type'] = 'ช่องข้อความ'; // ดูเหมือนว่าจะไม่สามารถเปลี่ยนประเภทเป็น textfield ได้
// เปลี่ยนมุมมองฟิลด์เอาท์พุตเป็นฟอร์ม
$variables['output'] = $รูปแบบ;
หยุดพัก;
}
}
}