Wie migriere ich Blockinhalte von einem Entwickler zu einer Produktionssite?

24

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.


quelle
Es sind mehrere Content-Staging-Lösungen in Arbeit, darunter das Bereitstellungsmodul und entitypilot.com (Haftungsausschluss, das ist mein Produkt)
larowlan
1
Ähnlich: Blockierfehler auf CMI
Kenorb

Antworten:

7

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 .

Geerlingguy
quelle
3

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

Manuel Adan
quelle
1

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:

<?php
/**
* Import a piece of content exported by default content module.
*/
function example_import_default_content($path_to_content_json) {
  list($entity_type_id, $filename) = explode('/', $path_to_content_json);
  $p = drupal_get_path('profile', 'guts');
  $encoded_content = file_get_contents($p . '/content/' . $path_to_content_json);
  $serializer = \Drupal::service('serializer');
  $content = $serializer->decode($encoded_content, 'hal_json');
  global $base_url;
  $url = $base_url . base_path();
  $content['_links']['type']['href'] = str_replace('http://drupal.org/', $url, $content['_links']['type']['href']);
  $contents = $serializer->encode($content, 'hal_json');
  $class = 'Drupal\\' . $entity_type_id . '\Entity\\' . str_replace(' ', '', ucwords(str_replace('_', ' ', $entity_type_id)));
  $entity = $serializer->deserialize($contents, $class, 'hal_json', array('request_method' => 'POST'));
  $entity->enforceIsNew(TRUE);
  $entity->save();
}

Exportieren Sie einen benutzerdefinierten Block mit einer ID von 8:

drush dcer block_content 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:

<?php
/**
* Add the footer block content.
*
* Implements hook_update_N().
*/
function example_update_8001() {
  example_import_default_content('block_content/136efd63-021e-42ea-8202-8b97305cc07f.json');
}

http://data.agaric.com/easily-add-content-update-hooks-use-default-content-module-exports-create-content-needs-be-sync-conf

mlncn
quelle
0

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.

ErzbischofLolly
quelle
0

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.

Hexabinaer
quelle
1
Config Ignore ist wahrscheinlich besser als .gitignore: drupal.org/project/config_ignore
bdanin
0

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.

Ruslan P
quelle
0

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.

Jigarius
quelle
Dies kann funktionieren, wenn kein Problem mit dem Überschreiben der Datenbank vorliegt. Wenn der einzige Wunsch darin besteht, einen neuen benutzerdefinierten Block in eine vorhandene Datenbank zu verschieben, ist diese Methode schwierig zu implementieren.
Karolus
Diese Antwort hat theoretisch ihren Platz. In der Praxis ist dies jedoch keine gute Lösung, insbesondere wenn das Projekt eine Aufteilung der Konfiguration verwendet oder eine andere Konfiguration zwischen den Umgebungen aufweist (was sehr wahrscheinlich ist).
2.
0

Bitte nehmen Sie das Structure Sync- Modul in die Hand .

Die Struktursynchronisierung bietet Drush-Befehle und Administrationsoberflächen zum Synchronisieren von Inhalten, die auch als Konfiguration betrachtet werden können. Einschließlich Menüelemente, benutzerdefinierte Blöcke und Taxonomiebegriffe.

Schritte:

  1. Gehe zur Struktursynchronisation.
  2. Gehen Sie zur Registerkarte Blöcke.
  3. Export.
  4. Ihre Konfigurationen und Inhalte werden in den Konfigurationsordner exportiert.
  5. Übertragen Sie die Konfigurationen auf andere Sites und importieren Sie sie.
  6. Gehe zur Struktursynchronisation und klicke auf Importieren.
  7. Getan
Pranay Agarwal
quelle