Puncte:1

Actualizați programatic configurația câmpului (nu stocare)

drapel ru

SOLUȚIONAT, ambele metode de mai jos funcționează perfect, a fost doar o greșeală de scriere.

Trebuie să actualizez programatic configurația unui câmp în hook_update. Trebuie să fac asta pe mai multe proiecte, așa că nu pot folosi modul normal cu interfața de utilizare de câmp și sincronizarea config. Am găsit documentație despre cum să actualizez stocarea câmpului și schema DB (1, 2), dar nu există documentație despre cum să actualizez doar o configurație de câmp, așa că am presupus că pot merge împreună cu ConfigFactory obișnuit.

/**
 * Adăugați noul meu paragraf la lista de pachete permise în configurația câmpului gazdă
 */
funcția MYMODULE_update_9001(&$sandbox) {
  $config = \Drupal::configFactory()->getEditable('field.field.node.BUNDLE.FIELD_NAME');
  $existingAllowedParagraphs = $config->get('settings.handler_settings.target_bundles');
  dacă (!in_array('NEW_PARAGRAPH_BUNDLE', $existingAllowedParagraphs )) {
    $dependențe = $config->get('dependencies.config');
    $dependencies[] = 'paragraphs.paragraphs_type.NEW_PARAGRAPH_BUNDLE';
    $config->set('dependencies.config', $dependencies);
    $config->set('settings.handler_settings.target_bundles.NEW_PARAGRAPH_BUNDLE', 'NEW_PARAGRAPH_BUNDLE');
    $config->set('settings.handler_settings.target_bundles_drag_drop.NEW_PARAGRAPH_BUNDLE', ['enabled' => true, 'weight' => 1234]);
    $config->salvare(ADEVĂRAT);
  }
}

Aceasta a funcționat numai în configurația activă (drush cex creează configurația YAML așteptată, actualizată și corectă), dar în mod ciudat nu în altă parte. De exemplu. în Field UI sau în formularul de editare a nodului, totul funcționează ca vechea configurație pre-hook, nu folosește configurația activă. Am încercat să fac mai multe importuri de configurare și ștergere cache, dar câmpul nu folosește valorile din ConfigFactory. Sunt absolut sigur că noua mea configurație este corectă și activă, dar cumva câmpul nu este sincronizat cu propria configurație.

Actualizare: am încercat și o abordare alternativă folosind FieldConfig, dar problema este exact aceeași: configurație activă corectă, dar niciun efect în UI de câmp sau formularul de editare a nodului.

/**
 * Adăugați tur la diapozitivele permise în DGM TV
 */
function wt_dgm_update_9011(&$sandbox) {
  /** @var $config Drupal\field\FieldConfigInterface */
  $config = Drupal\field\Entity\FieldConfig::loadByName('node', 'dgmtv', 'field_slides');
  $handlerSettings = $config->getSetting('handler_settings');
  $allowedParagraphs = $handlerSettings['target_bundles'];
  dacă (!in_array('dgmtour', $allowedParagraphs)) {
    $dependențe = $config->get('dependențe');
    $dependencies['config'][] = 'paragraphs.paragraphs_type.dgmtour';
    $config->set('dependențe', $dependențe);
    $handlerSettings['target_bundles']['dgmtour'] = 'dgmtour';
    $handlerSettings['target_bundles_drag_drop']['dgmtour'] = ['enabled' => true, 'weight' => 1234];
    $settings = $config->get('settings');
    $settings['handler_settings'] = $handlerSettings;
    $config->set('setari', $setari);
    $config->salvare();
  }
}

Ce altceva trebuie să fac pentru ca câmpul să folosească noua configurație?

4uk4 avatar
drapel cn
Există vreun motiv pentru care încărcați configurația câmpului prin fabrica de configurare? Ar putea fi necesar dacă configurația dvs. conține limbi originale mixte. Dacă nu aveți această problemă, încercați să încărcați configurația direct prin `FieldConfig::loadByName()`.
drapel ru
Personal, mi se pare mult mai confortabil de lucrat cu `ConfigFactory`, deoarece permite manipularea directă a `$config->get('very.deep.nested.settings')` și funcționează pentru orice configurație. Am încercat și cu `FieldConfig`, aceeași problemă.
drapel ru
Doamne, a fost doar o greșeală de tipar cu abilități de ascundere de calitate ninja: lucrurile legate de bază erau corecte, dar am avut o eroare în partea legată de widgetul câmpului Paragrafe din configurație.

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.