Pourquoi hook_form_alter () est-il si compliqué?

40

Voici un exemple que je viens de rencontrer. J'essaie de mettre du HTML dans l'étiquette de mon champ.

$form['field_feedback']['und']['#title'] <- has the title
$form['field_feedback']['und'][0]['#title'] <- has the title
$form['field_feedback']['und'][0]['value']['#title'] <- has the title. (Works)

Pourquoi trois attributs #title sont-ils remplis, un seul étant utilisé?

Joren
la source
1
où ce tableau de forme $ est généré? car je sais que nous n'avons pas de forme $ avec cette structure dans hook_form_alter
Mohammad Ali Akbari
Merci pour ça. Je tirais mes cheveux. La structure du tableau est ridicule.
JM01

Réponses:

72

Ce que vous voyez, c'est comment Drupal représente les champs dans un formulaire. Il se décompose comme ceci:

  • Les enfants du tableau extérieur $form['field_back']['und']( 'und'pour 'undefined') sont les différentes langues dans lesquelles le champ a été traduit. Dans Drupal, il est recommandé d'utiliser LANGUAGE_NONEpour 'und'dans le code.
  • Les enfants de chaque groupe de langues, par exemple $form['field_feedback']['und'][0], représentent les différentes entrées du champ. Par exemple, si un champ a cardinalité illimité, et il y a plusieurs entrées pour ce champ, ils montreront que $form['field_feedback']['und'][0], $form['field_feedback']['und'][1]etc.
  • Enfin, vous avez le ou les éléments de saisie de formulaire, pour les valeurs de champ eux-mêmes, par exemple $form['field_feedback']['und'][0]['value']. Dans ce cas, le nom de la colonne est value, pour un type de champ de référence de nœud nid, etc. Si un champ est associé à plusieurs colonnes de données, vous verrez également plus d'enfants. Ceux-ci sont représentés par un champ de texte / une zone de sélection / un widget spécial, et fourniront finalement la valeur du champ.

Le fait que des titres aient été ajoutés aux divers éléments de la hiérarchie est fortuit pour être honnête. Que ces titres soient affichés ou non sur le formulaire dépend des paramètres particuliers du tableau de rendu dans lequel chacun #titleest contenu.

Pour modifier le titre sur le widget de formulaire, il vous suffit de vous soucier de l'élément de formulaire situé tout en bas du tableau: c'est-à-dire des éléments d'entrée réels ( $form['field_feedback']['und'][0]['value'], etc.).

Il est probablement intéressant de noter que l'élément / widget utilisé pour un champ particulier peut être assez complexe. Si vous ne l'avez pas déjà, installez le module Devel et utilisez la dpm()fonction pour inspecter le $formtableau. cela vous montrera exactement où dans le tableau se trouvent les éléments que vous essayez de cibler.

Clive
la source
3
En bref, l'ajout de #title à quelque chose que Drupal ne considère pas comme un tableau d'API de formulaire n'a aucun effet. même dans ce cas, il n'est pas dit que #title est pris en compte, car ce n'est pas un attribut pour tous les éléments de formulaire implémentés par Drupal. Le champ API complique les choses, car il ajoute un tableau normal au tableau de formulaire, mais cela ne confond pas Drupal qui recherche #type pour reconnaître un élément de formulaire.
kiamlaluno