Deaktivieren Sie ein Modul manuell


39

In Drupal 7 konnte ich die {system}Tabelle in der Datenbank manuell bearbeiten , um ein Stubbon-Modul zu deaktivieren. Auf meiner Drupal 8-Site ist diese Tabelle nicht mehr vorhanden.

Wie kann ich ein Modul in Drupal 8 manuell deaktivieren?

Antworten:


34

Die systemDaten der Drupal 7- Tabelle werden jetzt in der configTabelle in Drupal 8 für den core.extensionParameter gespeichert .

Lösung 1: Konfiguration aktualisieren

Sie können den folgenden Code drush evalausführen, indem Sie die Bereitstellung des Devel-Moduls für verwenden oder verwenden Execute PHP Code.

// Read the configuration.
$module_data = \Drupal::config('core.extension')->get('module');

// Unset the modules you do not need.
unset($module_data['MODULE_NAME']);

// Write the configuration.
\Drupal::configFactory()->getEditable('core.extension')->set('module', $module_data)->save();

Sie können dies alles in einem schnellen Einzeiler mit tun drush.

drush eval "\$module_data = \Drupal::config('core.extension')->get('module'); unset(\$module_data['MODULE_NAME']); \Drupal::configFactory()->getEditable('core.extension')->set('module', \$module_data)->save();"

Lösung 2: Bearbeiten Sie die Konfigurationstabelle, wenn Sie PHP nicht ausführen können

Wenn die Site aufgrund des problematischen Moduls beschädigt ist und Sie nicht einmal PHP-Code ausführen können, können Sie die configTabelle möglicherweise direkt bearbeiten .

In der Zeile in der configTabelle wo name = "core.extension"und bearbeiten Sie die BLOB-Spalte data. Das dataist ein serialisiertes PHP-Array, bei dem Sie das Modul, das Sie entfernen möchten, aus dem moduleSchlüssel der Konfiguration entfernen müssen .

Lösung 3: Schnelle und schmutzige Lösung

  • Entfernen Sie das Modul aus dem Dateisystem
  • Schneiden Sie die Tabelle ab cache_config

Diese Lösung kann jedoch zu Meldungen führen, die besagen, dass das Modul nicht im Dateisystem vorhanden ist, was bedeutet, dass etwas nicht stimmt. Aber zumindest wird das defekte Modul deaktiviert und Sie können in den meisten Fällen auf Ihre Site zugreifen.

Cache leeren

Manchmal müssen Sie möglicherweise den Cache leeren, nachdem Sie die obigen Schritte ausgeführt haben. Lesen Sie diese praktische Dokumentation zum Löschen des Caches .


1
In Bezug auf die Deinstallation von Modulen halte ich dies für die beste Lösung.
David

1
Wenn Sie ein Modul deinstallieren müssen, dies jedoch nicht können, weil die Tabellen für das Modul fehlen, können Sie die dritte Option mit verwenden drush eval. Ein Beispiel für einen drush eval "\$module_data = \Drupal::config('core.extension')->get('module'); unset(\$module_data['example_module']); \Drupal::configFactory()->getEditable('core.extension')->set('module', \$module_data)->save();Einzeiler ist: Beachten Sie das mit einem Escapezeichen versehene Dollarzeichen, damit die Befehlszeile nicht $moduleals Bash-Variable falsch interpretiert wird.
Sillygwailo

Prost für den faulen Liner! Fehlt ein Zitat am Ende allerdings
Matt Fletcher

Es ist ziemlich wichtig, dass Sie einen Cache leeren und dann die Konfiguration exportieren, damit die Konfiguration nicht versucht, sie erneut zu installieren, bis Sie fertig sind.
Adaddinsane

16

Mach das:

rm -rf modules/your_stubborn_module
rm -rf sites/default/files/php

Je nach Modul müssen Sie möglicherweise einige Einträge aus der Konfigurationstabelle (siehe vallis Antwort) und einige andere Tabellen löschen.
Turion

Das hat bei mir nicht funktioniert.
Rooby

Sie müssen laufen drush cache-rebuildzu
Sky

16
  • Bearbeiten Sie die configTabelle where manuell name = 'core.extension'und entfernen Sie das Modul aus dem Daten-Blob, bei dem es sich um ein serialisiertes Array handelt.
  • Achten Sie auch darauf, die Länge des Modul-Arrays zu verringern (...s:6:"module";a:HERE;{...)
  • cache_configKürzen Sie die Tabelle von phpmyadmin oder über die Befehlszeile.

1
Danke, das hat mir geholfen. Die Antwort sollte lauten " Bearbeiten Sie die {config} -Tabelle manuell ". Der Textabschnitt, der aus dem BLOB-Inhalt entfernt werden soll, lautet:i:0;s:8:"name of the module";
Hendrik

2
Mit dieser Antwort konnte eine Situation behoben werden, in der ein Modul weder deinstalliert noch erneut installiert werden konnte, weil eine von ihm definierte benutzerdefinierte Entität fehlte.
Daniels

1
@hendrick Das hat vielleicht für Sie funktioniert, aber die Zeichenfolge zum Entfernen jedes Moduls sollte so strukturiert sein s:8:"name of the module";i:0;. @Valli bedeutete, dass das Array, das die Anzahl der Module beschreibt, in der Anzahl um die Anzahl der entfernten Module verringert werden sollte. Der Anfang des Blobs in meinem Setup ist a:4:{s:6:"module";a:59:{, das ist ein Array von 59 Modulen. Wenn Sie zwei löschen, ändern Sie diesen Array-Wert auf 57.
dimmech

3

Erwägen Sie die Verwendung von Drush. Drupal 8 definiert immer noch, was "Deaktivieren von Modulen" sein soll. Es gibt eine laufende Diskussion, ob es diese Option geben sollte oder ob sie entfernt werden sollte.


Ich entwickle lokal auf einem Windows-PC und als ich das letzte Mal nach Drush gesucht habe, war ich noch nicht bereit für Drupal 8. Ich muss noch einmal nachsehen.
Bumpaw

@bumpaw Drush sollte auch unter Windows funktionieren. Das hilft dir zumindest vor Ort. Wenn es um Produktionsserver geht, gibt es viele Shared Hostings, die Ihnen weder Drush noch SSH zur Verfügung stellen, was die Verwaltung normalerweise umständlicher macht. drush.org/drush_windows_installer
hampusn

Und wie kann man mit drush ein Modul auf eine Weise "manuell entfernen", die sich vom UI-Prozess unterscheidet? Sie scheinen die Frage nicht beantwortet zu haben.
1kenthomas

3

Versuchen Sie in Drupal 8, das Modul aus Ihrem Modulordner zu entfernen und führen Sie rebuild.php aus.

Versuchen Sie es drush pm-uninstall module-nameauch.


2

Ich habe alle anderen Antworten ausprobiert, aber immer wieder eine Drupal-Fehlermeldung erhalten. Um das Problem zu lösen, musste ich eine Zeile aus der key_value-Tabelle entfernen (suchen Sie den Modulnamen in der name-Spalte)


2

Wenn Sie etwas in Bezug auf die Drupal-Konfiguration aktualisieren müssen, verwenden Sie in diesem Fall core.extensionDrush:

[Drush 8.x in diesem Beispiel]

drush cedit core.extension

1

Dafür gibt es ein Modul. Dieses Modul wurde im August 2013 auf drupal.org veröffentlicht . Für den Fall, dass jemand braucht.

Module deaktivieren

Wie auf der Seite dieses Moduls angegeben,

Drupal 8 hat die Fähigkeit zum Deaktivieren von Modulen aus vielen Gründen entfernt. Siehe # 1199946: Deaktivierte Module sind irreparabel defekt, sodass die "Deaktivierungs" -Funktionalität entfernt werden muss und viele andere Probleme in der Warteschlange verschiedener Core- und Contributed-Module auftreten.

Dieses Modul bietet die Möglichkeit, Module über die Benutzeroberfläche oder mit Drush (vorübergehend) zu deaktivieren. Beachten Sie, dass es nach dem Deaktivieren eines Moduls keine Garantie für Ihren Inhalt, Ihre Konfiguration oder sogar Ihre Site gibt.


0

Auf diese Weise habe ich ein Modul mit dem Namen "better_messages" manuell aus meiner Drupal 8-Instanz entfernt. Sobald ich das "better_messages" -Modul installiert habe, ist die Site ausgefallen. Es gab also keine Möglichkeit, das Modul von der Benutzeroberfläche zu deinstallieren. Ich habe Drush nicht installiert. Ich habe viele Einstellungen in Foren vorgenommen, aber so funktionierte es schließlich für mich.

1 Benennen Sie das Modul in old_better_messages im Ordner modules um.

  1. Über die URL lief http: // IP: port / ordnername / rebuild.php . Dadurch wurde sichergestellt, dass die Site wieder verfügbar ist, jedoch nur im schreibgeschützten Modus. Ich konnte die Admin-Aktivitäten nicht ausführen oder Artikel nicht bearbeiten.

  2. Mit dem folgenden Befehl wird der Eintrag aus der Datenbank gelöscht

DELETE FROM key_value WHERE collection = 'system.schema' AND name = 'better_messages';

In meinem Fall gab es keinen Eintrag in der Datenbank. Ich denke, es könnte wegen der verschiedenen Stunts, die ich früher gemacht habe, gelöscht worden sein.

  1. Dann habe ich mit DB Visualizer Einträge aus allen Tabellen gelöscht, die mit Cache beginnen.

Dies löste das Problem. Dies basiert auf meiner Interpretation von https://www.drupal.org/node/2487215


0

Jigarius 'Antwort oben hat irgendwie funktioniert ...

Ich musste: // die Konfiguration lesen.

$module_data = \Drupal::config('core.extension')->get()['module'];

Welches sollte das gleiche tun. Ich bin mir nicht sicher, warum es nicht so funktioniert hat, wie Jigarius es geschrieben hat ...

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.