Por que os widgets de campo não formam elementos?

11

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 .

Letharion
fonte
No Drupal 8, os widgets agora são implementados com classes; o widget base é essencialmente a classe da qual uma classe de widget é derivada.
kiamlaluno
Perguntas semelhantes seriam "Por que um táxi não é um carro?" ou "Por que uma rua não é um pedaço de asfalto?" ou "Por que um livro não é um romance?". Um livro pode ser um romance, mas o mesmo romance também pode existir no armazenamento digital. Ou poderia viver em um livro maior junto com outros romances. Um livro, mesmo que contenha exatamente um romance, possui algumas propriedades físicas independentes de seu conteúdo.
donquixote

Respostas:

11

Parece-me lógico que um widget de campo possa ser um elemento do formulário, que também é mapeado diretamente para algum armazenamento subjacente

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:

Widgets são elementos da API do formulário com recursos de processamento adicionais. Ganchos de widget são normalmente chamados pela API Field Attach durante a criação da estrutura do formulário de campo com field_attach_form () .

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 implementadas WidgetInterface. 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 de RenderElement, 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.

kiamlaluno
fonte
Muito interessante, eu não sabia disso. +1. Tenho no entanto atualizadas minha pergunta, como você me deixou mais confuso;)
Letharion
Solicitação de recurso aberta . :)
Letharion