Уже несколько дней ломаю голову над этим вопросом. Используя Drupal 9.2.x, я создаю модуль пользовательского поля для клиента, который имеет несколько полей. Я изолировал проблему, включив на данный момент только поле управляемого файла, потому что другие поля не вызывают эту проблему.
Я определил элемент управляемого файла в своем классе Widget, который расширяет WidgetBase:
публичная функция formElement(FieldItemListInterface $items, $delta, элемент массива $, массив &$form, FormStateInterface $form_state) {
$элемент['target_id'] = [
'#type' => 'managed_file',
'#title' => $this->t('Правильное изображение'),
'#upload_location' => 'public://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' => 'Идентификатор файловой сущности',
'тип' => 'целое',
'без знака' => ИСТИНА,
],
],
'индексы' => [
'target_id' => ['target_id'],
],
'внешние ключи' => [
'target_id' => [
'таблица' => 'файл_управляемый',
'columns' => ['target_id' => 'fid'],
],
],
];
}
И, наконец, я добавил определение свойства для поля:
общедоступная статическая функция propertyDefinitions (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('integer')
->setLabel('Внешний ключ, ссылающийся на управляемый файл')
->setSetting('без знака', ИСТИНА)
-> setRequired (ЛОЖЬ);
Но тут не повезло. Однако мне кажется немного странным, что идентификатор цели базы данных должен быть целым числом, а виджет загрузки файла работает с массивом. Вот почему я нацелен на определение/схему свойств в качестве причины здесь. Если я попытаюсь работать с одним значением свойства int:
DataDefinition::создать('целое число')
Я получаю ошибку примитивного типа, потому что элемент управляемого файла ожидает массив. Какие-либо предложения? Спасибо!