Perché i widget di campo non formano elementi?


11

Gli elementi del modulo sono spesso separati dai widget di campo, tuttavia implementano funzionalità molto simili.

A volte, la loro funzionalità si insinua anche tra le due API, come in questa domanda: è possibile visualizzare un modulo di widget di campo funzionante da solo?

Mi sembra logico che un widget di campo possa essere un elemento del modulo, il che accade anche per mappare direttamente su un archivio sottostante, specialmente perché l'API del modulo era già in atto quando si è verificato l'api del campo.

Mi chiedo perché non sia così.

Modifica: come sottolineato da Kiamlaluno di seguito, secondo i documenti ufficiali, i widget sono elementi API Form, il che significa che devo modificare un po 'la mia domanda.

Mi sono interrogato su questo, perché volevo usare il widget di tagging Core come elemento del modulo. Tuttavia, per quanto ne so, non esiste un modo semplice per farlo. Nonostante i documenti che sostengono che i widget siano elementi, ciò non sembra necessariamente essere vero.

Se un widget è stato dichiarato come

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

quindi la definizione dell'elemento sarebbe separata dal widget, in modo che possa essere utilizzata in entrambi i modi, ma attualmente non è così.

Modifica 2: richiesta funzionalità aperta .


In Drupal 8, i widget sono ora implementati con le classi; il widget di base è essenzialmente la classe da cui deriva una classe di widget.
kiamlaluno

Domande simili sarebbero "Perché un taxi non è un'auto?" o "Perché una strada non è un pezzo di asfalto?" o "Perché un libro non è un romanzo?". Un libro può essere un romanzo, ma lo stesso romanzo può esistere anche sull'archiviazione digitale. Oppure potrebbe vivere in un libro più grande insieme ad altri romanzi. Un libro, anche se contiene esattamente un romanzo, ha alcune proprietà fisiche che sono indipendenti dal suo contenuto.
donquixote,

Risposte:


11

Mi sembra logico che un widget di campo possa essere un elemento del modulo, che capita anche di mappare direttamente su un archivio sottostante

I widget sono elementi del modulo; hanno solo funzionalità aggiuntive che un elemento del modulo non ha. La documentazione sull'API del widget di campo descrive i widget usando le seguenti parole:

I widget sono elementi API del modulo con funzionalità di elaborazione aggiuntive. I hook dei widget vengono in genere chiamati dall'API Field Attach durante la creazione della struttura del modulo di campo con field_attach_form () .

Ogni widget viene implementato utilizzando almeno un elemento del modulo, ma un modulo che implementa un widget deve implementare alcuni hook non richiesti da un elemento del modulo:

Mentre il primo può essere considerato l'equivalente di hook_element_info () , gli altri due sono hook aggiuntivi necessari per il funzionamento dei widget. È grazie alle informazioni trasmesse a hook_field_widget_form()che viene reso un widget.

Drupal avrebbe potuto implementare widget espandendo le proprietà restituite hook_element_info(), ma la verità è che un widget e un elemento form sono due cose diverse che vengono utilizzate in casi diversi; considera un widget un tipo più specializzato di elemento modulo.
Se hook_element_info()venissero utilizzati anche per restituire informazioni sui widget, il codice alla ricerca di widget dovrebbe filtrare gli elementi del modulo per conservare le informazioni sul widget; viceversa, il codice che cerca gli elementi del modulo dovrebbe filtrare le informazioni del widget. Considerando quanto spesso sono necessarie queste informazioni, questo è il motivo per cui sono necessari due diversi hook.

Drupal avrebbe potuto usare una proprietà "element element" restituita da hook_field_widget_info(). Se tale proprietà non è stata implementata, significa che nessuno l'ha proposta o è stata proposta, ma è stata comunque utile in pochi casi limitati.

Per quanto riguarda Drupal 8, le cose sono leggermente cambiate e gli elementi del modulo sono oggetti dell'implementazione delle classi FormElementInterface, mentre i widget di campo sono oggetti dell'implementazione delle classi WidgetInterface. L'interfaccia comune tra queste interfacce è PluginInspectionInterface, che non definisce alcun metodo per il rendering di un elemento del modulo, che sono invece definiti da RenderElementuna classe astratta.
Poiché ora i widget sono implementati con le classi, il widget di base è essenzialmente la classe di base da cui deriva una classe di widget; non è necessaria una proprietà per definire il widget di base di un widget.


Molto interessante, non lo sapevo. +1. Ho comunque aggiornato la mia domanda, poiché mi hai reso più confuso;)
Letharion,

Richiesta di funzione aperta . :)
Letharion,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.