So verschieben Sie installierte Module von / sites / all / modules / * nach / sites / all / contrib / modules / *

34

Ich habe nach Antworten auf diese Frage gesucht, ohne dass ich Glück gehabt hätte. Nach dem, was ich in der Datenbankstruktur beobachte, ist die Position zu den Modulen in der 'System'-Tabelle angegeben. Die einzige Lösung, die ich habe, besteht darin, eine SQL-Abfrage zu schreiben, um die Spalte "Dateiname" zu aktualisieren.

Gibt es eine bessere / sauberere Lösung für dieses Problem, z. B. ein Contrib-Modul?

Logi
quelle

Antworten:

27

Sie müssen nur Ihre Module an den neuen Speicherort verschieben und die Registrierung neu erstellen. Wenn die Registrierung neu erstellt wird, wird der Pfad zu den Modulen aktualisiert. Überprüfen Sie registry_rebuild().

Durchsucht den gesamten Code in Modulen oder Verzeichnissen erneut und speichert den Speicherort jeder Schnittstelle oder Klasse in der Datenbank.

Ich würde Ihnen jedoch empfehlen, Ihre Datenbank zu sichern, bevor Sie dies testen.

Wenn Sie drush verwenden, können Sie die Registrierung auch mit dem folgenden Befehl neu erstellen:

drush cc registry

Sie können auch den registry_rebuildBefehl für drush installieren :

// install registry_rebuild
drush dl registry_rebuild
// rebuild the registry
drush rr
Cyclonecode
quelle
Wenn ich es richtig verstehe, können Sie auch Ihre registry_fileTabelle abschneiden, wodurch Drupal gezwungen wird, alle Dateien erneut zu scannen und die Tabelle neu zu erstellen.
Cyclonecode
3
Das Abschneiden der Tabelle klingt nach einer schlechten Idee und führt höchstwahrscheinlich zu einer total kaputten Site.
Berdir
@Berdir - Stimme zu, dass es sich nach einer schlechten Idee anhört. Aber probiert es einfach aus und scheint zu funktionieren. Zuerst habe ich eine Sicherungskopie erstellt, die gesamte Tabelle mit abgeschnitten DELETE FROM registry_file;und rebuild_registry()in my einen Aufruf hinzugefügt page.tpl.php.
Cyclonecode
Das ist zu kompliziert, mach einfach , was John Laine gesagt hat, es hat immer für mich funktioniert.
Jim Kirkpatrick
1
@ JimKirkpatrick - Sie haben Recht, Sie müssen die Module nicht deaktivieren.
Cyclonecode
10

Ich habe ein Backup lokal aus der Produktion wiederhergestellt und versucht, nur Dinge zu verschieben und admin / modules zu drücken oder registry_rebuild () auszuführen, aber es hat nicht verhindert, dass schwerwiegende Fehler ausgelöst wurden. Dies ist für mich sinnvoll, da einige Module möglicherweise Includes oder was auch immer in ihrem hook_init () verwenden, oder Sie haben möglicherweise einen Menürouter-Pfad festgelegt, der von einem Modul oder einem Include abhängt, das Drupal auf dem Bootstrap nicht finden kann. Letztendlich habe ich Folgendes getan (Ihre Wege mögen anders sein):

Schritt 1: Ersetzen Sie sites / all / modules durch sites / all / modules / contrib

UPDATE system SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');

Schritt 2: Ersetzen Sie sites / all / modules / contrib durch sites / all / modules / custom für benutzerdefinierte Module mit Namespace

UPDATE system SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE name LIKE 'my_custom_namespace_%';
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE name LIKE 'my_custom_namespace_%';
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE filename LIKE '%my_custom_namespace_%';

Schritt 3: Verschieben Sie die Dev-Module in sites / all / modules / dev

UPDATE system SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE name LIKE 'devel%';
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE name LIKE 'devel%';
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE filename LIKE '%devel%';

Schritt 4: Löschen Sie die Caches, damit die Dinge ordnungsgemäß gebootet werden

TRUNCATE TABLE cache
TRUNCATE TABLE cache_bootstrap
TRUNCATE TABLE cache_menu
TRUNCATE TABLE cache_page
TRUNCATE TABLE cache_path

Hinweis: Wenn Sie ein benutzerdefiniertes Modul oder einen Beitrag wie LoginToboggan für die Verarbeitung von 403 verwenden (Zugriff verweigert) und sich während dieses Vorgangs abgemeldet haben, müssen Sie möglicherweise die include_fileSpalte in der menu_roterTabelle aktualisieren , um den neuen Pfad für die Include-Datei zu verwenden . Dies ist wahrscheinlich ein seltenes Ereignis.

UPDATE menu_router SET include_file = 'sites/all/modules/custom/my_custom_namespace/includes/foo.inc' WHERE path = 'access-denied'

Sobald diese Abfragen ausgeführt wurden - was nur einen Sekundenbruchteil dauert -, rufen Sie admin / config / development / performance auf und leeren Sie den Cache, damit die Menüpfade neu erstellt werden.

Charlie Schliesser
quelle
Danke dafür! Ich habe die in den Antworten oben genannten Schritte ausprobiert, aber das hat in meinem Fall nicht geholfen. Ich vermute, jemand auf einer von Pantheon gehosteten Site muss diese DB-Anweisungen in Ihrer Antwort ausführen und dann die "Drush-Registry-Neuerstellung" und "Drush-CC-Registry" durchführen
Anne Bonham,
Oh, und auf Pantheon konnte ich keine Site mit dem Redis-Modul außer sites / all / modules einrichten - also habe ich einfach aufgegeben und dieses eine Modul im Stammmodul-Ordner belassen. Na ja - zumindest sind meine anderen Module gut organisiert.
Anne Bonham
Für diejenigen, die LoginToboggan verwenden, sind hier die 3 MySQL-Befehle, die Sie benötigen:update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.admin.inc' WHERE path = 'admin/config/system/logintoboggan'; update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.validation.inc' WHERE path = 'toboggan/revalidate/%'; update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.validation.inc' WHERE path = 'user/validate/%/%/%';
tyler.frankenstein
9

Probieren Sie das coole Tool von Mark Sonnabaum: Drush Rebuild Project Paths . Es automatisiert den Prozess; hat super für mich funktioniert. Verwendet natürlich Drush .

Ich werde den Vorschlag unterstützen, dass Sie dies auf einer Kopie Ihrer Site-Datenbank versuchen.

greg_1_anderson
quelle
7

Für die Aufzeichnung gibt es einen großartigen Drush-Befehl zum Neuerstellen der Registrierung: http://drupal.org/project/registry_rebuild

Auf der Projektseite finden Sie viele Informationen.

jonhattan
quelle
Dies ist meine bevorzugte Methode zum Verschieben von Modulen. Ich hatte einige Module, die aktiviert sites/all/moduleswaren und in ein contribUnterverzeichnis verschoben werden mussten . Alles was ich drush dl registry_rebuild; mv OLD_PATH/module NEW_PATH/module; drush rr
tun
Das hat bei mir funktioniert. Ich habe zuerst alle meine Module verschoben und dann
Uhr
Interessanterweise drush rr --fire-bazookaführt dies zu Fehlern, ist aber drush rrin Ordnung.
Alex Skrypnyk
5

Erstens, sichern Sie immer Ihre Datenbank, so einfach, dass Sie sich selbst stürzen, wenn etwas schief geht und Sie nicht sichern.

Ich bin mir nicht sicher, ob es wichtig ist, ob Sie die Module deaktivieren oder nicht. Vielleicht möchten Sie es tun, nur für den Fall. Dann mach das:

  1. Versetzen Sie Ihre Site in den Wartungsmodus unter (Site-Name) / admin / config / development / maintenance
  2. Verschieben Sie Ihre Module physisch in das Dateisystem.
  3. Leeren Sie Ihre Caches unter (Site-Name) / admin / config / development / performance oder speichern Sie Ihre Modulseite erneut.

Alles erledigt! Drupal sucht erneut nach allen installierten Modulen.

John Laine
quelle
+1 für den
Wartungsmodus
1
Dies führt bei mir zu 100% zu schwerwiegenden Fehlern. Vielleicht funktioniert es, wenn Sie Module verschieben, die keine Abhängigkeiten oder ähnliches haben.
Ergophobe
4

Versuchen Sie es mit dem Modul " Registry Rebuild" . Es hat jedes Mal bei mir funktioniert.

Hier ist ein Zitat darüber (von der Projektseite des Moduls):

Es gibt Zeiten in Drupal 7, in denen die Registrierung hoffnungslos überlastet wird und Sie die Registrierung neu erstellen müssen (eine Liste der PHP-Klassen und der Dateien, mit denen sie verbunden sind). Manchmal können Sie diese reguläre Cache-Clearing-Aktivität jedoch nicht ausführen, da eine bestimmte Klasse erforderlich ist, wenn das System versucht, ein Bootstrap durchzuführen.

drupalastisch
quelle
Während dies theoretisch die Frage beantworten mag, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Wenn es ein Verfahren zum Verschieben von Modulen gibt, das die Verwendung des von Ihnen verknüpften Moduls umfasst, beschreiben Sie es bitte.
Mołot
Keine Theorie ... es funktioniert. Folgen Sie den Anweisungen auf der Seite. Ich habe die Drush-Methode angewendet und es hat einfach funktioniert.
iLLin,
3

Sie können das Modul " Registry Rebuild" verwenden , das über den Drush RRBefehl in Drush integriert wird .

Grundsätzlich machen Sie folgende Schritte:

  1. Verschieben Sie Ihre Module in ein anderes Verzeichnis und
  2. Registry Rebuild erstellt dann die Systemtabelle neu, um die Module an der richtigen Stelle zu platzieren.

Ich habe es zum ersten Mal über DrupalEasy Podcast # 133 gelernt / entdeckt , was weiter erklärt, wie dieses Modul / drush cmd verwendet werden kann.

PS: Natürlich führen Sie zuerst ein Backup Ihrer Site durch ...

Pierre.Vriens
quelle
3
Ich unterstütze das. Website sichern. Verschieben Sie alle Module in neue Ordner. Führen Sie den Registrierungsumbau in drush aus oder folgen Sie einfach den Anweisungen und navigieren Sie zur enthaltenen PHP-Datei, um sie auszuführen. Einfach.
Collins
2

Besuchen Sie / admin / build / modules, um die Pfade in der Systemtabelle neu zu erstellen. Manchmal kann Drupal nicht mehr booten, so dass diese Lösung in diesem Fall nicht funktioniert. Wenn dies nicht funktioniert, können Sie Drush Rebuild Project Paths wie in einer vorherigen Antwort beschrieben verwenden. Sie müssen den neuen Befehl drush hinzufügen, bevor Sie den Bootstrap unterbrechen können. Um den neuen Befehl Check - out der hinzufügen readme ‚s COMMANDS Abschnitt

Zatox
quelle
2

Ich hatte einige Probleme damit drush dl, wegen der Probleme mit dem Modulverzeichnis nicht zu arbeiten. Im Allgemeinen mag ich Stapelantworten, die ich einfach einfügen kann, um die Dinge zum Laufen zu bringen. Hier finden Sie einige Zeilen, in denen Drush Rebuild Registry installiert und auf Ihrer Site ausgeführt wird, wenn Sie sich bereits im richtigen Site-Verzeichnis befinden.

pushd ~  # good if drush on your site is broken because of moved modules
drush dl -y registry_rebuild
popd 
drush rr
fifi finanzen
quelle
2

Ich bin mir bei einer echten Drupal-esk-Antwort nicht 100% sicher, aber meiner Erfahrung nach:

Ich habe versehentlich einen meiner benutzerdefinierten Modulordner in einen anderen benutzerdefinierten Modulordner verschoben, als ich FTP auf den Server geschickt habe. Sie arbeiteten beide noch. Drupal schien es als separates Modul erkannt zu haben, obwohl es sich im Ordner eines anderen Moduls befand. Ich musste das Modul nicht deaktivieren.

** Dieses Modul, das ich verschoben habe, hatte KEINE .install-Datei, daher bin ich mir nicht sicher, ob das wichtig ist.

Exziled
quelle
Die Installationsdatei ist nur für Prozeduren gedacht, die während der Modulinstallation aufgerufen werden, und ist nicht erforderlich. Es hat funktioniert, weil Sie jede Ordnerstruktur unter / sites / all / modules haben können. Drupal sucht rekursiv nach den .info-Dateien.
gbyte.co
@gbyte.co danke für die Klarstellung dazu! Ich wusste über die Installationsdatei Bescheid, wusste aber nicht, wie rekursiv Drupal nach .info-Dateien sucht. Ich dachte, es ist egal, in welchem ​​Unterordner sie sich befinden, aber es ist gut, eine solide Antwort zu haben!
Exziled
1

Drupal - Distributionen behandeln dies nicht gut, so vor kurzem nach versehentlich mit einer Kopie enden Entity API in sites/all/auf einer Panopoly Website, nichts davon gearbeitet. Neuaufbau der Registrierung, Laden der Modulseite und alles andere verursachte einen schwerwiegenden Fehler.

Das Deaktivieren des Moduls ist auch nicht einfach, wenn Sie so etwas wie die Entity-API verschieben müssen, die von Tonnen anderer Module in Panopoly benötigt wird.

Um dies zu lösen, würden Sie für die Entity-API Folgendes tun:

  1. Aktualisieren Sie den Pfad in der Systemtabelle:

    UPDATE `system` 
      SET `filename` = REPLACE(
        `filename`, 
        'sites/all/modules/entity', 
        'profiles/panopoly/modules/contrib/entity'
      );
  2. Erstellen Sie dann die Registrierung neu:

    drush rr
Ergophobe
quelle
1

Drupal 7

Zunächst einmal versuchen drush rr.

Wenn dies nicht funktioniert, versuchen Sie nach dem Verschieben der Dateien die folgenden Drush-Befehle in Ihrem Drupal-Stammverzeichnis:

drush sqlq "TRUNCATE cache; TRUNCATE cache_bootstrap;"
php -r "define('DRUPAL_ROOT', getcwd()); require_once DRUPAL_ROOT . '/includes/bootstrap.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION); registry_rebuild(); registry_update(); cache_clear_all();"
drush -y cc all

Wenn dies nicht funktioniert, suchen Sie die Tabelle mit den alten Informationen zum Pfad nach:

drush --ordered-dump sql-dump | grep "sites/all/modules" # Change the path to the old one.

Wenn keine gefunden wird, bedeutet dies, dass es sich um Ihren externen Cache handelt.

Wenn ja, vergessen Sie nicht, sie neu zu starten, zB:

killall -HUP memcached
drush eval "function_exists('xcache_clear_cache') && xcache_clear_cache();"

Weitere Informationen: Mit welcher Methode werden Caches im Drupal gelöscht?


Alternativ können Sie die folgenden MySQL-Abfragen ausführen, nachdem Sie die Dateien verschoben haben:

UPDATE system SET filename = REPLACE(filename, "sites/all/modules", "sites/newplace/modules") WHERE
       filename LIKE "sites/all/modules/%" AND type = "module"
       AND name IN ("my", "module", "whose", "path", "changed");

UPDATE registry SET filename = REPLACE(filename, "sites/all/modules", "sites/newplace/modules") WHERE
       filename LIKE "sites/all/modules/%"
       AND module IN  ("my", "module", "whose", "path", "changed");
Kenorb
quelle
1

Es wird empfohlen, die Module in die Unterordner contrib / dev / patched / custom zu verschieben. Es gibt keine Leistungssteigerungen, dies geschieht jedoch aus praktischen und ästhetischen Gründen. Dies wird das Leben zukünftiger Entwickler erleichtern.

Sie können die meisten Contrib-Module problemlos auf einer Live-Site in Unterordner verschieben. Sie sollten die Caches danach löschen. Wenn Sie drush nicht verwenden und feststellen, dass Sie nicht mehr auf die Cache-Löschseite zugreifen können, müssen Sie /update.php besuchen oder die Cache-Tabellen manuell kürzen. Beim Verschieben des Entity-API-Moduls musste ich immer nur den letzten Schritt ausführen.

Das Verschieben von Core-Modulen ist technisch möglich, aber ich würde es weder empfehlen, noch sehe ich einen gültigen Grund dafür.

Update: Das Verschieben von Modulen wie der Entitäts-API erfordert möglicherweise eine Neuerstellung der Registrierung. Überprüfen Sie die Seite " registry_rebuild ".

gbyte.co
quelle
-4

Sie können einfach einen Sym-Link im Verzeichnis sites / all / modules hinzufügen, der auf sites / all / contrib verweist. Ich bin nicht sicher, ob es Ihr Problem löst. Es gibt auch andere Lösungen, einschließlich des Installationsprofils oder einer Drush-Make-Datei. Ich weiß nicht genug, um Details zu liefern, aber es ist zumindest eine Richtung, die Sie betrachten können.

Lexikon
quelle
5
Längerfristig
Dies ist ein Hack und geht um das Update ... keine gute Lösung.
iLLin,
yep viel besser drush registry_rebuild verwenden, jetzt da es verfügbar ist.
Lexicant