web-dev-qa-db-fra.com

Pourquoi hook_form_alter () est-il si désordonné?

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 y a-t-il trois attributs #title remplis avec un seul utilisé?

39
Joren

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

  • Les enfants du tableau externe, $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_NONE Pour 'und' Dans le code.
  • Les enfants à l'intérieur de chaque tableau de langues, par ex. $form['field_feedback']['und'][0], Représentent les différentes entrées du champ. Par exemple, si un champ a une cardinalité illimitée et qu'il existe plusieurs entrées pour ce champ, elles s'afficheront sous la forme $form['field_feedback']['und'][0], $form['field_feedback']['und'][1], Etc.
  • Enfin, vous avez le ou les éléments d'entrée de formulaire, pour les valeurs de champ elles-mêmes, par ex. $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, ce serait 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/boîte de sélection/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 accessoire pour être honnête. L'affichage ou non de ces titres sur le formulaire dépend des paramètres particuliers du tableau de rendu dans lequel chaque #title Est contenu.

Pour modifier le titre du widget de formulaire réel, il vous suffit de vous soucier de l'élément de formulaire tout en bas du tableau: c'est-à-dire les é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à, vous devez installer le module Devel et utiliser la fonction dpm() pour inspecter le tableau $form; qui vous montrera exactement où se trouvent dans le tableau les éléments que vous essayez de cibler.

71
Clive