Drupal Schnittstellen, Integrationen und Migrationen

Drupal und Schnittstellen

 

Bei CYLEDGE stehen wir oft vor der Herausforderung, unterschiedliche Systeme zu integrieren, um einen optimalen Workflow zu gewährleisten. Sowohl unsere Kund*innen, als auch die Benutzer*innen der von uns entwickelten Lösungen können auf diese Art eine ganzheitliche User Experience erfahren. Drupal bietet uns dafür zahlreiche Möglichkeiten:

 

1. Migrate

Die Migrate API ist ein wichtiger Baustein, um ältere Drupal Seiten auf die neueste Version zu aktualisieren. Hierbei bietet Drupal fertige Bausteine, um Inhalte, Benutzer, usw. vollständig automatisiert auf die neueste Drupal 8/9 Datenstruktur zu migrieren, ohne das Daten verloren gehen.

CYLEDGE hat aber auch einen anderen Nutzen für das Migrate Ökosystem: Automatisierte Verarbeitung und Synchronisation einer externen Schnittstelle.

Die Aufgabe ist es, von einer SOAP Schnittstelle große Datenmengen abzuholen, zu bereinigen, teilweise die Struktur zu adaptieren und dann in Drupal zu speichern. Zusätzlich sollen bereits initial bestehende Daten vom Prozess erkannt und entsprechend synchronisiert werden.

Ein großer Vorteil der Drupal Migration ist es, dass sie deklarativ im YML beschrieben werden können. Das macht den Ablauf der einzelnen Schritte sehr klar und einfach lesbar. Es bedarf keines PHP-Codes, welcher die Migration definiert sondern ein leicht lesbares, strukturiertes Dokument.

Out of the box unterstützt Drupal keine Migration von SOAP, daher greifen wir auf Migrate Plus zurück, welches nicht nur mit einer SOAP Integration, sondern auch mit vielen anderen Funktionen aufwarten kann. Durch Drupals Plugin-Architektur können wir rasch diverse “Process Plugins” in den Migrationsprozess integrieren, die einzelne Datenfelder verarbeiten und bei Bedarf konvertieren.

Eine weitere Herausforderung ist, dass die Daten nicht aus einer einzigen SOAP Quelle kommen, sondern aus mehreren. Da sich die Daten untereinander referenzieren, wäre es sehr ineffizient, für jeden neuen Datensatz einer Quelle die referenzierten Daten aus der anderen Quelle einzeln zu holen. Um dieses Problem zu lösen, holen wir alle Daten pro Migrate-Durchlauf einmal komplett ab und schreiben sie in entsprechende Cache-Dateien. Hier kommt uns die YML-Migrationsdatei zu Gute: Das von Drupal stammende “Source”-Basis Plugin liest alle im YML definierten Parameter aus. So können wir die Pfade zu den Dateien an einer zentralen Stelle definieren und an jeder Stelle im Migrationsprozess einfach auslesen. Dadurch verhindern wir, unnötig viele Anfragen an den SOAP Server zu richten und eine mehrfache oder nicht sofort ersichtliche Definition der Dateipfade irgendwo im Programmcode.

Die zu bespielende Drupal Instanz enthält bereits einen geringfügigen Teil der zu synchronisierenden Daten. Diese wurden im Laufe der Jahre redaktionell hinzugefügt. Da diese Inhalte an vielen Stellen bereits verwendet wurden, können wir einerseits nicht alle entsprechenden Inhalte löschen, andererseits sollen die Inhalte durch erneutes Anlegen nicht dupliziert werden. Wir haben bereits in einem anderen Blogartikel die Vorzüge eines Open Source Systems beschrieben. Dadurch können wir die Funktionen, welche Migrationen in die Datenbank schreibt schnell ausfindig machen. Die Umsetzung der Funktion, welche existierende Produkte bei Migrate registriert, ist dadurch schnell umgesetzt. Dadurch können wir die Funktionen, welche einen einzelnen Datensatz in der Migration registriert, ausfindig machen. Die Umsetzung in unserem Code benötigte daher minimalen Aufwand.

Um leichter mit den einzelnen Abläufen zu arbeiten, helfen uns Drush-Kommandos: Wir registrieren einmalig die schon bestehenden Inhalte bei Migrate und lassen mit Hilfe eines Cron-Jobs nächtlich die Migration laufen. So stellen wir sicher, dass wir neue Inhalte korrekt erstellen, bestehende bei Bedarf aktualisieren und nicht mehr verwendete (sowie davon referenzierte Inhalte) entfernen.

 

2. JSON:API

Eine weitere Schnittstelle, die wir gerne verwenden ist die JSON:API. Mit ihrer Hilfe ist es möglich, Daten aus Drupal zu lesen, ohne im eigentlichen Drupal Interface zu arbeiten. Dies wird oft als “Headless Drupal” bezeichnet und ist eine mächtige, voll in Drupals Grundsystem integrierte Funktion des CMS.

Eines unserer Anwendungsbeispiele ist das Auslesen und Darstellen von Besucher*innen gesendeten Nachrichten (vergleichbar mit einer Art “Gästebuch”): anonyme Benutzer*innen sollen in einem Formular Daten ausfüllen. Diese werden an Drupal gesendet und (nach einer Validierung) gespeichert. Da die JSON:API die Validierungs-Mechanismen Drupals zur Gänze unterstützt, können wir im Bedarfsfall dem Benutzer bereits aussagekräftige Fehlermeldungen anzeigen, ohne diese selbst entwickeln zu müssen. Durch die volle Unterstützung von Mehrsprachigkeit durch die JSON:API Bedarf es keiner weiteren Behandlung der Sprache; es werden sämtliche Nachrichten und Fehlermeldungen in der korrekten Sprache ausgeliefert.

Durch die gute Dokumentation der Community ist es einfach vom Benutzer hochgeladene Bilder zu speichernneue Posts anzulegen oder nur eine bestimmte Anzahl an Inhalten abzurufen und bei Bedarf nachzuladen. Um zu verhindern, dass alle gesendeten Inhalte ohne Kontrolle erscheinen, bedienten wir uns des “hook_ENTITY_TYPE_presave()” Hooks um jeden Erzeugten Inhalt als “unpublished” - also nicht öffentlich - zu markieren und anschließend mit Hilfe von Rules mehrere E-Mails an Redakteure für eine inhaltliche Überprüfung zu senden.

 

Zur Umsetzung der an uns gestellten Anforderungen war Drupal eine ideale Lösung, weil:

  • es gut getestete sowie einfach zu definierende Abläufe ermöglicht (z.B. Migrationen mit Hilfe von YML)
     
  • durch seine Quell-offenheit spezifische, jedoch nicht oft genutzte Funktionen finden kann, welche zum Teil komplexe Programmabläufe bereits umgesetzt haben (z.B. die Registrierung bestehender Inhalte für die Migration)
     
  • volle Integration seiner Schnittstellen bietet (z.B. Validierung, Übersetzung oder Berechtigungen via JSON:API)
     
  • gute Dokumentationen via drupal.org bietet, die den Einstieg in neue Themen erleichtern (z.B. einzelne Funktionen der JSON:API)