L'API de formulaire utilise un # devant toutes les propriétés, pour faire la distinction entre les propriétés et les éléments enfants. Dans le code suivant, $form['choice_wrapper']['choice']
est un élément enfant, tandis que $form['choice_wrapper']['#tree']
est une propriété.
// Add a wrapper for the choices and more button.
$form['choice_wrapper'] = array(
'#tree' => FALSE,
'#weight' => -4,
'#prefix' => '<div class="clearfix" id="poll-choice-wrapper">',
'#suffix' => '</div>',
);
// Container for just the poll choices.
$form['choice_wrapper']['choice'] = array(
'#prefix' => '<div id="poll-choices">',
'#suffix' => '</div>',
'#theme' => 'poll_choices',
);
Toutes ces propriétés sont répertoriées dans la référence de l'API Form . Il existe de nombreuses propriétés, mais elles concernent toutes le rendu, la validation et la soumission.
La raison d'utiliser un préfixe pour les propriétés est de pouvoir filtrer rapidement les propriétés des éléments enfants, ce qui est utile lorsqu'elles doivent être rendues, par exemple avec drupal_render () , qui contient le code suivant.
// Get the children of the element, sorted by weight.
$children = element_children($elements, TRUE);
// Initialize this element's #children, unless a #pre_render callback already
// preset #children.
if (!isset($elements['#children'])) {
$elements['#children'] = '';
}
// Call the element's #theme function if it is set. Then any children of the
// element have to be rendered there.
if (isset($elements['#theme'])) {
$elements['#children'] = theme($elements['#theme'], $elements);
}
// If #theme was not set and the element has children, render them now.
// This is the same process as drupal_render_children() but is inlined
// for speed.
if ($elements['#children'] == '') {
foreach ($children as $key) {
$elements['#children'] .= drupal_render($elements[$key]);
}
}
Si vous regardez element_children () , vous remarquerez que le code pour filtrer les propriétés est le suivant.
// Filter out properties from the element, leaving only children.
$children = array();
$sortable = FALSE;
foreach ($elements as $key => $value) {
if ($key === '' || $key[0] !== '#') {
$children[$key] = $value;
if (is_array($value) && isset($value['#weight'])) {
$sortable = TRUE;
}
}
}