Nie można zainstalować… już istnieje w aktywnej konfiguracji

15

Na Drupal 8.1 ciągle wyświetlam tego rodzaju komunikaty, gdy próbuję aktywować niestandardowy moduł lub niestandardową funkcję, która wprowadza pewne modyfikacje do strony podstawowej. (dodaj pola).

To naprawdę denerwujące ...

Kroki:

  • Wyczyść bazę danych całkowicie
  • przejdź do /install.php i wybierz Profil standardowy
  • Teraz, gdy witryna jest uruchomiona, przejdź do rozszerzenia
  • Wybierz opcję - strona podstawowa

Wynik:

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.

No tak ... właśnie to chcę zrobić: zmień te ustawienia domyślne!

Expexted:

Będę mógł zainstalować moją funkcję, która wprowadza pewne modyfikacje strony podstawowej.

Moja funkcja

Oto moja funkcja Utwórz za pomocą modułu Funkcje

Zasadniczo dodaje dwa pola, banner_image i background_image do strony podstawowej

Akta:

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

Dlaczego ta prosta rzecz nie jest obsługiwana? Czy to błąd? Co powinienem zrobić, aby móc korzystać z mojej funkcji?

Guillaume Bois
źródło
1
Użyj modułu EasyInstall drupal , który służy do usuwania aktywnych konfiguracji
Karthikeyan Manivasagam
1
+1 interesujący moduł - wart obejrzenia - dziękuję @KarthikeyanManivasagam
therobyouknow

Odpowiedzi:

24

Z drush możesz prawdopodobnie zrobić

drush config-delete module_name.settings

aby usunąć konfiguracje, które narzekają

GiorgosK
źródło
Podczas mojej epickiej bitwy z Drupalem odkryłem również, że możesz przenieść te konfiguracje do optional/folderu, aby je zamknąć. Ale nie jestem pewien wszystkich konsekwencji ...
Guillaume Bois
@GillaillaBois: implikacje są takie, że te opcjonalne konfiguracje zostaną zignorowane, jeśli są już zainstalowane lub jeśli zależności nie zostaną spełnione. Może to prowadzić do dalszych problemów, jeśli konfiguracja jest konieczna do działania modułu.
Renrhaf
+1 dziękuję @GiorgosK (część 1 z 2): Znalazłem to rozwiązanie, które działa w moim przypadku: Miałem błąd wyświetlany w przeglądarce dla mojej witryny deweloperskiej: 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).po skonfigurowaniu źródła kodu git strony i bazy danych na innym komputerze .
therobyouknow
(Część 2 z 2) Aby go rozwiązać, próbowałem odinstalować lightning_layout i zainstalować go ponownie. drush pm-uninstall lightning_layoutdziałało, ale potem, gdy próbowałem go ponownie zainstalować, drush en lightning_layoutotrzymałem ten błąd wiersza polecenia „W PreExistingConfigException.php wiersz 65: Obiekty konfiguracji (field.storage.node.panelizer) dostarczone przez lightning_layout już istnieją w aktywnej konfiguracji” Więc użyłem twojego rozwiązanie w ten sposób: drush config-delete field.storage.node.panelizer a następnie był w stanie ponownie włączyć moduł:drush en lightning_layout
therobyouknow
1
jeśli nie jesteś pewien, jakie „ustawienia” musisz usunąć, powinieneś uruchomić „drush config-list”, aby uzyskać dokładną nazwę konfiguracji
Jorge Valvert
3

Ta funkcja nie jest obsługiwana, ponieważ moduł nie może zastąpić jednostki konfiguracji, która już istnieje, instalacją config.

Aby dodać konfigurację trybu formularza i trybu widoku dla już istniejącego typu węzła, musisz zaimplementować to w kodzie w hook_install ().

Lub musisz najpierw usunąć typ węzła na swojej stronie, ale potem musisz również usunąć zawartość.

I nie, to nie jest błąd, tak to zdefiniowano, aby zapobiec utracie konfiguracji.

Berdir
źródło
To jest bardzo smutne. W D7 było to możliwe (dodawanie pól do strony podstawowej za pomocą funkcji). Nadal uważam, że powinien być również w D8. Mówisz, że ma to zapobiec utracie konfiguracji, ale w rzeczywistości po prostu dodaje konfiguracje (pola, waga, etykieta itp.). Zauważ, że miałem również ten problem z własnymi niestandardowymi modułami.
Guillaume Bois
Nie, to nie tylko dodaje. wyświetlanie i wyświetlanie formularzy są wspólne dla wszystkich pól jednego typu węzła. co się stanie, jeśli dwa moduły spróbują dodać ten plik, kto wygra? Co dzieje się z istniejącymi polami, które są już na typie strony? co jeśli podstawowy typ węzła istnieje, ale z innymi ustawieniami niż w twoim polu? Takie scenariusze zachowania nie są zdefiniowane. W przypadku funkcji autonomicznej lepiej jest zdefiniować własny typ węzła i aby wdrożyć tę zmianę we własnej witrynie, nie potrzebujesz modułu funkcji, jak w 7.x. Możesz po prostu wyeksportować konfigurację i zaimportować ją ponownie.
Berdir,
@berdir to bardzo interesujące. Wychodzę więc z tego problemu, próbując utworzyć funkcję profilu użytkownika, która zawiera widok i notatki z formularza. Czy mówisz, że nie można tego zrobić w przypadku funkcji, ponieważ typ treści użytkownika już istnieje, a funkcja próbuje to włączyć? Czy istnieje jakiś sposób, aby funkcja mogła to zastąpić, aby ktoś mógł włączyć funkcję profilu w już istniejącej witrynie?
kaleemclarkson
Użytkownik @kaleemclarkson nie jest typem treści, ale typem jednostki. Jedynym sposobem, aby to zrobić, jest to, co opisałem, musisz zaimplementować kod w hook_install () swojego modułu funkcji, aby ustawić formę i wyświetlić konfigurację wyświetlania. Lub użyj modułu profilu i zdefiniuj tam swój własny typ profilu.
Berdir,
3

Znaleziono moduł, użyj modułu Łatwa instalacja , aby wyczyścić aktywną konfigurację bez użycia rozwijania lub drush . Działa, nawet jeśli przegapiłeś opcjonalny folder i wymuszoną opcję w plikach konfiguracyjnych modułu ( yml )

Karthikeyan Manivasagam
źródło
1
To fantastyczna opcja! Właśnie tego użyłem dzisiaj i dzięki temu zaoszczędziłem tyle czasu!
rtd1123
3

Mam ten sam problem z witryną panteonu. Podjąłem polecenie drush

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

Strona lokalna: drush config-delete ERRORNAME

to dla mnie praca.

omkar gaonkar
źródło
1

Dzięki drush entemu działa!

[profile_test]$ drush en feature_basic_page -y
The following extensions will be enabled: feature_basic_page
Do you really want to continue? (y/n): y    
feature_basic_page was enabled successfully.   [ok]

EDYCJA: istnieje teraz lepsze rozwiązanie, patrz: Jak usunąć obiekt konfiguracji z aktywnej konfiguracji?

Guillaume Bois
źródło
0

Jeśli chcesz dodać konfiguracje do niestandardowego modułu, ale już istnieją one w aktywnej konfiguracji i z jakiegoś powodu nie możesz użyć drush do usunięcia tych konfiguracji (w moim przypadku, ponieważ jest to część profilu instalacyjnego), i jesteś pewien nie będzie problemu z nadpisaniem konfiguracji, oto podejście do zastąpienia tych konfiguracji.

Dodaj nowy folder do niestandardowego modułu, / config / hook_install i dodaj pliki config .yml w tym folderze, a następnie w module hook_install modułu.

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
źródło