¿Por qué los widgets de campo no forman elementos?

11

Los elementos de formulario a menudo están separados de los widgets de campo, pero implementan una funcionalidad muy similar.

A veces, su funcionalidad también se arrastra a través de las dos API, como en esta pregunta: ¿Es posible mostrar un Formulario de widget de campo en funcionamiento por sí solo?

Me parece lógico que un widget de campo pueda ser un elemento de formulario, que también se asigna directamente a algún almacenamiento subyacente, especialmente porque la API de formulario ya estaba en su lugar cuando surgió la API de campo.

Me pregunto por qué este no es el caso.

Editar: como señala kiamlaluno a continuación, de acuerdo con los documentos oficiales, los widgets son elementos de API de formulario, lo que significa que necesito editar un poco mi pregunta.

Llegué a preguntarme sobre esto, porque quería usar el widget de etiquetado Core como elemento de formulario. Sin embargo, que yo sepa, no hay una manera fácil de hacerlo. A pesar de que los documentos afirman que los widgets son elementos, eso no parece ser necesariamente cierto.

Si un widget fue declarado como

function hook_widget_info() {
  return array('my_widget' => array(
    'base element' => 'some_form_element_machine_name',
  ))
}

entonces la definición del elemento estaría separada del widget, de modo que podría usarse en ambos sentidos, pero actualmente este no es el caso.

Edición 2: solicitud de función abierta .

Letharion
fuente
En Drupal 8, los widgets ahora se implementan con clases; el widget base es esencialmente la clase de la cual se deriva una clase de widget.
kiamlaluno
Preguntas similares serían "¿Por qué un taxi no es un automóvil?" o "¿Por qué una calle no es un trozo de asfalto?" o "¿Por qué un libro no es una novela?". Un libro puede ser una novela, pero la misma novela también puede existir en el almacenamiento digital. O podría vivir en un libro más grande junto con otras novelas. Un libro, incluso si contiene exactamente una novela, tiene algunas propiedades físicas que son independientes de su contenido.
donquixote

Respuestas:

11

Me parece lógico que un widget de campo podría ser un elemento de formulario, que también se asigna directamente a algún almacenamiento subyacente

Los widgets son elementos de forma; solo tienen capacidades adicionales que un elemento de formulario no tiene. La documentación sobre la API de widget de campo describe los widgets con las siguientes palabras:

Los widgets son elementos de API de formulario con capacidades de procesamiento adicionales. Los enlaces de widgets normalmente son llamados por la API Field Attach durante la creación de la estructura de formulario de campo con field_attach_form () .

Cada widget se implementa utilizando al menos un elemento de formulario, pero un módulo que implemente un widget necesita implementar algunos ganchos que no se requieren de un elemento de formulario:

Mientras que el primero puede considerarse el equivalente de hook_element_info () , los otros dos son ganchos adicionales necesarios para que los widgets funcionen. Gracias a la información transmitida, hook_field_widget_form()se representa un widget.

Drupal podría haber implementado widgets expandiendo las propiedades devueltas hook_element_info(), pero la verdad es que un widget y un elemento de formulario son dos cosas diferentes que se usan en diferentes casos; considere un widget como un tipo de elemento de formulario más especializado.
Si hook_element_info()se usara también para devolver información sobre widgets, el código que busca widgets necesitaría filtrar los elementos del formulario para mantener la información del widget; viceversa, el código que busca elementos de formulario debe filtrar la información del widget. Teniendo en cuenta con qué frecuencia se requiere esa información, esa es la razón por la que se necesitan dos ganchos diferentes.

Drupal podría haber usado una propiedad de "elemento base" devuelta desde hook_field_widget_info(). Si dicha propiedad no se ha implementado, significa que nadie la propuso, o se propuso, pero se consideró útil en algunos casos limitados.

En cuanto a Drupal 8, las cosas cambiaron un poco y los elementos de formulario son objetos de implementación de clases FormElementInterface, mientras que los widgets de campo son objetos de implementación de clases WidgetInterface. La interfaz que es común entre esas interfaces es PluginInspectionInterface, que no define ningún método para representar un elemento de formulario, que en su lugar se define a partir de RenderElementuna clase abstracta.
Como ahora los widgets se implementan con clases, el widget base es esencialmente la clase base de la cual se deriva una clase de widget; no es necesaria una propiedad para definir el widget base de un widget.

kiamlaluno
fuente
Muy interesante, no sabía esto. +1. Sin embargo, he actualizado mi pregunta, ya que me confundiste más;)
Letharion
Solicitud de función abierta . :)
Letharion