Puncte:0

Elementul fișierului gestionat din modulul de câmp personalizat nu salvează id-ul țintei

drapel in

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!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.