Que sont les propriétés «#»?

22

En lisant la documentation du framework Ajax, je suis tombé sur la mention de la #ajaxpropriété. Je sais en fouillant dans le code qu'il y a d'autres de ces propriétés avec des signes de hachage devant eux. Que signifie le signe de hachage? Quelles sont ces propriétés?

beth
la source
J'espère que c'est correct pour moi de vouloir ajouter "signe dièse" quelque part ici sur cette page (puisque c'est un terme de recherche que j'utilisais pour essayer de comprendre cela, quand "hachage" ne m'a pas donné de résultats trop utiles).
Max Starkenburg

Réponses:

23

Cela concerne les tableaux de rendu en général, ce n'est pas seulement spécifique à AJAX ou à l'API de formulaire (bien que l'API de formulaire utilise des tableaux de rendu exclusivement pour créer son contenu).

En termes simples, les clés de tableau dans un tableau de rendu sans un #devant le nom sont considérées comme des enfants du tableau de rendu et sont ensuite rendues elles-mêmes (récursivement).

Ceux avec un #devant eux sont considérés comme des métadonnées / variables que le tableau de rendu peut utiliser si nécessaire, et ne sont pas eux-mêmes rendus.

Les documents du tableau de rendu (liés à ci-dessus) mettent en fait cela gentiment et succinctement:

Un tableau de rendu est un tableau structuré Drupal classique qui fournit des données (probablement imbriquées) ainsi que des conseils sur la façon dont ils doivent être rendus (propriétés, comme #type).

Les #clés sont les «indices» dont parle le paragraphe ci-dessus, les non- #clés sont les données imbriquées.

Je recommande vivement de lire cette page, elle fait un bon travail de démystification de l'ensemble du tableau de rendu et fournit des exemples de code.

Il existe également un autre petit exemple d'explication / de code sur la documentation Theming the page qui pourrait être utile.

Les tableaux de rendu sont utilisés partout dans Drupal (formulaires, thèmes, balisage général, etc.), donc en savoir un peu sur eux aidera beaucoup au développement futur de Drupal.

Clive
la source
Eh bien, bat-moi.
chrisjlee
4

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;
      }
    }
  }
kiamlaluno
la source