РЕШЕНО, оба приведенных ниже метода работают отлично, это была просто опечатка.
Мне нужно программно обновить конфигурацию поля в hook_update
. Мне нужно сделать это в нескольких проектах, поэтому я не могу использовать обычный способ с полевым интерфейсом и синхронизацией конфигурации. Я нашел документацию, как обновить хранилище полей и схему БД (1, 2), но нет документации, как обновить только конфигурацию поля, поэтому я предположил, что могу использовать обычную ConfigFactory.
/**
*Добавить мой новый абзац в список разрешенных бандлов в конфиге поля host
*/
функция MYMODULE_update_9001(&$песочница) {
$config = \Drupal::configFactory()->getEditable('field.field.node.BUNDLE.FIELD_NAME');
$existingAllowedParagraphs = $config->get('settings.handler_settings.target_bundles');
if (!in_array('NEW_PARAGRAPH_BUNDLE', $existingAllowedParagraphs)) {
$dependencies = $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->сохранить(ИСТИНА);
}
}
Это работало только в активной конфигурации (драш секс
создает ожидаемую, обновленную и правильную конфигурацию YAML), но, как ни странно, нигде больше. Например. в Field UI или в форме редактирования узла все работает как старый конфиг pre-hook, не использует активный конфиг. Я пытался выполнить несколько операций импорта конфигурации и очистки кеша, но в этом поле не используются значения из ConfigFactory. Я абсолютно уверен, что моя новая конфигурация правильная и активная, но почему-то поле теперь не синхронизировано со своей собственной конфигурацией.
Обновление: я также пробовал альтернативный подход с использованием FieldConfig, но проблема точно такая же: правильная активная конфигурация, но никакого эффекта в пользовательском интерфейсе поля или форме редактирования узла.
/**
* Добавить тур к разрешенным слайдам в DGM TV
*/
функция wt_dgm_update_9011(&$песочница) {
/** @var $config Drupal\field\FieldConfigInterface */
$config = Drupal\field\Entity\FieldConfig::loadByName('node', 'dgmtv', 'field_slides');
$handlerSettings = $config->getSetting('handler_settings');
$allowedParagraphs = $handlerSettings['target_bundles'];
если (!in_array('dgmtour', $allowedParagraphs)) {
$dependencies = $config->get('dependencies');
$dependencies['config'][] = 'paragraphs.paragraphs_type.dgmtour';
$config->set('зависимости', $зависимости);
$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('настройки', $настройки);
$config->сохранить();
}
}
Что еще нужно сделать, чтобы поле использовало новый конфиг?