Jak usunąć obiekt konfiguracji z aktywnej konfiguracji?


41

Piszę niestandardowy moduł dla Drupala 8. Definiuje obiekt konfiguracji pamięci masowej w polu o nazwie moduły / mymod / config / install / field.storage.bloom_stem.bs_twitter_ac.yml.

Problem polega na tym, że nie jest to usuwane podczas odinstalowywania modułu; najwyraźniej jest pozostawiony, ponieważ kiedy ponownie instaluję moduł, mam awarię.

drush -y pm-uninstall mymod
drush cr
drush -y en mymod

wyjątek „Drupal \ Core \ Config \ PreExistingConfigException” z komunikatem „Obiekty konfiguracji (field.storage.bloom_stem.bs_twitter_ac) dostarczone przez mymod już istnieją w aktywnej konfiguracji”

Wygląda na to, że potrzebuję trochę ręcznego usunięcia tego obiektu konfiguracji. Czy muszę podać trochę kodu, który usuwa go po odinstalowaniu modułu?



Moduł Łatwa instalacja służy do całkowitego naprawienia i uniknięcia tego problemu drupal.org/project/easy_install
Karthikeyan Manivasagam,

Odpowiedzi:


53

W tej chwili najłatwiejszym sposobem jest skorzystanie z drush php(lub core-cli), aby otworzyć sesję interaktywną.

Następnie użyj:

Drupal::configFactory()->getEditable('system.menu.devel')->delete();

Ta funkcja zostanie również dodana do konsoli Drupal .


1
To doskonale rozwiązało problem. Zmień „system.menu.devel” na „the_setting.you.want.to.delete”
Eric Steinborn

Co z usunięciem wielu konfiguracji? np.migrate_plus.migration.*
Nic

@ Nic nie jest ładne, ale sprawdź moje rozwiązanie drugiego pytania, aby usunąć wiele: drupal.stackexchange.com/questions/214132/…
CR47

Jeśli masz bezpośredni dostęp do bazy danych, bardzo ostrożnie usuń szkodliwe wpisy z configtabeli.
Naidim,

30

Drush polecenie, aby usunąć obiekt konfiguracji: drush config-delete <config_name>.


w przypadku wielu witryn,drush -l your.site.domain config-delete <config_name>
muskie9

2
skrócony format todrush cdel <config_name>
Sharique

miej na uwadze, że jeśli usuniesz dowolne konfiguracje, powinieneś także zrobić drush crpo to, aby usunąć wszelkie zależności konfiguracyjne w pamięci podręcznej, w przeciwnym razie możesz uzyskać coś, co wygląda następująco:Error: Call to a member function getConfigDependencyKey() on null
wilco

13

Możesz użyć następujących metod. Użyj następującego kodu w hook_uninstall

Drupal::configFactory()->reset('field.storage.bloom_stem.bs_twitter_ac');

LUB

w pliku yml można umieścić zależności, takie jak


dependencies:
  module:
    - yourmodule
  enforced:
    module:
      - yourmodule

wtedy drupal automatycznie usunie te konfiguracje podczas odinstalowywania modułu zgodnie z opisem Berdira tutaj https://drupal.stackexchange.com/a/173879/10436


5
To mogło się ostatnio zmienić, ale teraz jest nieco inaczej. zależności: wymuszone: moduł: - moduł
hw.

1
@ hw twój komentarz jest bardzo ważny. Rozważ dodanie go do odpowiedzi wraz z linkiem do odpowiedniego rekordu zmian, jeśli to możliwe. Nie mogłem tego znaleźć.
rudolfbyker

GAH !! Wiedziałem, że jest na to sposób, ale nie pamiętałem części „wymuszonej:”. Jest to najprostszy i najczystszy sposób, aby to zrobić, szczególnie podczas tworzenia ich w plikach yml.
UnsettlingTrend

korzystając z tego podejścia i próbując zainstalować moduł, Drupal zgłasza błąd: Nie można włączyć modułu custom_module, ponieważ zależy to od następujących modułów, których nie można znaleźć:
John

Cześć John, na wypadek, gdybyś nie wymyślił tego, brzmi to tak, jakbyś mógł umieścić zależność modułu w niewłaściwym miejscu. Konfiguracja opisana w tej odpowiedzi jest przeznaczona do użycia w plikach YML w katalogu config / install w module. W przypadku OP byłoby to w jego / jej pliku config / install / field.storage.bloom_stem.bs_twitter_ac.yml. Wygląda na to, że zamiast tego umieściłeś zależność w pliku mymodule.info.yml swojego modułu (co uniemożliwi zainstalowanie modułu)
Daniel Scott

9

Za pomocą konsoli drupal :

$ drupal config:delete 'the_config_to_delete'

1
Dokumenty pod adresem: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/… Ale czy może to robić symbole wieloznaczne? np.drupal config:delete 'migrate_plus.migration.*'
Nic

2
W najnowszej konsoli drupal, config: delete oczekuje, abyś najpierw określił typ konfiguracji , np. drupal config:delete active 'name'Lub `drupal config: delete staging 'name' (z podanym tylko jednym parametrem, zakładasz, że nadałeś mu typ i wyświetli się monit dla nazwy konfiguracji.)
William Turrell,

6

Drupal :: configFactory () -> reset () nie usuwa obiektu config. Do tego bieguDrupal::configFactory()->getEditable('field.storage.node.your_field_name')->delete()



2

Możesz użyć konsoli Drupal, aby usunąć aktywną konfigurację za pomocą drupal config:delete active config_to_delete.


1

Wyszukaj wszystkie konfiguracje wymienione za pomocą drush config-list Następnie określ konfigurację, którą chcesz usunąć. Użyj poniższego polecenia, aby usunąć konfigurację drush config-delete


0

Zostawiam tutaj mały (nieco nieco przeprojektowany) skrypt w języku Python, który usuwa resztki konfiguracji. To zależy drush config-delete.

# 'batch_config_delete.py'
# 'drush' has to be available in the current directory

import os
import argparse
import subprocess

MODULES_ROOT = "/var/www/html/MYSITE/web/modules/custom"

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Batch config delete.")
    parser.add_argument("-m", "--module", required=True, help="Module name")
    args = parser.parse_args()
    install_path = os.path.join(MODULES_ROOT, args.module, 'config/install')

    for f in os.listdir(install_path):
        if f.endswith('.yml'):
            config_name = os.path.splitext(f)[0]
            print "Delete config:", config_name
            subprocess.call(['drush', 'config-delete', config_name])

Należy wykonać w następujący sposób:

python ../scripts/batch_config_delete.py -m foobar

1
Pytasz programistów PHP o użycie skryptu python? Wydaje się to trochę głupie.
Patrick

0

Użyj modułu Łatwa instalacja, aby uniknąć problemów z konfiguracją, moduł ten pozwoli usunąć konfiguracje podczas odinstalowywania modułu, działa nawet, jeśli konfiguracje modułu nie zawierają wymuszonych w yml lub niezapisanych konfiguracji w opcjonalnym folderze.

Konfiguracja obrazu odinstalowania


0

Odinstaluj aktywną konfigurację z modułu niestandardowego

Zetknąłem się z tym samym problemem, próbując odinstalować pliki konfiguracyjne z niestandardowego modułu. Mam niestandardowy moduł używany do przekazywania niestandardowych plików konfiguracyjnych dla formularza internetowego. Ponieważ nie jestem idealny, chcę mieć możliwość odinstalowania modułu, edycji kodu i ponownej instalacji. Odkryłem, że jeśli odwołam się do mojego modułu niestandardowego (mój_moduł) w sekcji zależności / wymuszone w pliku config / install yml, to po odinstalowaniu modułu pliki konfiguracyjne również się odinstalują.

   langcode: en
    status: true
    dependencies:
        enforced:
            module:
                - webform
                - my_module // reference your module here

0

Wszystkie te odpowiedzi zalecają bezpośrednie usunięcie podstawowego obiektu konfiguracji, ale poprawnym sposobem jest usunięcie encji za pośrednictwem systemu pamięci encji.

Na przykład, jeśli masz styl obrazu z identyfikatorem „duży” i chcesz go usunąć, powinieneś to zrobić:

\Drupal::entityTypeManager()->getStorage('image_style')->load('large')->delete();

Robiąc to w ten sposób, rdzeń wywoła „wstępne usunięcie” przed usunięciem konfiguracji i „usunięcie” przechwytuje po usunięciu konfiguracji, na których inne moduły mogą polegać przy wykonywaniu różnych operacji czyszczenia.


0

Użyj hook_uninstall, aby usunąć konfigurację po odinstalowaniu modułu.

Następnie usuń konfigurację:

function hook_uninstall() {
  \Drupal::configFactory()->getEditable('the_setting.you.want.to.delete')->delete();
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.