De câteva zile îmi rup capul pe această problemă. Folosind Drupal 9.2.x, construiesc un modul de câmp personalizat pentru un client care are mai multe câmpuri. Am izolat problema incluzând doar un câmp de fișier gestionat deocamdată, deoarece celelalte câmpuri nu cauzează această problemă.
Am definit un element de fișier gestionat în clasa mea Widget, care extinde WidgetBase:
funcția publică formElement(FieldItemListInterface $articole, $delta, matrice $element, matrice &$form, FormStateInterface $form_state) {
$element['target_id'] = [
'#type' => 'fișier_gestionat',
'#title' => $this->t('Imagine din dreapta'),
'#upload_location' => 'public://disco-field-images/',
'#upload_validators' => matrice(
'file_validate_extensions' => array('gif png jpg jpeg')
),
'#default_value' => matrice($items[$delta]->target_id),
];
returnează $element;
}
Mi-am definit schema după cum urmează în clasa mea de articole:
schema funcției statice publice (FieldStorageDefinitionInterface $field_definition) {
întoarcere [
'coloane' => [
'target_id' => [
'description' => 'ID-ul entității fișierului',
'type' => 'int',
'unsigned' => TRUE,
],
],
'indexuri' => [
'target_id' => ['target_id'],
],
'chei externe' => [
'target_id' => [
'table' => 'fișier_gestionat',
'columns' => ['target_id' => 'fid'],
],
],
];
}
Și, în sfârșit, am adăugat o definiție de proprietate pentru câmp:
funcția publică statică propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
$properties['target_id'] = ListDataDefinition::create('integer')
->setLabel(t('ID țintă'))
->setRequired(FALSE);
returnează $proprietăți;
}
Într-un fel, acest lucru duce la încărcarea fișierului în tabelul de fișiere gestionate, obținerea unui fid și totul arată bine de acolo. Cu toate acestea, tabelul de câmp (node__fieldname) care conține referința target_id la tabelul file_managed este întotdeauna implicit la 1. Deci nu se face nicio referire la fișierul încărcat. Am încercat să lucrez cu alte definiții de proprietate:
$properties['target_id'] = DataDefinition::create('integer')
->setLabel(t('ID țintă'));
și
$properties['target_id'] = DataReferenceTargetDefinition::create('integer')
->setLabel('Fișier gestionat referitor la chei externe')
->setSetting('unsigned', TRUE)
->setRequired(FALSE);
Dar fără noroc acolo. Totuși, mi se pare puțin ciudat că id-ul țintei bazei de date trebuie să fie întreg, iar widgetul de încărcare a fișierelor funcționează cu o matrice. De aceea, țintesc aici definițiile/schema proprietăților ca o cauză. Dacă încerc să lucrez cu o singură valoare a proprietății int:
DataDefinition::create('integer')
Primesc o eroare de tip primitiv, deoarece elementul fișier gestionat așteaptă o matrice. Orice sugestii? Mulțumiri!