Невозможно установить… уже существует в активной конфигурации

15

На Drupal 8.1 я продолжаю работать с такими сообщениями, когда пытаюсь активировать пользовательский модуль или пользовательскую функцию, которая вносит некоторые изменения в базовую страницу. (добавить поля).

Это действительно раздражает ...

шаги:

  • Очистить базу данных полностью
  • перейдите в /install.php и выберите Стандартный профиль
  • Теперь, когда сайт работает, перейдите в Расширить
  • Выбрать функцию - Основная страница

Результат:

Unable to install Feature - Basic Page, core.base_field_override.node.page.promote, core.entity_form_display.node.page.default, core.entity_view_display.node.page.default, core.entity_view_display.node.page.teaser, field.field.node.page.body, node.type.page already exist in active configuration.

Ну да ... это то, что я хочу сделать: изменить эти настройки по умолчанию!

Expexted:

Уметь установить мою функцию, которая вносит некоторые изменения в базовую страницу.

Моя особенность

Вот моя функция создания с модулем Особенности

В основном это добавляет два поля, banner_image и background_image к основной странице

файлы:

config
    install
        core.base_field_override.node.page.changed.yml
        core.base_field_override.node.page.created.yml
        core.base_field_override.node.page.promote.yml
        core.base_field_override.node.page.status.yml
        core.base_field_override.node.page.sticky.yml
        core.base_field_override.node.page.title.yml
        core.base_field_override.node.page.uid.yml
        core.entity_form_display.node.page.default.yml
        core.entity_view_display.node.page.default.yml
        core.entity_view_display.node.page.teaser.yml
        field.field.node.page.body.yml
        field.field.node.page.field_banner_image.yml
        field.field.node.page.field_image.yml
        field.storage.node.field_banner_image.yml
        language.content_settings.node.page.yml
        node.type.page.yml
feature_basic_page.features.yml
feature_basic_page.info.yml

Почему эта простая вещь не поддерживается? Это ошибка? Что я должен сделать, чтобы использовать мою функцию?

Гийом Буа
источник
1
Используйте модуль drupal EasyInstall, который используется для удаления активных конфигураций
Karthikeyan Manivasagam
1
+1 интересный модуль - стоит посмотреть - спасибо @KarthikeyanManivasagam
therobyouknow

Ответы:

24

С Drush вы, вероятно, можете сделать

drush config-delete module_name.settings

удалить конфигурации, которые жалуются

GiorgosK
источник
Во время моей эпической битвы с Drupal я также обнаружил, что вы можете переместить эти конфиги в optional/папку, чтобы они закрылись. Но я не уверен во всех последствиях ...
Гийом Буа
@GuillaumeBois: это означает, что эти дополнительные конфигурации будут игнорироваться, если они уже установлены, или если зависимости не встречаются. Таким образом, это может привести к дальнейшим проблемам, если конфигурация необходима для работы модуля.
Renrhaf
+1 спасибо @GiorgosK (Часть 1 из 2): Я нашел, что это решение работает в моем случае: эта ошибка отображалась в веб-браузере для моего сайта разработчика: Warning: in_array() expects parameter 2 to be array, null given in lightning_layout_block_alter() (line 91 of modules/contrib/lightning_layout/lightning_layout.module).после настройки исходного кода git и базы данных на другом компьютере ,
therobyouknow
(Часть 2 из 2). Чтобы решить эту проблему, я попытался удалить lightning_layout и переустановить его. drush pm-uninstall lightning_layoutработал, но потом, когда я попытался переустановить его, drush en lightning_layoutя получил эту ошибку командной строки "В строке PreExistingConfigException.php 65: объекты конфигурации (field.storage.node.panelizer), предоставленные lightning_layout, уже существуют в активной конфигурации", поэтому я использовал ваш Решение таким образом: drush config-delete field.storage.node.panelizer и затем смог повторно включить модуль:drush en lightning_layout
therobyouknow
1
если вы не уверены, какие «настройки» вам нужно удалить, вы должны запустить «drush config-list», чтобы получить точное имя конфигурации
Хорхе Вальверт,
3

Эта вещь не поддерживается, потому что модуль не может заменить сущность конфигурации, которая уже существует, с установкой config.

Чтобы добавить конфигурации формы и режима просмотра для уже существующего типа узла, вы должны реализовать это в коде в hook_install ().

Или вы должны сначала удалить тип узла на вашем сайте, но затем вы также должны удалить контент.

И нет, это не ошибка, это то, как это определено для предотвращения потери конфигурации.

Berdir
источник
Это очень грустно. В D7 это было возможно (добавление полей к базовой странице через функцию). Я все еще думаю, что это должно быть в D8 тоже. Вы говорите, что это предотвращает потерю конфигурации, но в действительности она просто добавляет конфигурации (поля, вес, метка и т. Д.). Обратите внимание, что у меня также была эта проблема с моими собственными пользовательскими модулями.
Гийом Буа
Нет, это не просто добавляет. представления и формы отображаются для всех полей одного типа узла. что произойдет, если два модуля попытаются добавить этот файл, кто победит? Что происходит с существующими полями, которые уже имеют тип страницы? Что делать, если базовый тип узла существует, но с настройками, отличными от ваших? Подобные сценарии поведения не определены. Для автономной функции лучше определить собственный тип узла, а для развертывания этого изменения на своем сайте вам не нужен функциональный модуль, как в 7.x, вы можете просто экспортировать конфигурацию и импортировать ее снова.
Бердир
@berdir это очень интересно. Таким образом, я исхожу из этой проблемы, пытаясь создать функцию профиля пользователя, которая включает в себя вид и примечания к форме. Так вы говорите, что это невозможно сделать в функциях, потому что тип пользовательского контента уже существует, и функция пытается включить это? Есть ли какой-нибудь способ разрешить функции переопределить это, чтобы кто-то мог включить функцию профиля на уже существующем сайте?
kaleemclarkson
@kaleemclarkson user - это не тип контента, а тип сущности. Единственный способ сделать это - то, что я описал, вы должны реализовать код в hook_install () вашего функционального модуля, чтобы установить форму и просмотреть конфигурацию дисплея. Или используйте модуль профиля и определите свой собственный тип профиля там.
Бердир
3

Найденный модуль, используйте модуль Easy Install для очистки активной конфигурации без использования devel или drush . Это работает, даже если вы пропустили необязательную папку и принудительную опцию в файлах конфигурации вашего модуля ( yml )

Картикеян Манивасагам
источник
1
Это фантастический вариант! Я просто использовал это сегодня, и это сэкономило мне так много времени!
rtd1123
3

У меня такая же проблема для сайта Пантеона. Я ввел команду drush

Pantheonsite: drush @ pantheon.SITENAME.ENVNAME config-delete ERRORNAME

Локальный сайт: drush config-delete ERRORNAME

это работа для меня.

омкар гаонкар
источник
0

Если вы хотите добавить конфиги в свой пользовательский модуль, но они уже существуют в активной конфигурации, и по какой-то причине вы не можете использовать drush для удаления этих конфигов (в моем случае, потому что это часть профиля установки), и вы уверены, что не будет проблем с перезаписью конфигурации, вот подход к замене этих настроек.

Добавьте новую папку в ваш пользовательский модуль, / config / hook_install и добавьте ваши файлы config .yml в эту папку, а затем в hook_install вашего модуля.

use Drupal\Component\Serialization\Yaml;

/**
 * Implements hook_install().
 */
function mymodule_install() {

  // Replace these configs.  We're using code to do this, as they are already
  // installed.
  $config_files = [
    'language.types',
    'language.negotiation',
  ];

  foreach ($config_files as $config_id) {
    $raw_data = file_get_contents(drupal_get_path('module', 'mymodule') . '/config/hook_install/' . $config_id . '.yml');
    \Drupal::configFactory()->getEditable($config_id)
      ->setData(Yaml::decode($raw_data))
      ->save();
  }
}
oknate
источник