Pourquoi les widgets de champ ne sont-ils pas des éléments de formulaire?


11

Les éléments de formulaire sont souvent séparés des widgets de champ, mais ils implémentent des fonctionnalités très similaires.

Parfois, leur fonctionnalité se glisse également entre les deux API, comme dans cette question: Est-il possible d'afficher un formulaire de widget de champ de manière autonome?

Il me semble logique qu'un widget de champ puisse être un élément de formulaire, qui arrive également à être mappé directement sur un stockage sous-jacent, d'autant plus que l'API de formulaire était déjà en place lorsque l'API de champ est apparue.

Je me demande pourquoi ce n'est pas le cas.

Modifier: Comme indiqué par kiamlaluno ci-dessous, selon les documents officiels, les widgets sont des éléments de l'API Form, ce qui signifie que je dois modifier un peu ma question.

Je me suis posé des questions à ce sujet, car je voulais utiliser le widget de balisage Core comme élément de formulaire. À ma connaissance cependant, il n'y a pas de moyen facile de le faire. Malgré les documents qui prétendent que les widgets sont des éléments, cela ne semble pas nécessairement vrai.

Si un widget a été déclaré comme

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

alors la définition d'élément serait distincte du widget, de sorte qu'elle pourrait être utilisée dans les deux sens, mais actuellement ce n'est pas le cas.

Edit 2: demande de fonctionnalité ouverte .


Dans Drupal 8, les widgets sont désormais implémentés avec des classes; le widget de base est essentiellement la classe à partir de laquelle une classe de widget est dérivée.
kiamlaluno

Des questions similaires seraient "Pourquoi un taxi n'est-il pas une voiture?" ou "Pourquoi une rue n'est-elle pas un morceau d'asphalte?" ou "Pourquoi un livre n'est-il pas un roman?". Un livre peut être un roman, mais le même roman peut également exister sur le stockage numérique. Ou il pourrait vivre dans un livre plus grand avec d'autres romans. Un livre, même s'il contient exactement un roman, possède des propriétés physiques indépendantes de son contenu.
donquixote

Réponses:


11

Il me semble logique qu'un widget de champ puisse être un élément de formulaire, qui arrive également à être mappé directement sur un stockage sous-jacent

Les widgets sont des éléments de formulaire; ils ont juste des capacités supplémentaires qu'un élément de formulaire n'a pas. La documentation sur l'API de widget de champ décrit les widgets en utilisant les mots suivants:

Les widgets sont des éléments d' API Form avec des capacités de traitement supplémentaires. Les hooks de widgets sont généralement appelés par l'API Field Attach lors de la création de la structure de formulaire de champ avec field_attach_form () .

Chaque widget est implémenté en utilisant au moins un élément de formulaire, mais un module implémentant un widget doit implémenter certains hooks qui ne sont pas requis à partir d'un élément de formulaire:

Alors que le premier peut être considéré comme l'équivalent de hook_element_info () , les deux autres sont des crochets supplémentaires nécessaires au fonctionnement des widgets. C'est grâce aux informations transmises hook_field_widget_form()qu'un widget est rendu.

Drupal aurait pu implémenter des widgets développant les propriétés renvoyées hook_element_info(), mais la vérité est qu'un widget et un élément de formulaire sont deux choses différentes qui sont utilisées dans des cas différents; considérez un widget comme un type d'élément de formulaire plus spécialisé.
S'il hook_element_info()était également utilisé pour renvoyer des informations sur les widgets, le code recherchant les widgets devrait filtrer les éléments du formulaire pour conserver les informations sur les widgets; vice versa, le code recherchant des éléments de formulaire doit filtrer les informations du widget. Compte tenu de la fréquence à laquelle ces informations sont nécessaires, c'est la raison pour laquelle deux crochets différents sont nécessaires.

Drupal aurait pu utiliser une propriété "élément de base" renvoyée par hook_field_widget_info(). Si une telle propriété n'a pas été mise en œuvre, cela signifie que personne ne l'a proposée, ou elle a été proposée, mais elle s'est avérée utile dans quelques cas limités.

Comme pour Drupal 8, les choses ont un peu changé et les éléments de formulaire sont des objets de classes implémentées FormElementInterface, tandis que les widgets de champs sont des objets de classes implémentées WidgetInterface. L'interface commune à ces interfaces est PluginInspectionInterface, qui ne définit aucune méthode de rendu d'un élément de formulaire, qui sont plutôt définis à partir d' RenderElementune classe abstraite.
Puisque maintenant les widgets sont implémentés avec des classes, le widget de base est essentiellement la classe de base à partir de laquelle une classe de widget est dérivée; il n'y a pas besoin d'une propriété pour définir le widget de base d'un widget.


Très intéressant, je ne le savais pas. +1. J'ai cependant mis à jour ma question, car vous m'avez rendu plus confus;)
Letharion

Demande de fonctionnalité ouverte . :)
Letharion
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.