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?