9.10.1. Drupal Fields API. Field Widget: polja za unos podataka, forma za polje.
U ovom tutorijalu ćemo pogledati kako funkcioniše Field Widget modula Link. Ovo je pregledni članak, pa ako želite početi da pišete svoj File Widget, preskočite na sledeće članke.
U poslednjoj lekciji smo dodali Link polja za nodove i blokove. Sada ćemo pogledati kako se formira forma za Link polje.
Već smo se upoznali sa automatskim učitavanjem PHP klasa u Drupalu, a postoji i klasa WidgetBase za field widget polja:
core/lib/Drupal/Core/Field/WidgetBase.php
Kreiranjem nove podklase u modulu i smeštanjem u src/Plugin/Field/FieldWidget, klasa će se automatski učitati i može se koristiti za polje. Pogledajmo widget klasu za Link polje:
core/modules/link/src/Plugin/Field/FieldWidget/LinkWidget.php
U anotaciji klase je naveden tip polja za koji se ovaj widget može koristiti:
/**
* Plugin implementation of the 'link' widget.
*
* @FieldWidget(
* id = "link_default",
* label = @Translation("Link"),
* field_types = {
* "link"
* }
* )
*/
Na ovaj način možete dodavati nove field widgete u prilagođene module za postojeća polja.
Sada prelazimo na metodu formElement(), koja je verovatno jedna od glavnih metoda widgeta, gde se form elementi dodaju preko Form API-ja. U Link widgetu postoje tri elementa:
$element['title']
$element['uri']
$element['attributes']
Ova polja se koriste za unos podataka u formi nodova ili blokova. Takođe, poljima je dodata validacija jer, na primer, polje URI mora sadržati ispravnu URL adresu ili lokalnu adresu sajta.
Još jedna važna metoda je settingsForm(), koja je zadužena za formu podešavanja koju možete videti na stranici Manage form:
Sve ostale metode u Field Widget-u su opcione. Nećemo ulaziti u detalje za svaku od njih jer nisu obavezne za pisanje prilagođenih modula. Ako budete pisali module za doprinose, mislim da vam neće biti teško da pročitate opis metoda roditeljske klase:
core/lib/Drupal/Core/Field/WidgetBase.php
Svi Field Widgeti za polja se podešavaju na kartici Manage form display za svaki bundle entitet zasebno: