Elementy formularza są często oddzielone od widżetów pól, ale implementują bardzo podobną funkcjonalność.
Czasami ich funkcjonalność wkrada się również między dwa api, na przykład w tym pytaniu: Czy możliwe jest wyświetlenie działającego formularza Field Widget?
Wydaje mi się logiczne, że widget pola może być elementem formularza, który zdarza się również mapować bezpośrednio do jakiegoś bazowego magazynu, zwłaszcza, że interfejs API formy był już na miejscu, gdy pojawił się interfejs API pola.
Zastanawiam się, dlaczego tak nie jest.
Edycja: Jak wskazał kiamlaluno poniżej, zgodnie z oficjalnymi dokumentami, widżety są elementami Form API, co oznacza, że muszę trochę edytować moje pytanie.
Zastanawiałem się nad tym, ponieważ chciałem użyć widżetu tagowania rdzenia jako elementu formularza. Według mojej najlepszej wiedzy nie ma na to łatwego sposobu. Mimo że dokumenty twierdzą, że widżety są elementami, niekoniecznie musi to być prawda.
Jeśli widżet został zadeklarowany jako
function hook_widget_info() {
return array('my_widget' => array(
'base element' => 'some_form_element_machine_name',
))
}
wtedy definicja elementu byłaby oddzielna od widżetu, dzięki czemu mogłaby być używana na dwa sposoby, ale obecnie tak nie jest.
Edycja 2: Otwarto żądanie funkcji .
Odpowiedzi:
Widżety są elementami formularza; mają tylko dodatkowe możliwości, których nie ma element formularza. Dokumentacja interfejsu API widżetów polowych opisuje widżety za pomocą następujących słów:
Każdy widżet jest implementowany przy użyciu co najmniej jednego elementu formularza, ale moduł implementujący widżety musi implementować niektóre zaczepy, które nie są wymagane od elementu formularza:
Podczas gdy pierwszy można uznać za odpowiednik hook_element_info () , pozostałe dwa są dodatkowymi zaczepami niezbędnymi do działania widgetów. To dzięki informacjom przekazanym do
hook_field_widget_form()
renderowania widżetu.Drupal mógł zaimplementować widżety rozszerzające zwrócone właściwości
hook_element_info()
, ale prawda jest taka, że widget i element formularza to dwie różne rzeczy używane w różnych przypadkach; uważają widget za bardziej wyspecjalizowany typ elementu formularza.Jeśli
hook_element_info()
zostaną użyte również do zwrócenia informacji o widgetach, kod szukający widgetów musiałby odfiltrować elementy formularza, aby zachować informacje o widgetach; i odwrotnie, kod szukający elementów formularza powinien odfiltrować informacje o widżecie. Biorąc pod uwagę, jak często te informacje są wymagane, jest to powód, dla którego potrzebne są dwa różne haczyki.Drupal mógł użyć właściwości „element podstawowy” zwróconej z
hook_field_widget_info()
. Jeśli taka właściwość nie została zaimplementowana, oznacza to, że nikt jej nie zaproponował lub został zaproponowany, ale okazało się, że był użyteczny w kilku ograniczonych przypadkach.Jeśli chodzi o Drupala 8, nieco się zmieniło, a elementy formularza są obiektami klas implementujących
FormElementInterface
, a widżety pól obiektami klas implementującychWidgetInterface
. Wspólnym interfejsem między tymi interfejsami jestPluginInspectionInterface
, która nie definiuje żadnej metody renderowania elementu formularza, który jest zamiast tego zdefiniowany zRenderElement
klasy abstrakcyjnej.Ponieważ teraz widżety są implementowane z klasami, widget podstawowy jest zasadniczo klasą podstawową, z której wywodzi się klasa widgetów; nie ma potrzeby posiadania właściwości do zdefiniowania podstawowego widgetu widgetu.
źródło