Ich habe endlich angefangen, mich ernsthaft mit Drupal 8 zu beschäftigen und interessiere mich besonders für das Konfigurationsmanagement. Ich bin auf etwas gestoßen, das ein bisschen problematisch sein könnte, und zwar in Bezug auf benutzerdefinierten Blockinhalt.
Ich kann sehen, dass das Konfigurationsverwaltungssystem Blockkonfigurationen exportieren kann - Region, Thema, Gewicht, Sichtbarkeit usw. Der tatsächliche Blockinhalt wird jedoch beim Konfigurationsexport nicht berücksichtigt, was angemessen und verständlich ist.
Beim Importieren dieser Blockkonfiguration in einen Produktionsstandort wird anscheinend die Blockkonfiguration erstellt und eine Wartemeldung erstellt, in der gemeldet wird, dass der Block beschädigt ist oder fehlt. Offensichtlich ist der Blockinhalt nicht auf dem Produktionsserver vorhanden.
Wie können benutzerdefinierte Blöcke von einem Entwicklungs- / Staging-Server auf einen Produktionsserver migriert werden? Mir ist klar, dass Blöcke in Drupal 8 feldfähige Entitäten wie Knoten sind und daher auf die gleiche Weise migriert werden müssen, und ich verstehe, dass es in Drupal 8 eine Migrate-API gibt, die jedoch für die Migration von Inhalten von Drupal 6- und Drupal 7-Sites entwickelt wurde Drupal 8 im Gegensatz zu Drupal 8 zu Drupal 8-Sites.
Dieses Problem bezieht sich speziell auf benutzerdefinierte Blöcke, da von anderen Modulen wie Ansichten generierte Blöcke offensichtlich als Konfiguration migriert werden.
Antworten:
Eine andere Antwort, die ich hier nicht gesehen habe, ist die Verwendung des Simple Block- Moduls, das ziemlich identisch mit dem 'Custom Block'-Setup des Kerns ist, aber statt eines seltsamen Hybrids aus content + config stehen Ihnen alle Block-Einstellungen und Inhalte zur Verfügung in der Konfiguration gespeichert, die sauber exportiert und importiert werden kann.
Weitere Informationen finden Sie in Drupal 8 Core: Benutzerdefinierte Blöcke können nicht ordnungsgemäß exportiert und importiert werden .
quelle
Ich habe gerade ein Modul veröffentlicht, das dieses Problem löst. Im Wesentlichen stellt das Modul einen Blocktyp basierend auf der Konfiguration (den festen Block) bereit, der einen benutzerdefinierten Block (den Inhaltsblock) umschließt. Wenn der Inhaltsblock nicht vorhanden ist, wird er mit einem Standardinhalt erstellt oder ist leer, wenn kein Standardinhalt festgelegt wurde. Alles wird über die Benutzeroberfläche erledigt, es sind keine speziellen Dateien oder benutzerdefinierten Module erforderlich.
Ich habe es Fixed Block-Inhalt genannt und es ist veröffentlicht unter:
https://www.drupal.org/project/fixed_block_content
quelle
Ein weiterer Ansatz zum Beibehalten von Inhalten, die als Teil der Entwicklung hinzugefügt werden, besteht darin, das Standardinhaltsmodul zum Exportieren des Inhalts zu verwenden. Der Inhalt wird so erstellt, dass er in den Ordner "content" eines Installationsprofils exportiert wird. Wenn das Modul aktiviert ist, wird der Inhalt bei der Installation der Site automatisch übernommen. Es ist jedoch auch möglich, den Inhalt einzeln zu importieren B. in einem Update-Hook mit dem folgenden Code in Ihrem example.install- oder example.profile:
Exportieren Sie einen benutzerdefinierten Block mit einer ID von 8:
(Wenn Sie Ihren Profilpfad nicht in den Drush-Einstellungen festgelegt haben, müssen Sie ihn oben angeben.)
Und verwenden Sie den resultierenden Export in Ihrer example.install-Datei wie folgt:
http://data.agaric.com/easily-add-content-update-hooks-use-default-content-module-exports-create-content-needs-be-sync-conf
quelle
Ich bin mir nicht sicher, ob die Synchronisierung von Blockkonfigurationen in mehreren Umgebungen von großem Vorteil ist, da Blöcke so stark mit Inhalten verflochten sind.
Der Grund dafür ist, dass aus den yml-Dateien ein neuer Block erstellt wird, der keinen Titel / Text (Inhalt) hat und daher die Meldung 'broken / missing' ausgibt.
Sie könnten versuchen, die UUID (wenn Sie den Block an beiden Stellen erstellen möchten - stellen Sie sicher, dass der Maschinenname übereinstimmt ...) in Ihrer block_content-Entwicklungstabelle mit der UUID in Ihrer Produktion übereinzustimmen (die anderen Beziehungen scheinen die Entität zu verwenden) Ich würde). Wenn Sie dann eine Konfigurationssynchronisierung durchführen, können Sie die 'Unterschiede anzeigen' in den yml-Dateien sehen und möglicherweise sehen, was Sie sonst noch an dev ändern müssen, damit es mit den Produktions-UUIDs usw. übereinstimmt. Ich habe dies zum Laufen gebracht, aber es ist immer noch klar Es ist am einfachsten, alle Ihre Blockkonfigurationen im Code zu ignorieren, es sei denn, Sie führen diesen Prozess durch oder erstellen eine Art Datenbankblock-Synchronisierung für sich, indem Sie block_content, block_content__body und block_content_field_data verwenden.
Es ist nicht sehr elegant, aber es könnte Ihnen ermöglichen, Ihre Blockkonfigurationen im Code zu halten. Wenn Sie andernfalls weiterhin Blöcke mit config bereitstellen, sind diese immer "defekt" oder "fehlen".
In einem anderen Blog-Beitrag wird vorgeschlagen , einen benutzerdefinierten Block in einer Live-Umgebung zu erstellen, ihn jedoch nicht zu platzieren. Nachdem die Datenbank mit dev synchronisiert wurde, konnte der benutzerdefinierte Block konfiguriert und die Konfiguration exportiert werden. Da er bereits im Live-Import der Platzierung vorhanden ist, ist dies möglich.
quelle
Das gleiche Problem und nicht wirklich eine Lösung, nur Ergänzungen: In der kollaborativen Entwicklung verwenden wir einen Staging-Server, der aus dem Repository abruft und die gesamte Konfiguration zurücksetzt. Dies bedeutet, dass die Blockkonfiguration automatisch zurückgesetzt wird. Sie können einfach keine Blöcke, die Sie als "Inhalt" betrachten, direkt auf diesem Server platzieren.
Es ist einfach, die Synchronisierung von Drush-Konfiguration und Export zu verwenden, während Sie genau wissen, was Sie getan haben, und sicher sind, dass alle Konfigurationsänderungen für die Bereitstellung vorgesehen sind. Aber Drupal entscheidet für uns, dass Blöcke Konfiguration sind (während Blockinhalte offensichtlich als Inhalt behandelt werden). Das scheint also durch das Design gebrochen zu sein.
Für die gegebene Zeit denke ich, dass die praktischste Lösung darin besteht, die blockbezogenen yml-Dateien zu .gitignore hinzuzufügen.
quelle
Ich bin mir jedoch auch nicht sicher, ob Sie dieses Modul https://www.drupal.org/project/deploy ansehen können, wenn Sie keine Lösung gefunden haben . Ehrlich gesagt kann ich mich nicht erinnern, Push-Blöcke von DEV nach PROD implementiert zu haben oder nicht.
quelle
Ich denke, der beste Weg, um damit umzugehen, wäre:
Das ist es, was ich normalerweise sehe, wenn Leute es benutzen und ich persönlich benutze. Es synchronisiert jedoch die gesamte Datenbank im Vergleich nur zum Blockinhalt.
quelle
Bitte nehmen Sie das Structure Sync- Modul in die Hand .
Schritte:
quelle