Installation nicht möglich ... ist bereits in der aktiven Konfiguration vorhanden

13

Unter Drupal 8.1 werden solche Nachrichten weiterhin angezeigt, wenn ich versuche, ein benutzerdefiniertes Modul oder eine benutzerdefinierte Funktion zu aktivieren, die Änderungen an der Basisseite vornimmt. (Felder hinzufügen).

Es ist wirklich nervig ...

Schritte:

  • Datenbank vollständig löschen
  • Gehe zu /install.php und wähle Standardprofil
  • Nachdem die Site ausgeführt wird, wechseln Sie zu Erweitern
  • Wählen Sie Feature - Basisseite

Ergebnis:

Unable to install Feature - Basic Page, core.base_field_override.node.page.promote, core.entity_form_display.node.page.default, core.entity_view_display.node.page.default, core.entity_view_display.node.page.teaser, field.field.node.page.body, node.type.page already exist in active configuration.

Nun ja ... das ist, was ich tun möchte: Ändern Sie diese Standardeinstellungen!

Expexted:

Sie können meine Funktion installieren, die einige Änderungen an der Basisseite vornimmt.

Meine Funktion

Hier ist mein Feature erstellen mit dem Features Modul

Grundsätzlich werden der Basisseite die beiden Felder banner_image und background_image hinzugefügt

Dateien:

config
    install
        core.base_field_override.node.page.changed.yml
        core.base_field_override.node.page.created.yml
        core.base_field_override.node.page.promote.yml
        core.base_field_override.node.page.status.yml
        core.base_field_override.node.page.sticky.yml
        core.base_field_override.node.page.title.yml
        core.base_field_override.node.page.uid.yml
        core.entity_form_display.node.page.default.yml
        core.entity_view_display.node.page.default.yml
        core.entity_view_display.node.page.teaser.yml
        field.field.node.page.body.yml
        field.field.node.page.field_banner_image.yml
        field.field.node.page.field_image.yml
        field.storage.node.field_banner_image.yml
        language.content_settings.node.page.yml
        node.type.page.yml
feature_basic_page.features.yml
feature_basic_page.info.yml

Warum wird diese einfache Sache nicht unterstützt? Ist es ein Bug? Was soll ich tun, um meine Funktion nutzen zu können?

Guillaume Bois
quelle
1
Verwenden Sie das Drupal EasyInstall- Modul, mit dem aktive Konfigurationen entfernt werden
Karthikeyan Manivasagam
1
+1 interessantes Modul - einen Blick wert - danke @KarthikeyanManivasagam
therobyouknow

Antworten:

22

Mit Drush kannst du das wahrscheinlich machen

drush config-delete module_name.settings

um die Konfigurationen zu löschen, die sich beschweren

GiorgosK
quelle
Ich habe auch während meines epischen Kampfes gegen Drupal entdeckt, dass Sie diese Konfigurationen in einen optional/Ordner verschieben können, um ihn zum Schweigen zu bringen. Aber ich bin mir nicht sicher, was das alles zu bedeuten hat ...
Guillaume Bois
@ GuillaumeBois: Die Folgen sind, dass diese optionalen Konfigurationen ignoriert werden, wenn sie bereits installiert sind oder wenn Abhängigkeiten nicht erfüllt werden. Dies kann zu weiteren Problemen führen, wenn die Konfiguration erforderlich ist, damit das Modul funktioniert.
Renrhaf
+1 Danke @GiorgosK (Teil 1 von 2): Ich fand diese Lösung in meinem Fall: Ich hatte diesen Fehler im Webbrowser für meine Entwickler-Site: Warning: in_array() expects parameter 2 to be array, null given in lightning_layout_block_alter() (line 91 of modules/contrib/lightning_layout/lightning_layout.module).nachdem ich meine Site-Code-Git-Quelle und -Datenbank auf einem anderen Computer eingerichtet hatte .
Therobyouknow
(Teil 2 von 2) Um das Problem zu lösen, habe ich versucht, lightning_layout zu deinstallieren und neu zu installieren. drush pm-uninstall lightning_layoutfunktionierte aber dann, als ich versuchte, es erneut zu installieren, drush en lightning_layoutbekam ich diesen Befehlszeilenfehler "In PreExistingConfigException.php, Zeile 65: Konfigurationsobjekte (field.storage.node.panelizer), die von lightning_layout bereitgestellt wurden, sind bereits in der aktiven Konfiguration vorhanden." Lösung also: drush config-delete field.storage.node.panelizer und war dann in der Lage, das Modul wieder zu aktivieren:drush en lightning_layout
Therobyouknow
1
Wenn Sie nicht sicher sind, welche "Einstellungen" Sie löschen müssen, sollten Sie "drush config-list" ausführen, um den genauen Namen der Konfiguration zu erhalten
Jorge Valvert
3

Diese Funktion wird nicht unterstützt, da ein Modul möglicherweise keine Konfigurationsentität ersetzt, die bereits mit install config vorhanden ist.

Um Formular- und Ansichtsmoduskonfigurationen für einen bereits vorhandenen Knotentyp hinzuzufügen, müssen Sie dies in Code in hook_install () implementieren.

Oder Sie müssen zuerst den Knotentyp auf Ihrer Site löschen, dann aber auch den Inhalt.

Und nein, dies ist kein Fehler. Dies ist die Definition, um Konfigurationsverluste zu vermeiden.

Berdir
quelle
Das ist sehr traurig. In D7 war dies möglich (Hinzufügen von Feldern zu einer Basisseite über ein Feature). Ich denke immer noch, dass es auch in D8 sein sollte. Sie sagen, dies soll einen Konfigurationsverlust verhindern, aber in Wirklichkeit werden lediglich Konfigurationen hinzugefügt (Felder, Gewicht, Beschriftung usw.). Beachten Sie, dass ich dieses Problem auch bei meinen eigenen benutzerdefinierten Modulen hatte.
Guillaume Bois
Nein, es fügt nicht nur hinzu. Die Ansichts- und Formularanzeigen werden für alle Felder eines einzelnen Knotentyps gemeinsam genutzt. Was passiert, wenn zwei Module versuchen, diese Datei hinzuzufügen? Wer gewinnt? Was passiert mit vorhandenen Feldern, die sich bereits im Seitentyp befinden? Was ist, wenn der Basisknotentyp vorhanden ist, jedoch andere Einstellungen als in Ihrem Feld vorgenommen wurden? Die Verhaltensszenarien wie diese sind nicht definiert. Für eine eigenständige Funktion ist es besser, wenn Sie Ihren eigenen Knotentyp definieren und diese Änderung auf Ihrer eigenen Site bereitstellen. Sie benötigen kein Funktionsmodul wie in 7.x. Sie können die Konfiguration einfach exportieren und erneut importieren.
Berdir
@berdir das ist sehr interessant. Aus diesem Grund habe ich versucht, eine Benutzerprofilfunktion zu erstellen, die Anzeige- und Formularnotizen enthält. Wollen Sie damit sagen, dass dies in Features nicht möglich ist, da der Benutzerinhaltstyp bereits vorhanden ist und das Feature versucht, dies zu aktivieren? Gibt es eine Möglichkeit, zuzulassen, dass ein Feature dieses überschreibt, sodass jemand ein Profilfeature auf einer bereits vorhandenen Site aktivieren kann?
Kaleemclarkson
Der Benutzer @kaleemclarkson ist kein Inhaltstyp, sondern ein Entitätstyp. Die einzige Möglichkeit, dies zu tun, ist die von mir beschriebene. Sie müssen Code in hook_install () Ihres Funktionsmoduls implementieren, um die Anzeigekonfiguration für Formulare und Anzeigen festzulegen. Oder verwenden Sie das Profilmodul und definieren Sie dort Ihren eigenen Profiltyp.
Berdir
3

Gefundenes Modul, verwenden Sie das Easy Install- Modul, um die aktive Konfiguration ohne Verwendung von Devel oder Drush zu löschen . Es funktioniert auch, wenn Sie den optionalen Ordner und die erzwungene Option in den Konfigurationsdateien Ihres Moduls ( yml ) verpasst haben.

Karthikeyan Manivasagam
quelle
1
Dies ist eine fantastische Option! Ich habe das gerade heute benutzt und es hat mir so viel Zeit gespart!
rtd1123
3

Ich habe das gleiche Problem für die Pantheon-Site. Ich habe den Drush-Befehl eingegeben

Pantheonsite: drush @ pantheon.SITENAME.ENVNAME config-delete ERRORNAME

Localsite: drush config-delete ERRORNAME

Es ist Arbeit für mich.

omkar gaonkar
quelle
0

Wenn Sie Ihrem benutzerdefinierten Modul Konfigurationen hinzufügen möchten, diese aber bereits in der aktiven Konfiguration vorhanden sind, und aus irgendeinem Grund diese Konfigurationen nicht mit drush gelöscht werden können (in meinem Fall, weil sie Teil eines Installationsprofils sind), sind Sie sich sicher Es wird kein Problem geben, wenn Sie die Konfiguration überschreiben. Hier ist ein Ansatz zum Ersetzen dieser Konfigurationen.

Fügen Sie einen neuen Ordner in Ihrem benutzerdefinierten Modul / config / hook_install hinzu, und fügen Sie Ihre config.yml-Dateien in diesem Ordner und anschließend in der hook_install Ihres Moduls hinzu.

use Drupal\Component\Serialization\Yaml;

/**
 * Implements hook_install().
 */
function mymodule_install() {

  // Replace these configs.  We're using code to do this, as they are already
  // installed.
  $config_files = [
    'language.types',
    'language.negotiation',
  ];

  foreach ($config_files as $config_id) {
    $raw_data = file_get_contents(drupal_get_path('module', 'mymodule') . '/config/hook_install/' . $config_id . '.yml');
    \Drupal::configFactory()->getEditable($config_id)
      ->setData(Yaml::decode($raw_data))
      ->save();
  }
}
oknate
quelle