ฉันได้สร้างโมดูลที่กำหนดฟอร์ม แต่เมื่อฉันพยายามเพิ่มคอลัมน์ของลิงก์ มันว่างเปล่าเมื่อฉันตั้งค่า '#พิมพ์' ถึง 'ลิงค์'. ฉันกำลังทดสอบสิ่งนี้บน 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 เมื่อฉันโหลดแบบฟอร์มนี้