ฉันได้สร้างโมดูลที่กำหนดฟอร์ม แต่เมื่อฉันพยายามเพิ่มคอลัมน์ของลิงก์ มันว่างเปล่าเมื่อฉันตั้งค่า '#พิมพ์'
ถึง 'ลิงค์'
. ฉันกำลังทดสอบสิ่งนี้บน Drupal 9.3.x
บนพื้นผิวก็เหมือนกับ เพิ่มลิงค์ไปยังตารางเลือกแถวแต่คำตอบที่โพสต์นั้นไม่มีรหัสการทำงานที่สมบูรณ์ และฉันค่อนข้างแน่ใจว่าวิธีแก้ปัญหาในบริบทของฉันจะแตกต่างจากที่โพสต์ไว้ที่นั่น
นี่คือรหัสเต็มของคลาสที่ขยายออกไป ฟอร์มเบส
.
ใช้ Drupal\Core\Form\FormBase;
ใช้ Drupal\Core\Form\FormStateInterface;
คลาส MyForm ขยาย FormBase {
buildForm ฟังก์ชันสาธารณะ (อาร์เรย์ $form, \Drupal\Core\Form\FormStateInterface $form_state) {
// สร้าง fileNameOptions
$privatePath = 'ส่วนตัว://webform/upload/';
$linkPath = '/ระบบ/ไฟล์/เว็บฟอร์ม/อัพโหลด/';
$ templatePath = \Drupal::service('file_system')->realpath($privatePath);
$fileList = glob($ templatePath.'/*');
$fileNameOptions = [];
$pathLength = strlen($ templatePath);
foreach ($fileList เป็น $filePath) {
$fileName = substr($filePath, $pathLength + 1);
$fileNameOptions[ชื่อไฟล์] = [
'ชื่อไฟล์' => $ชื่อไฟล์,
'ลิงค์' => [
'ข้อมูล' => [
'#type' => 'ลิงค์',
'#url' => $linkPath $ชื่อไฟล์,
'#title' => $ชื่อไฟล์,
]
]
];
}
// สร้างตาราง Select
$form['แม่แบบ'] = [
'#type' => 'เลือกตาราง',
'#header' => ['filename' => 'ชื่อไฟล์', 'link' => 'Link'],
'#options' => $fileNameOptions,
'#empty' => t('ไม่พบไฟล์'),
'#น้ำหนัก' => 40,
'#js_select' => เท็จ
];
คืนฟอร์ม $;
}
/**
* {@inheritdoc}
*/
ฟังก์ชั่นสาธารณะ getFormId () {
กลับ 'my_form';
}
/**
* {@inheritdoc}
*/
ฟังก์ชันสาธารณะ submitForm (อาร์เรย์ &$form, FormStateInterface $form_state) {
parent::submitForm($form, $form_state);
}
}
ในบางบริบท ฟอร์มนี้พยายามแสดงรายการไฟล์ส่วนตัวที่อัปโหลดจากเว็บฟอร์มให้ผู้ดูแลระบบเห็น พร้อมลิงก์ที่ช่วยให้ตรวจสอบแต่ละไฟล์ได้ จุดประสงค์คือใช้ เลือกตาราง
เพื่อให้ผู้ดูแลระบบสามารถลบไฟล์ที่ไม่ต้องการได้ ฉันเข้าใจว่ามีผลกระทบด้านความปลอดภัย และแบบฟอร์มนี้ควรเข้าถึงได้เฉพาะผู้ดูแลระบบที่เชื่อถือได้เท่านั้น แสดงรายการไฟล์ที่ใช้งานได้ และฉันค่อนข้างแน่ใจว่าสามารถลบไฟล์ได้ ฉันมีเว็บฟอร์มที่แสดงลิงก์ได้อย่างถูกต้อง แต่มันจะเป็นประสบการณ์ของผู้ใช้ที่ดีกว่าหากฟอร์มการลบยังช่วยให้ผู้ดูแลระบบสามารถดูไฟล์ผ่านลิงก์ได้
ถ้าฉันเปลี่ยน '#พิมพ์'
ของช่องลิงค์จาก 'ลิงค์'
ถึง 'ช่องข้อความ'
หรือ 'พื้นที่ข้อความ'
คอลัมน์มีองค์ประกอบที่ฉันคาดหวัง - ชื่อเรื่องตามด้วยฟิลด์ข้อความหรือพื้นที่ข้อความ เมื่อฉันเปลี่ยน '#พิมพ์'
กลับไป 'ลิงค์'
(ตามที่แสดงในโค้ดด้านบน) คอลัมน์ว่างเปล่า เมื่อฉันดูแหล่งที่มาของหน้า คอลัมน์นั้นว่างเปล่า <td>
แท็ก
<td></td>
มันเหมือนกับว่าฉันเปลี่ยน '#พิมพ์'
ถึง 'ฟู'
. นี่หมายความว่าฉันว่า 'ลิงค์'
ไม่มีประเภทฟิลด์ในบริบทของแบบฟอร์มนี้ เพื่อทดสอบสิ่งนี้ ฉันพยายามปรับตัว ฉันจะรับประเภทฟิลด์แบบฟอร์มที่มีอยู่ทั้งหมดได้อย่างไร เข้ากับบริบทของ Drupal 9
$all_types = \Drupal::moduleHandler()->invokeAll('hook_elements');
\Drupal::messenger()->addMessage(json_encode($all_types));
อย่างไรก็ตาม, hook_elements()
ดูเหมือนจะไม่ได้ใช้อีกต่อไป ดังนั้นจึงใช้ไม่ได้
สร้างและเรนเดอร์องค์ประกอบ แสดง 'ลิงค์'
เป็นองค์ประกอบการเรนเดอร์ที่ถูกต้องใน Drupal 9.4.x ดังนั้นความเข้าใจของฉันคือควรมีอยู่ในรูปแบบที่สร้างโดยโมดูลที่กำหนดเอง
ความคิดเห็นผู้ดูแลระบบภาพรวม::buildForm()
แสดงการใช้งานที่คล้ายกันมากของ '#type' => 'ลิงค์'
.
การอ่านคำตอบที่มีอยู่ของฉันคือปัญหาคือไม่ได้เพิ่มคอลัมน์ใน '#หัวข้อ'
อาร์เรย์ (ไม่ปรากฏในรหัสที่โพสต์)
- ฉันพลาดรายละเอียดง่ายๆ ในโค้ดที่ฉันโพสต์ไว้ด้านบนหรือไม่ ซึ่งเป็นสาเหตุ
'ลิงค์'
ฟิลด์ว่างในขณะที่เปลี่ยน '#พิมพ์'
ถึง 'ช่องข้อความ'
ให้ผลตามที่คาดหวัง?
- มีวิธีตรวจสอบชุดที่ถูกต้องหรือไม่
'#พิมพ์'
สตริงในบริบทของฉัน?
- ถ้า
'ลิงค์'
ประเภทฟิลด์ไม่พร้อมใช้งานในบริบทของฉัน ฉันจะทำให้พร้อมใช้งานได้อย่างไร
ไม่มีการเพิ่มสิ่งใดในบันทึกของ Drupal เมื่อฉันโหลดแบบฟอร์มนี้