ฉันปวดหัวกับปัญหานี้มาสองสามวันแล้ว การใช้ Drupal 9.2.x ฉันกำลังสร้างโมดูลฟิลด์แบบกำหนดเองสำหรับลูกค้าที่มีหลายฟิลด์ ฉันได้แยกปัญหาโดยการรวมเฉพาะฟิลด์ไฟล์ที่มีการจัดการไว้ในขณะนี้ เนื่องจากฟิลด์อื่นๆ ไม่ได้เป็นสาเหตุของปัญหานี้
ฉันกำหนดองค์ประกอบไฟล์ที่ได้รับการจัดการในคลาส Widget ซึ่งขยาย WidgetBase:
ฟังก์ชันสาธารณะ formElement (FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
    $องค์ประกอบ['target_id'] = [
      '#type' => 'managed_file',
      '#title' => $this->t('ภาพขวา'),
      '#upload_location' => 'สาธารณะ://disco-field-images/',
      '#upload_validators' => อาร์เรย์(
        'file_validate_extensions' => อาร์เรย์('gif png jpg jpeg')
      ),
      '#default_value' => อาร์เรย์($items[$delta]->target_id),
    ];
    ส่งคืนองค์ประกอบ $;
  }
ฉันกำหนดสคีมาเป็นดังนี้ในคลาส Item ของฉัน:
 สคีมาของฟังก์ชันสแตติกสาธารณะ (FieldStorageDefinitionInterface $field_definition) {
กลับ [
  'คอลัมน์' => [
    'target_id' => [
      'description' => 'ID ของเอนทิตีไฟล์',
      'type' => 'int',
      'ไม่ได้ลงนาม' => จริง,
    ]
  ]
  'ดัชนี' => [
    'target_id' => ['target_id'],
  ]
  'คีย์ต่างประเทศ' => [
    'target_id' => [
      'table' => 'file_managed',
      'คอลัมน์' => ['target_id' => 'fid'],
    ]
  ]
];
}
และสุดท้าย ฉันได้เพิ่มคำนิยามคุณสมบัติสำหรับฟิลด์:
คุณสมบัติฟังก์ชันคงสาธารณะคำนิยาม (FieldStorageDefinitionInterface $field_definition) {
$properties['target_id'] = ListDataDefinition::create('จำนวนเต็ม')
  ->setLabel(t('รหัสเป้าหมาย'))
  ->setRequired(เท็จ);
 ส่งคืนคุณสมบัติ $;
  }
ด้วยวิธีใดสิ่งนี้ส่งผลให้ไฟล์ถูกอัปโหลดไปยังตารางไฟล์ที่มีการจัดการ ได้รับข้อผิดพลาดและทุกอย่างก็ดูดีจากที่นั่น อย่างไรก็ตาม ตารางฟิลด์ (node__fieldname) ซึ่งมีการอ้างอิง target_id ไปยังตาราง file_managed จะใช้ค่าเริ่มต้นเป็น 1 เสมอ ดังนั้นจึงไม่มีการอ้างอิงถึงไฟล์ที่อัปโหลด ฉันได้ลองทำงานกับคำจำกัดความคุณสมบัติอื่น ๆ :
    $properties['target_id'] = DataDefinition::create('จำนวนเต็ม')
  ->setLabel(t('รหัสเป้าหมาย'));
และ
$properties['target_id'] = DataReferenceTargetDefinition::create('จำนวนเต็ม')
 ->setLabel('Foreign key ที่อ้างอิงไฟล์ที่จัดการ')
 ->setSetting('ไม่ได้ลงชื่อ', TRUE)
 ->setRequired(เท็จ);
แต่ไม่มีโชคที่นั่น ดูเหมือนว่าจะแปลกสำหรับฉันที่ ID เป้าหมายของฐานข้อมูลต้องเป็นจำนวนเต็มและวิดเจ็ตอัปโหลดไฟล์ทำงานร่วมกับอาร์เรย์ นั่นเป็นเหตุผลที่ฉันมุ่งเป้าไปที่คำจำกัดความของคุณสมบัติ/สคีมาเป็นต้นเหตุที่นี่ ถ้าฉันพยายามทำงานกับค่าคุณสมบัติ int ค่าเดียว:
DataDefinition::create('จำนวนเต็ม')
ฉันได้รับข้อผิดพลาดประเภทดั้งเดิมเนื่องจากองค์ประกอบไฟล์ที่ได้รับการจัดการต้องการอาร์เรย์ ข้อเสนอแนะใด ๆ ขอบคุณ!