Рейтинг:0

Элемент управляемого файла в модуле настраиваемого поля не сохраняет целевой идентификатор

флаг in

Уже несколько дней ломаю голову над этим вопросом. Используя 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::создать('целое число')

Я получаю ошибку примитивного типа, потому что элемент управляемого файла ожидает массив. Какие-либо предложения? Спасибо!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.