Tôi đã suy nghĩ về vấn đề này trong vài ngày nay. Sử dụng Drupal 9.2.x, tôi đang xây dựng mô-đun trường tùy chỉnh cho ứng dụng khách có nhiều trường. Hiện tại, tôi đã tách riêng sự cố bằng cách chỉ bao gồm một trường tệp được quản lý vì các trường khác không gây ra sự cố này.
Tôi đã xác định một phần tử tệp được quản lý trong lớp Widget của mình, lớp này mở rộng WidgetBase:
hàm công khai formElement(FieldItemListInterface $items, $delta, mảng $element, mảng &$form, FormStateInterface $form_state) {
$element['target_id'] = [
'#type' => 'tệp được quản lý',
'#title' => $this->t('Hình bên phải'),
'#upload_location' => 'public://disco-field-images/',
'#upload_validators' => mảng(
'file_validate_extensions' => mảng('gif png jpg jpeg')
),
'#default_value' => mảng($items[$delta]->target_id),
];
trả lại phần tử $;
}
Tôi đã định nghĩa lược đồ của mình như sau trong lớp Mục của mình:
lược đồ hàm tĩnh công khai (FieldStorageDefinitionInterface $field_definition) {
trở lại [
'cột' => [
'id_mục tiêu' => [
'description' => 'ID của thực thể tệp',
'loại' => 'int',
'không dấu' => ĐÚNG,
],
],
'chỉ mục' => [
'id_mục_tiêu' => ['id_mục_tiêu'],
],
'khóa ngoại' => [
'id_mục tiêu' => [
'bảng' => 'file_managed',
'cột' => ['id_mục tiêu' => 'fid'],
],
],
];
}
Và cuối cùng, tôi đã thêm một định nghĩa thuộc tính cho trường:
public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
$properties['target_id'] = ListDataDefinition::create('integer')
->setLabel(t('ID mục tiêu'))
-> setRequired(FALSE);
trả lại thuộc tính $;
}
Bằng cách nào đó, điều này dẫn đến việc tệp được tải lên bảng tệp được quản lý, nhận được fid và tất cả đều ổn từ đó. Tuy nhiên, bảng trường (node__fieldname) chứa target_id tham chiếu đến bảng file_managed bằng cách nào đó luôn mặc định là 1. Vì vậy, không có tham chiếu nào được tạo cho tệp đã tải lên. Tôi đã thử làm việc với các định nghĩa thuộc tính khác:
$properties['target_id'] = DataDefinition::create('integer')
->setLabel(t('ID mục tiêu'));
và
$properties['target_id'] = DataReferenceTargetDefinition::create('integer')
->setLabel('Tệp được quản lý tham chiếu khóa ngoại')
->setSetting('không dấu', TRUE)
-> setRequired(FALSE);
Nhưng không có may mắn ở đó. Tuy nhiên, có vẻ hơi lạ đối với tôi, id mục tiêu cơ sở dữ liệu cần phải là số nguyên và tiện ích tải lên tệp hoạt động với một mảng. Đó là lý do tại sao tôi nhắm đến các định nghĩa/lược đồ thuộc tính như một nguyên nhân ở đây. Nếu tôi cố gắng làm việc với một giá trị thuộc tính int:
DataDefinition::create('số nguyên')
Tôi gặp lỗi kiểu nguyên thủy vì phần tử tệp được quản lý mong đợi một mảng. Bất kỳ đề xuất? Cảm ơn!