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?

artfulrobot
źródło
Wygląda na podobny problem: drupal.stackexchange.com/questions/173684/…
othermachines
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 .

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

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

Ahmad
źródło
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'
VincentLalieu
źródło
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()

balagan
źródło
2

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

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

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

Karthikeyan Manivasagam
źródło
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
Robert Ben Parkinson
źródło
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.

Brian
źródło
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();
}
Jdrupal
źródło