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 .
Respuestas:
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:
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 clasesWidgetInterface
. La interfaz que es común entre esas interfaces esPluginInspectionInterface
, que no define ningún método para representar un elemento de formulario, que en su lugar se define a partir deRenderElement
una 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.
fuente