Warum bilden Feld-Widgets keine Elemente?

11

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 .

Letharion
quelle
In Drupal 8 werden Widgets jetzt mit Klassen implementiert. Das Basis-Widget ist im Wesentlichen die Klasse, von der eine Widget-Klasse abgeleitet ist.
Kiamlaluno
Ähnliche Fragen wären "Warum ist ein Taxi kein Auto?" oder "Warum ist eine Straße kein Stück Asphalt?" oder "Warum ist ein Buch kein Roman?". Ein Buch kann ein Roman sein, aber der gleiche Roman kann auch im digitalen Speicher existieren. Oder es könnte zusammen mit anderen Romanen in einem größeren Buch leben. Ein Buch, auch wenn es genau einen Roman enthält, hat einige physikalische Eigenschaften, die von seinem Inhalt unabhängig sind.
Donquijote

Antworten:

11

Es scheint mir logisch, dass ein Feld-Widget ein Formularelement sein kann, das auch direkt einem zugrunde liegenden Speicher zugeordnet wird

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:

Widgets sind Formular-API- Elemente mit zusätzlichen Verarbeitungsfunktionen. Widget-Hooks werden normalerweise von der Field Attach-API beim Erstellen der Feldformularstruktur mit field_attach_form () aufgerufen .

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 sind WidgetInterface. Die Schnittstelle, die diesen Schnittstellen gemeinsam ist PluginInspectionInterface, definiert keine Methode zum Rendern eines Formularelements, das stattdessen aus RenderElementeiner 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.

kiamlaluno
quelle
Sehr interessant, das wusste ich nicht. +1. Ich habe jedoch meine Frage aktualisiert, da Sie mich verwirrter gemacht haben;)
Letharion
Funktionsanforderung geöffnet . :)
Letharion