Wie kann ich das Gewicht des Moduls während des Modulinstallationsprozesses reduzieren / erhöhen?

8

Ich entwickle ein benutzerdefiniertes Modul und möchte mein Modulgewicht erhöhen, wenn das Modul installiert ist.

Wie kann ich das erreichen? Weiß sonst jemand, in welcher Tabelle das Gewicht des Moduls gespeichert ist?

user15837
quelle

Antworten:

5

Verwenden Sie das Modulgewicht, hook_module_implements_alter()anstatt es zu ändern.

Beispielimplementierung aus content_translation.module :

function content_translation_module_implements_alter(&$implementations, $hook) {
  switch ($hook) {

    // Move our hook_entity_type_alter() implementation to the end of the list.
    case 'entity_type_alter':
      $group = $implementations['content_translation'];
      unset($implementations['content_translation']);
      $implementations['content_translation'] = $group;
      break;

    // Move our hook_entity_bundle_info_alter() implementation to the top of the
    // list, so that any other hook implementation can rely on bundles being
    // correctly marked as translatable.
    case 'entity_bundle_info_alter':
      $group = $implementations['content_translation'];
      $implementations = [
        'content_translation' => $group,
      ] + $implementations;
      break;
  }
}
Vladislav
quelle
Okay. Ich werde das tun. Meine Frage ist, wo ich diese Werte in der Drupal-Datenbank sehen kann.
user15837
2
Es sei denn , das Modul versuchen Sie zu überwiegen auch Anwendungen hook_module_implements_alter()(eigentlich mir passiert ist , denke ich , mit einem der i18n Module).
Zauberlösungen
5

Dafür gibt es jetzt eine API:

module_set_weight('your_module_name', 10);

Sie können den Hook auch implementieren, wie Ivan Jaros sagte, was eine feinkörnigere Steuerung ermöglicht (z. B. zuerst für einen Hook, zuletzt für einen anderen, nach einem bestimmten Modul für den dritten). Das Modulgewicht sollte aber auch funktionieren.

Berdir
quelle
Aber was hat höhere Priorität, hohe oder niedrige Gewichte?
RaisinBranCrunch
4
Niedrig kommt zuerst: -10 ....- 1 .... 1 .... 10 und so weiter.
Berdir
4

Wenn Sie Import / Export-Konfigurationen verwenden, können Sie das Gewicht des Moduls in der core.extension.ymlDatei ändern. Die Nummer nach dem Namen des Moduls ist das Gewicht.

Skorzh
quelle
2
Dies funktioniert nur, wenn Sie auch die Reihenfolge der Module in der Liste ändern. Sie sollten nach Modulgewicht aufsteigend geordnet sein.
Marcvangend
4

Sie können die Verwendung Module Gewicht Modul:

Manchmal müssen wir die Ausführungsreihenfolge der Module ändern, und einige Leute könnten einen Code schreiben, der die Abfrage ausführt, um das Gewicht eines Moduls in der Systemtabelle zu ändern. Einige gehen direkt zu seinem bevorzugten SQL-Client und ändern den Datensatz direkt. Dieses Modul bietet eine Schnittstelle zum Neuordnen des Modulgewichts.

Offenlegung: Ich bin der Betreuer des Moduls Modules Weight .

Adrian Cid Almaguer
quelle
Nicht um Ihre Antwort zu entführen, aber was sind einige Beispiele dafür, warum "manchmal müssen wir die Ausführungsreihenfolge ändern"?
Pierre.Vriens
@ Pierre.Vriens Gute Frage, ich weiß es wirklich nicht: -O. Ich denke, dass Sie manchmal sicher sein müssen, dass Ihr Code der erste oder der letzte ausgeführte ist. Ich habe dieses Problem noch nie zuvor, ich sehe nur das Modul in Drupal 7 ohne Drupal 8-Version und starte den Port ;-)
Adrian Cid Almaguer
1
@ Pierre.Vriens In meinem Fall verfügt D8 über die Funktion "Abhängigkeitsinjektion", mit der Sie alles in services.yml in Ihrem benutzerdefinierten Modul ändern können. Das Problem tritt auf, wenn das, was Sie überschreiben möchten, tatsächlich eine höhere Priorität hat (auch bekannt als Modulgewicht). Ich meine, wenn Ihr benutzerdefiniertes Modul zuerst ausgeführt wird als das Modul services.yml, das Sie ändern möchten. Daher müssen Sie Ihr benutzerdefiniertes Modul ändern, das danach ausgeführt werden soll.
Kororo