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 .
Réponses:
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:
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éesWidgetInterface
. L'interface commune à ces interfaces estPluginInspectionInterface
, qui ne définit aucune méthode de rendu d'un élément de formulaire, qui sont plutôt définis à partir d'RenderElement
une 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.
la source