Os elementos do formulário geralmente são separados dos widgets de campo, mas eles implementam funcionalidades muito semelhantes.
Às vezes, suas funcionalidades também se espalham pelas duas APIs, como nesta pergunta: É possível exibir um formulário de widget de campo por conta própria possível?
Parece-me lógico que um widget de campo possa ser um elemento de formulário, que também é mapeado diretamente para algum armazenamento subjacente, especialmente porque a API de formulário já estava em vigor quando a API de campo surgiu.
Estou me perguntando por que não é esse o caso.
Editar: como apontado por kiamlaluno abaixo, de acordo com os documentos oficiais, os widgets são elementos da API de formulário, o que significa que preciso editar um pouco a minha pergunta.
Eu comecei a pensar sobre isso, porque queria usar o widget de marcação Core como um elemento do formulário. Que eu saiba, no entanto, não há uma maneira fácil de fazer isso. Apesar dos documentos que afirmam que os widgets são elementos, isso não parece necessariamente ser verdade.
Se um widget foi declarado como
function hook_widget_info() {
return array('my_widget' => array(
'base element' => 'some_form_element_machine_name',
))
}
a definição do elemento seria separada do widget, para que pudesse ser usada nos dois sentidos, mas atualmente esse não é o caso.
Editar 2: solicitação de recurso aberta .
Respostas:
Widgets são elementos de formulário; eles apenas têm recursos adicionais que um elemento do formulário não possui. A documentação sobre a API do widget de campo descreve os widgets usando as seguintes palavras:
Todo widget é implementado usando pelo menos um elemento de formulário, mas um módulo implementando um widget precisa implementar alguns ganchos que não são necessários a partir de um elemento de formulário:
Enquanto o primeiro pode ser considerado o equivalente a hook_element_info () , os outros dois são ganchos adicionais necessários para o funcionamento dos widgets. É graças às informações passadas
hook_field_widget_form()
que um widget é renderizado.Drupal poderia ter implementado widgets expandindo as propriedades retornadas
hook_element_info()
, mas a verdade é que um widget e um elemento de formulário são duas coisas diferentes usadas em casos diferentes; considere um widget um tipo mais especializado de elemento de formulário.Se
hook_element_info()
também fosse usado para retornar informações sobre widgets, o código que procurava widgets precisaria filtrar os elementos do formulário para manter as informações do widget; vice-versa, o código que procura elementos do formulário deve filtrar as informações do widget. Considerando com que freqüência essas informações são necessárias, essa é a razão pela qual são necessários dois ganchos diferentes.Drupal poderia ter usado uma propriedade "elemento base" retornada
hook_field_widget_info()
. Se essa propriedade não foi implementada, significa que ninguém a propôs, ou foi proposta, mas ainda assim foi útil em poucos casos limitados.Quanto ao Drupal 8, as coisas mudaram um pouco e os elementos do formulário são objetos das classes implementadas
FormElementInterface
, enquanto os widgets de campo são objetos das classes implementadasWidgetInterface
. A interface comum entre essas interfaces éPluginInspectionInterface
, que não define nenhum método para renderizar um elemento de formulário, que é definido a partir deRenderElement
, uma classe abstrata.Como agora os widgets são implementados com classes, o widget base é essencialmente a classe base da qual uma classe de widget é derivada; não há necessidade de uma propriedade para definir o widget base de um widget.
fonte