Wie entferne ich ein Konfigurationsobjekt aus der aktiven Konfiguration?


41

Ich schreibe ein benutzerdefiniertes Modul für Drupal 8. Es definiert ein Feldspeicherkonfigurationsobjekt in einer Datei namens modules / mymod / config / install / field.storage.bloom_stem.bs_twitter_ac.yml.

Das Problem ist, dass dies nicht entfernt wird, wenn ich das Modul deinstalliere. es wird anscheinend zurückgelassen, weil ich beim erneuten Installieren des Moduls einen Absturz erleide.

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

Ausnahme 'Drupal \ Core \ Config \ PreExistingConfigException' mit der Meldung 'Konfigurationsobjekte (field.storage.bloom_stem.bs_twitter_ac), die von mymod bereitgestellt wurden, sind bereits in der aktiven Konfiguration vorhanden'

Also muss ich anscheinend einige wie manuell dieses Konfigurationsobjekt entfernen. Muss ich mehr Code bereitstellen, der diesen löscht, wenn das Modul deinstalliert wird?


Sieht nach einem ähnlichen Problem aus: drupal.stackexchange.com/questions/173684/…
othermachines

Das Easy Install-Modul behebt und vermeidet dieses Problem vollständig. Drupal.org/project/easy_install
Karthikeyan Manivasagam

Antworten:


53

Der derzeit einfachste Weg, dies zu tun, besteht darin , eine interaktive Sitzung mit drush php(oder core-cli) zu öffnen.

Dann benutze:

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

Diese Funktionalität wird auch in die Drupal-Konsole aufgenommen .


1
Dies löste das Problem perfekt. Ändern Sie "system.menu.devel" zu "the_setting.you.want.to.delete"
Eric Steinborn

Was ist mit dem Entfernen mehrerer Konfigurationen? zBmigrate_plus.migration.*
Nic

@Nic es ist nicht schön, aber überprüfen Sie meine Lösung auf Ihre andere Frage, um mehrere zu löschen: drupal.stackexchange.com/questions/214132/…
CR47

Wenn Sie direkten Zugriff auf die Datenbank haben, löschen Sie die beleidigenden Einträge sehr sorgfältig aus der configTabelle.
Naidim

30

Drush Befehl zu löschen Konfigurationsobjekt: drush config-delete <config_name>.


bei mehreren Standortendrush -l your.site.domain config-delete <config_name>
muskie9

2
verkürztes Format istdrush cdel <config_name>
Sharique

Beachten Sie, dass Sie beim Löschen von Konfigurationen auch ein drush crafter ausführen sollten , um zwischengespeicherte Konfigurationsabhängigkeiten zu entfernen. Andernfalls wird möglicherweise Error: Call to a member function getConfigDependencyKey() on null
Folgendes angezeigt

13

Sie können die folgenden Methoden anwenden. Verwenden Sie den folgenden Code in hook_uninstall

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

ODER

In die yml-Datei können Sie die Abhängigkeiten wie folgt einfügen


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

Dann entfernt Drupal diese Konfigurationen beim Deinstallieren Ihres Moduls automatisch, wie von Berdir hier beschrieben. https://drupal.stackexchange.com/a/173879/10436


5
Dies könnte sich in letzter Zeit geändert haben, aber jetzt ist es etwas anders. Abhängigkeiten: erzwungen: Modul: - IhrModul
hw.

1
@hw dein Kommentar ist sehr wichtig. Erwägen Sie, es der Antwort hinzuzufügen, wenn möglich mit einem Link zum entsprechenden Änderungsdatensatz. Ich konnte es nicht finden.
Rudolfbyker

GAH !! Ich wusste, dass es eine Möglichkeit gibt, aber ich konnte mich nicht an den Teil "Durchgesetzt:" erinnern. Dies ist die einfachste und sauberste Methode, insbesondere beim Erstellen in yml-Dateien.
UnsettlingTrend

Mit diesem Ansatz und dem Versuch, das Modul zu installieren, gibt Drupal den Fehler aus: Das Modul custom_module kann nicht aktiviert werden, da es von den folgenden Modulen abhängt, die nicht gefunden wurden:
John

Hallo John, für den Fall, dass du es nicht herausgefunden hast, hört es sich so an, als hättest du deine Modulabhängigkeit am falschen Ort platziert. Die in dieser Antwort beschriebene Konfiguration soll in YML-Datei (en) im Verzeichnis config / install in Ihrem Modul gespeichert werden. Im Falle des OP wäre dies in seiner / ihrer Datei config / install / field.storage.bloom_stem.bs_twitter_ac.yml. Es hört sich so an, als ob Sie die Abhängigkeit stattdessen in die Datei mymodule.info.yml Ihres Moduls gestellt haben (dies verhindert, dass Ihr Modul installiert werden kann)
Daniel Scott

9

Verwendung der Drupal-Konsole :

$ drupal config:delete 'the_config_to_delete'

1
Docs at: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/… Aber kann es Platzhalter machen? zBdrupal config:delete 'migrate_plus.migration.*'
Nic

2
In der neuesten Drupal - Konsole config: löschen erwarten Sie die Config angeben Typen zuerst, zB drupal config:delete active 'name'oder `Drupal config: delete staging‚name‘(mit nur einem Parameter geliefert, es wird vorausgesetzt , dass Sie ihm die Art und prompt gegeben haben Sie für den Konfigurationsnamen.)
William Turrell

6

Drupal :: configFactory () -> reset () löscht das Konfigurationsobjekt nicht. Für diesen LaufDrupal::configFactory()->getEditable('field.storage.node.your_field_name')->delete()



2

Mit der Drupal-Konsole können Sie die aktive Konfiguration löschen drupal config:delete active config_to_delete.


1

Suchen Sie nach allen aufgelisteten Konfigurationen mit der Konfigurationsliste drush. Geben Sie dann die Konfiguration an, die Sie löschen möchten. Verwenden Sie den folgenden Befehl, um die Konfiguration drush config-delete zu löschen


0

Ich lasse hier ein winziges (noch etwas überarbeitetes) Python-Skript, das die Konfigurationsreste entfernt. Es verlässt sich auf 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])

Sollte folgendermaßen ausgeführt werden:

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

1
Sie bitten PHP-Entwickler, ein Python-Skript zu verwenden? Scheint ein bisschen albern.
Patrick

0

Verwenden Sie das Easy Install-Modul , um Konfigurationsprobleme zu vermeiden. Dieses Modul ermöglicht das Löschen von Konfigurationen während der Deinstallation eines Moduls. Es funktioniert auch dann, wenn die Konfigurationen eines Moduls keine in yml erzwungenen oder nicht hinzugefügten Konfigurationen im optionalen Ordner enthalten.

Konfiguration bei Deinstallation Image


0

Deinstallieren Sie Active Configuration vom benutzerdefinierten Modul

Ich hatte das gleiche Problem beim Versuch, Konfigurationsdateien von einem benutzerdefinierten Modul zu deinstallieren. Ich verwende ein benutzerdefiniertes Modul, um benutzerdefinierte Konfigurationsdateien für Webform zu übergeben. Da ich nicht perfekt bin, möchte ich das Modul deinstallieren, den Code bearbeiten und neu installieren können. Wenn ich mein benutzerdefiniertes Modul (my_module) im Abschnitt "dependencies / enforced" in der Datei "config / install yml" referenzierte, wurden bei der Deinstallation meines Moduls auch die Konfigurationsdateien deinstalliert.

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

0

In all diesen Antworten wird empfohlen, das zugrunde liegende Konfigurationsobjekt direkt zu löschen. Der richtige Weg besteht jedoch darin, die Entität über das Entitätsspeichersystem zu löschen.

Wenn Sie beispielsweise einen Bildstil mit der ID "large" haben und ihn löschen möchten, sollten Sie dies tun:

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

Auf diese Weise ruft core "predelete" auf, bevor die Konfiguration gelöscht wird, und "delete" -Hooks, nachdem die Konfiguration gelöscht wurde, auf die andere Module möglicherweise angewiesen sind, um verschiedene Bereinigungsvorgänge auszuführen.


0

Verwenden Sie hook_uninstall , um die Konfiguration zu entfernen, wenn das Modul deinstalliert wird.

Dann löschen Sie die Konfiguration:

function hook_uninstall() {
  \Drupal::configFactory()->getEditable('the_setting.you.want.to.delete')->delete();
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.