it-swarm.com.de

Warum bilden Feld-Widgets keine Elemente?

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 sein ein Formularelement sein könnte, das auch zufällig direkt einem zugrunde liegenden Speicher zugeordnet wird, zumal die Formular-API bereits vorhanden war an Ort und Stelle, als Field API zustande kam.

Ich frage mich, warum das nicht der Fall ist.

Bearbeiten: Wie von kiamlaluno unten ausgeführt, bilden Widgets are Form API-Elemente, was bedeutet Ich muss meine Frage ein wenig bearbeiten.

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. Trotz der docs behaupten Widgets sind Elemente, die nicht unbedingt wahr zu sein scheinen.

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 .

11
Letharion

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. Die Dokumentation zur Feld-Widget-API Beschreiben Sie die Widgets mit den folgenden Worten:

Widgets sind Form 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, aber ein Modul, das Widgets implementiert, muss 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 beiden anderen zusätzliche Hooks, die für die Arbeit der Widgets erforderlich sind. Dank der an hook_field_widget_form() übergebenen Informationen wird ein Widget gerendert.

Drupal hätte Widgets implementieren können, die die von hook_element_info() zurückgegebenen Eigenschaften erweitern, 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 zum Zurückgeben von Informationen über Widgets verwendet würde, 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. Wenn man bedenkt, wie oft diese Informationen benötigt werden, ist dies der Grund, warum zwei verschiedene Hooks notwendig sind.

Drupal hätte eine "Basiselement" -Eigenschaft verwenden können, die von hook_field_widget_info() zurückgegeben wurde. 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.

Was Drupal 8) betrifft, haben sich die Dinge ein wenig geändert, und Formularelemente sind Objekte von Klassen, die FormElementInterface implementieren, während Feld-Widgets Objekte von Klassen sind, die implementieren - WidgetInterface . Die Schnittstelle, die diesen Schnittstellen gemeinsam ist, ist PluginInspectionInterface , die keine Methode zum Rendern eines Formularelements definiert werden stattdessen aus RenderElement , einer abstrakten Klasse, definiert.
Da Widgets jetzt mit Klassen implementiert sind, 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.

11
kiamlaluno