Рейтинг:1

Программно обновить конфигурацию поля (не хранилище)

флаг ru

РЕШЕНО, оба приведенных ниже метода работают отлично, это была просто опечатка.

Мне нужно программно обновить конфигурацию поля в 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->сохранить();
  }
}

Что еще нужно сделать, чтобы поле использовало новый конфиг?

4uk4 avatar
флаг cn
Есть ли причина, по которой вы загружаете конфигурацию поля через фабрику конфигураций? Это может быть необходимо, если ваша конфигурация содержит смешанные исходные языки. Если у вас нет этой проблемы, попробуйте загрузить конфигурацию напрямую через `FieldConfig::loadByName()`.
флаг ru
Лично я считаю, что с `ConfigFactory` гораздо удобнее работать, потому что он позволяет напрямую манипулировать `$config->get('very.deep.nested.settings')` и работает с любой конфигурацией. Пробовал и с `FieldConfig`, та же проблема.
флаг ru
Черт возьми, это была просто опечатка с навыками сокрытия уровня ниндзя: основные вещи, связанные с основным, были правильными, но у меня была ошибка в части конфигурации, связанной с полем абзацев.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.