Dlaczego widżety pól nie tworzą elementów?


11

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 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 .


W Drupal 8 widżety są teraz implementowane z klasami; widget podstawowy to zasadniczo klasa, z której wywodzi się klasa widgetów.
kiamlaluno

Podobne pytania brzmiałyby: „Dlaczego taksówka nie jest samochodem?” lub „Dlaczego ulica nie jest kawałkiem asfaltu?” lub „Dlaczego książka nie jest powieścią?”. Książka może być powieścią, ale ta sama powieść może również istnieć na nośnikach cyfrowych. Lub może żyć w większej książce razem z innymi powieściami. Książka, nawet jeśli zawiera dokładnie jedną powieść, ma pewne właściwości fizyczne, które są niezależne od jej treści.
donquixote

Odpowiedzi:


11

Wydaje mi się logiczne, że widżet pola może być elementem formularza, który zdarza się również mapować bezpośrednio do jakiegoś bazowego magazynu

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:

Widżety to elementy interfejsu API Form z dodatkowymi możliwościami przetwarzania. Haki widżetów są zwykle wywoływane przez interfejs API dołączania pola podczas tworzenia struktury formularza pola za pomocą field_attach_form () .

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ących WidgetInterface. Wspólnym interfejsem między tymi interfejsami jest PluginInspectionInterface, która nie definiuje żadnej metody renderowania elementu formularza, który jest zamiast tego zdefiniowany z RenderElementklasy 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.


Bardzo interesujące, nie wiedziałem tego. +1. Zaktualizowałem jednak moje pytanie, ponieważ
sprawiłem

Żądanie funkcji zostało otwarte . :)
Letharion
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.