User-definierte Dialogfelder mit JavaScript erstellen
Apr. 27, 2021
--
Javascript fields 656x400

User-definierte Dialogfelder mit JavaScript erstellen

Magnolia-Autoren verwenden eine spezielle Schnittstelle zur Verwaltung von Seitendaten, den sogenannten Dialog. Ein Dialog ist ein Pop-up mit einer Reihe von Feldern zum Hinzufügen und Bearbeiten von Inhalten in Magnolias WYSIWYG-Editor. Magnolia bietet nicht nur von Haus aus viele Feldtypen, sondern ermöglicht es Developern auch, eigene Feldtypen mit Hilfe von JavaScript und dateibasierter Konfiguration zu erstellen.

Um Dialoge zu definieren, verwenden die Developer die Datenmodellierung, wobei jeder Feldtyp angegeben wird. Unten sehen Sie ein einfaches Beispiel für ein Dialogfeld, das aus zwei Registerkarten besteht: Text und Bild. Auf der Registerkarte Text können die Autoren eine Überschrift und einen Text definieren. Die Überschrift ist ein Textfeld und der Text ist ein Rich-Text-Feld:

Text_and_image

Dialogfelder

Die in Magnolia verfügbaren Feldtypen decken wahrscheinlich Ihre Projektanforderungen ab, aber wahrscheinlich nicht immer. Daher ermöglichen wir es Developer, eigene Dialogfelder zu definieren.

Bisher mussten Sie sich die Hände mit Java schmutzig machen, um User-definierte Felder zu erstellen. Das ist aus zwei Gründen nicht ideal.

  1. Viele Developer von Vorlagen sind mit Java nicht vertraut.

  2. Jedes Java-Modul erfordert ein Deployment und einen Neustart aller Magnolia-Instanzen.

JavaScript-Dialogfelder

Diese Herausforderung kann mit Hilfe eines Moduls, JavaScript Dialog Fields, leicht überwunden werden. Diese Erweiterung ermöglicht die dateibasierte Konfiguration von User-definierten Dialogfeldern mit Magnolia Light Development. Jetzt können Developer User-definierte Dialogfelder des Typs javascriptField durch einfache YAML-Konfiguration erstellen.

Der Feldtyp javascriptField lädt eine HTML-Datei in einen iframe. Der iframe kommuniziert mit Magnolia über eine Reihe von vordefinierten Nachrichten.

Um die Verwendung des Moduls besser zu verstehen, wollen wir ein Dialogfeld für die Farbauswahl erstellen.

Beginnen Sie mit der Erstellung der Dialogdefinition colorField.yaml:

Java
  form: implementationClass: info.magnolia.ui.javascript.form.FormViewWithChangeListener properties: colorField: label: Farbfeld $type: javascriptField fieldScript: /ui-framework-javascript-examples/webresources/colorField.html Höhe: 40  

Das Formular verwendet den neuen Feldtyp javascriptField und fieldScript verweist auf die HTML-Datei, die in den iframe geladen werden soll. Height definiert die Höhe des iframe, der von Magnolia gerendert wird.

colorField.yaml muss in ein bestehendes oder neues Lichtmodul eingefügt werden.

Als nächstes erstellen Sie eine minimale Seite mit einem Eingabefeld namens colorField.html:

Java
  <!DOCTYPE html>
<html>
 <head>
   <meta charset="utf-8" />
   <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
 </head>
 <body>
   <input id="input" type="color" />
   <script>
     let input = document.getElementById('input');
     let correlationId;
 
     input.addEventListener('change', function () {
       parent.window.postMessage({ action: 'changeValue', correlationId, value: input.value }, '*');
     });
 
     window.addEventListener(
       'message',
       function (event) {
         if (event.data.action === 'init') {
           correlationId = event.data.correlationId;
           input.value = event.data.state.value || event.data.state.defaultValue || '';
         }
       },
       false
     );
   </script>
 </body>
</html>

Die Kommunikation zwischen Magnolia und dem iframe erfolgt über JavaScript-Nachrichten. Alle Nachrichten haben einen Aktionsparameter, mit dem Sie das Verhalten der Seite beeinflussen können.

Wie Sie sehen können, wartet die Seite auf eine Nachricht mit einer init-Aktion, die Magnolia sendet, wenn es den iframe vollständig geladen hat. Mit init action erhalten wir die correlationId, die verhindert, dass Nachrichten zwischen den verschiedenen javascriptField-Feldern verwechselt werden.

Wir erhalten auch den aktuellen Wert des Feldes innerhalb des Zustandsobjekts sowie dessen defaultValue, falls in der Dialogdefinition angegeben.

Die Seite beobachtet auch die Änderungen im Eingabefeld und sendet eine Nachricht mit drei Parametern an das übergeordnete Magnolia-Fenster:

  • changeValue als Aktion

  • correlationId aus init action

  • value als neuer Wert aus input

Nachdem Sie den Dialog in einer Seiten- oder Komponentendefinition referenziert haben, sollten Sie beim Bearbeiten von Inhalten das neue colorField sehen.

colorField

Low-code development

Simplify and speed up development with Magnolia using file-based configuration.

Weitere Merkmale

Validierung von Feldern

javascriptField kann reguläre Magnolia-Validatoren verwenden, um Feldwerte zu prüfen. Wenn ein ungültiger Wert in das Feld eingegeben wurde, würde die Seite eine errorMessage als Aktion erhalten.

Java
  emailField: Bezeichnung: E-Mail-Feld $type: javascriptField fieldScript: /ui-framework-javascript-examples/webresources/emailField.html height: 40 validators: email: $type: emailValidator errorMessage: Bitte geben Sie eine gültige E-Mail Adresse ein  

Parameter Objekt

Sie können auch verschiedene Parameter an Ihren iframe übergeben, z. B. eine Hintergrundfarbe.

Java
  withParameters: Bezeichnung: Mit Parametern $type: javascriptField fieldScript: /ui-framework-javascript-examples/webresources/withParameters.html height: 40 parameters: background: blue  

Erinnern Sie sich an die Nachricht init action, die wir im Beispiel des Farbwählers gehört haben? Die an den iframe withParameters.html übergebenen Daten werden um das Parameterobjekt erweitert.

Java
  { action: 'init'; correlationId: '550'; formFields: []; height: '40.0px'; parameters: { background: 'blue'; } }  

Dies ermöglicht uns den Zugriff auf Parameter:

Java
  event.data.state.parameters.background  

Bedingte Formulare

Änderungen an einem der Dialogfelder lösen eine Änderungsaktion aus, die das formFields-Objekt aktualisiert.

Java
  event.data.state.formFields  

Das formFields-Objekt enthält die aktuellen Werte aller Dialogfelder. Durch die kontinuierliche Aktualisierung von javascriptField mit allen aktuellen Werten, können Sie bedingte Formulare erstellen.

Diese Funktionalität könnte zum Beispiel für Produkt- und Farbauswahlen verwendet werden. Die User können für Produkt A eine andere Farbauswahl treffen als für Produkt B.

Verfügbarkeit

Das Modul JavaScript Dialog Fields ist auf dem Magnolia Marketplace erhältlich. Eine Reihe von Beispielen für alle Aktionstypen finden Sie im Light-Modul ui-framework-javascript-examples.

Probieren Sie nun den neuen Feldtyp in Ihrem Projekt aus.

Über den autor

Bartosz Staryga

Front-End Solution Architect, Magnolia

Bartosz is an expert in headless content management and front-end development at Magnolia. He designs and develops new Magnolia features and supports customers with their headless implementations from content types to APIs to integrations. Bartosz enjoys building new things and seeing them in action. He is also a trainer for Magnolia’s Headless training.