Formularelemente sind häufig von Feld-Widgets getrennt, implementieren jedoch sehr ähnliche Funktionen.
Manchmal kriecht ihre Funktionalität auch über die beiden Apis, wie in dieser Frage: Ist es möglich, ein funktionierendes Feld-Widget-Formular selbst anzuzeigen?
Es scheint mir logisch , dass ein Feld - Widget könnte sein ein Formularelement, das auch direkt zu einem gewissen zugrunde liegenden Speicher abzubilden geschieht, zumal Form api bereits an Ort und Stelle war , als Feld api zustande kam.
Ich frage mich, warum das nicht der Fall ist.
Bearbeiten: Wie von kiamlaluno unten ausgeführt, sind Widgets laut offiziellen Dokumenten Form-API-Elemente, was bedeutet, dass ich meine Frage ein wenig bearbeiten muss.
Ich habe mich darüber gewundert, weil ich das Core-Tagging-Widget als Formularelement verwenden wollte. Nach meinem besten Wissen gibt es jedoch keinen einfachen Weg, dies zu tun. Obwohl die Dokumente behaupten, Widgets seien Elemente, scheint dies nicht unbedingt der Fall zu sein.
Wenn ein Widget als deklariert wurde
function hook_widget_info() {
return array('my_widget' => array(
'base element' => 'some_form_element_machine_name',
))
}
dann wäre die Elementdefinition vom Widget getrennt, so dass sie auf beide Arten verwendet werden könnte, aber derzeit ist dies nicht der Fall.
Bearbeiten 2: Funktionsanforderung geöffnet .
Antworten:
Widgets sind Formularelemente. Sie haben nur zusätzliche Funktionen, die ein Formularelement nicht hat. In der Dokumentation zur Feld-Widget-API werden die Widgets mit den folgenden Worten beschrieben:
Jedes Widget wird mit mindestens einem Formularelement implementiert. Ein Modul, das Widgets implementiert, muss jedoch einige Hooks implementieren, die für ein Formularelement nicht erforderlich sind:
Während der erste als das Äquivalent von hook_element_info () angesehen werden kann , sind die anderen beiden zusätzliche Hooks, die für die Arbeit der Widgets erforderlich sind. Dank der übergebenen Informationen wird
hook_field_widget_form()
ein Widget gerendert.Drupal hätte Widgets implementieren können, die die zurückgegebenen Eigenschaften erweitern
hook_element_info()
, aber die Wahrheit ist, dass ein Widget und ein Formularelement zwei verschiedene Dinge sind, die in verschiedenen Fällen verwendet werden. Betrachten Sie ein Widget als einen spezielleren Typ eines Formularelements.Wenn
hook_element_info()
auch Informationen zu Widgets zurückgegeben würden, müsste der Code, der nach Widgets sucht, die Formularelemente herausfiltern, um die Widget-Informationen beizubehalten. Umgekehrt sollte der Code, der nach Formularelementen sucht, die Widget-Informationen herausfiltern. In Anbetracht dessen, wie oft diese Informationen benötigt werden, sind zwei verschiedene Hooks erforderlich.Drupal hätte eine "Basiselement" -Eigenschaft verwenden können, die von zurückgegeben wurde
hook_field_widget_info()
. Wenn eine solche Eigenschaft nicht implementiert wurde, bedeutet dies, dass niemand sie vorgeschlagen hat oder vorgeschlagen wurde, aber sie hat sich in einigen wenigen Fällen als nützlich erwiesen.Bei Drupal 8 haben sich die Dinge ein wenig geändert, und Formularelemente sind Objekte der implementierenden Klassen
FormElementInterface
, während Feld-Widgets Objekte der implementierenden Klassen sindWidgetInterface
. Die Schnittstelle, die diesen Schnittstellen gemeinsam istPluginInspectionInterface
, definiert keine Methode zum Rendern eines Formularelements, das stattdessen ausRenderElement
einer abstrakten Klasse definiert wird.Da Widgets jetzt mit Klassen implementiert werden, ist das Basis-Widget im Wesentlichen die Basisklasse, von der eine Widget-Klasse abgeleitet wird. Es ist keine Eigenschaft erforderlich, um das Basis-Widget eines Widgets zu definieren.
quelle