9.10.1. Drupal Fields API. Field Widget: Dateneingabefelder, Formular für das Feld.
In diesem Tutorial betrachten wir, wie das Field Widget des Link-Moduls funktioniert. Dies ist ein Überblicksartikel; wenn Sie Ihr eigenes File Widget schreiben möchten, springen Sie bitte zu den folgenden Artikeln.
Im letzten Kapitel haben wir Link-Felder für Nodes und Blöcke hinzugefügt. Nun sehen wir uns an, wie das Formular für das Link-Feld aufgebaut ist.
Wir haben bereits das Autoloading von PHP-Klassen in Drupal kennengelernt, und es gibt auch eine WidgetBase-Klasse für Field Widgets:
core/lib/Drupal/Core/Field/WidgetBase.php
Wenn man eine neue Kindklasse im Modul erstellt und sie im Verzeichnis src/Plugin/Field/FieldWidget ablegt, wird die Klasse automatisch geladen und kann für das Feld verwendet werden. Schauen wir uns die Widget-Klasse für das Link-Feld an:
core/modules/link/src/Plugin/Field/FieldWidget/LinkWidget.php
Die Annotation der Klasse enthält den Feldtyp, für den dieses Widget verwendet werden kann:
/**
* Plugin-Implementierung des 'link' Widgets.
*
* @FieldWidget(
* id = "link_default",
* label = @Translation("Link"),
* field_types = {
* "link"
* }
* )
*/
Auf diese Weise können Sie neuen Field Widgets für bestehende Felder in einem benutzerdefinierten Modul hinzufügen.
Kommen wir nun zur Methode formElement()
, wahrscheinlich eine der wichtigsten Methoden des Widgets, in der Formularelemente über die Form API hinzugefügt werden. Im Link-Widget gibt es drei Elemente:
- $element['title']
- $element['uri']
- $element['attributes']
Diese Felder werden später im Formular für Nodes oder Blöcke zur Dateneingabe verwendet. Für die Felder wird auch eine Validierung hinzugefügt, weil beispielsweise das URI-Feld eine korrekte URL oder eine lokale Seitenadresse enthalten muss.
Eine weitere wichtige Methode ist settingsForm()
, die für das Anpassungsformular zuständig ist, das Sie auf der Seite „Anzeige verwalten“ sehen:
Alle anderen Methoden im Field Widget sind optional. Wir gehen nicht im Detail auf jede Methode ein, da sie nicht zwingend benötigt werden, um benutzerdefinierte Module zu schreiben. Wenn Sie Contributor-Module schreiben, wird es Ihnen sicher nicht schwerfallen, die Beschreibung der Methoden der Elternklasse zu lesen:
core/lib/Drupal/Core/Field/WidgetBase.php
Alle Field Widgets für Felder werden separat für jedes Bundle auf dem Tab „Formularanzeige verwalten“ konfiguriert: