Score:0

องค์ประกอบไฟล์ที่ได้รับการจัดการในโมดูลฟิลด์ที่กำหนดเองไม่บันทึกรหัสเป้าหมาย

ธง in

ฉันปวดหัวกับปัญหานี้มาสองสามวันแล้ว การใช้ 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('จำนวนเต็ม')

ฉันได้รับข้อผิดพลาดประเภทดั้งเดิมเนื่องจากองค์ประกอบไฟล์ที่ได้รับการจัดการต้องการอาร์เรย์ ข้อเสนอแนะใด ๆ ขอบคุณ!

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา