Score:0

Managed file element in custom field module doesn't save target id

in flag

I have been breaking my head on this issue for a few days now. Using Drupal 9.2.x, I am building a custom field module for a client that has multiple fields. I isolated the problem by only including a managed file field for now, because the other fields are not causing this issue.

I defined a managed file element in my Widget class, which extends WidgetBase:

public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {

    $element['target_id'] = [
      '#type' => 'managed_file',
      '#title' => $this->t('Right image'),
      '#upload_location' => 'public://disco-field-images/',
      '#upload_validators' => array(
        'file_validate_extensions' => array('gif png jpg jpeg')
      ),
      '#default_value' => array($items[$delta]->target_id),
    ];

    return $element;

  }

I defined my schema as follows in my Item class:

 public static function schema(FieldStorageDefinitionInterface $field_definition) {
return [
  'columns' => [
    'target_id' => [
      'description' => 'The ID of the file entity',
      'type' => 'int',
      'unsigned' => TRUE,
    ],
  ],
  'indexes' => [
    'target_id' => ['target_id'],
  ],
  'foreign keys' => [
    'target_id' => [
      'table' => 'file_managed',
      'columns' => ['target_id' => 'fid'],
    ],
  ],
];

}

And finally, I have added a property defintion for the field:

public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {

$properties['target_id'] = ListDataDefinition::create('integer')
  ->setLabel(t('target ID'))
  ->setRequired(FALSE);

 return $properties;

  }

Somehow this results in the file being uploaded into the managed files table, getting a fid and all looks well from there. However, the field table (node__fieldname) which contains the referencing target_id to the file_managed table somehow always defaults to 1. So no reference is being made to the uploaded file. I have tried working with other property definitions:

    $properties['target_id'] = DataDefinition::create('integer')
  ->setLabel(t('target ID'));

and

$properties['target_id'] = DataReferenceTargetDefinition::create('integer')
 ->setLabel('Foreign key referencing managed file')
 ->setSetting('unsigned', TRUE)
 ->setRequired(FALSE);

But no luck there. It seems a bit weird to me though, that the database target id needs to be integer and the file upload widget works with an array. Thats why I am aiming at the property definitions/schema as a cause here. If I try to work with a single int property value:

DataDefinition::create('integer')

I get a primitive type error because the managed file element expects an array. Any suggestions? Thanks!

mangohost

Post an answer

Most people don’t grasp that asking a lot of questions unlocks learning and improves interpersonal bonding. In Alison’s studies, for example, though people could accurately recall how many questions had been asked in their conversations, they didn’t intuit the link between questions and liking. Across four studies, in which participants were engaged in conversations themselves or read transcripts of others’ conversations, people tended not to realize that question asking would influence—or had influenced—the level of amity between the conversationalists.