ฉันปวดหัวกับปัญหานี้มาสองสามวันแล้ว การใช้ 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('จำนวนเต็ม')
ฉันได้รับข้อผิดพลาดประเภทดั้งเดิมเนื่องจากองค์ประกอบไฟล์ที่ได้รับการจัดการต้องการอาร์เรย์ ข้อเสนอแนะใด ๆ ขอบคุณ!