Jakie są właściwości „#”?

22

Podczas czytania dokumentacji środowiska Ajax natknąłem się na wzmiankę o tej #ajaxwłaściwości. Wiem, po przejrzeniu kodu, że są inne z tych właściwości ze znakami skrótu przed nimi. Co oznacza znak skrótu? Na czym polegają te właściwości?

beth
źródło
Mam nadzieję, że mogę dodawać „znak funta” gdzieś na tej stronie (ponieważ to wyszukiwane hasło próbowałem to rozgryźć, gdy „hash” nie dawał mi zbyt pomocnych wyników).
Max Starkenburg

Odpowiedzi:

23

Ma to ogólnie związek z tablicami renderowania , nie dotyczy tylko AJAX ani interfejsu API formularza (chociaż interfejs API formularza używa tablic renderowania wyłącznie do budowania zawartości).

Mówiąc prościej, klucze tablicy w tablicy renderowania bez znaku #przed nazwą są postrzegane jako dzieci tablicy renderowania, a następnie są renderowane same (rekurencyjnie).

Te z# przed nimi widoczne są jako dane meta / zmiennych dla tablicy nadania do stosowania w miarę potrzeby, i nie są same w sobie renderowane.

Dokumenty tablicy renderowania (powiązane z powyższym) faktycznie przedstawiają to ładnie i zwięźle:

Tablica renderująca to klasyczna tablica strukturalna Drupal, która dostarcza danych (prawdopodobnie zagnieżdżonych) wraz ze wskazówkami, jak powinna być renderowana (właściwości, takie jak #type).

Te #klucze są „wskazówki”, że powyższy akapit mówi, że nie- #klucze są dane zagnieżdżone.

Całkowicie poleciłbym odczytanie tej strony, dobrze odwzorowuje całą tablicę renderowania i podaje przykłady kodu.

Jest też inne małe wyjaśnienie / przykład kodu w dokumentacji Theming the page, które mogą być przydatne.

Tablice renderowania są używane wszędzie w Drupal (formularze, motywy, ogólne znaczniki itp.), Więc wiedza na ich temat bardzo pomoże w przyszłym rozwoju Drupala.

Clive
źródło
Dobrze mnie pobij.
chrisjlee
4

Interfejs API formularza używa znaku # przed wszystkimi właściwościami, aby wprowadzić rozróżnienie między właściwościami a elementami potomnymi. W poniższym kodzie $form['choice_wrapper']['choice']jest elementem potomnym, a $form['choice_wrapper']['#tree']właściwością.

  // 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',
  );

Wszystkie te właściwości są wymienione w odwołaniu do interfejsu API formularza . Istnieje wiele właściwości, ale wszystkie dotyczą renderowania, sprawdzania poprawności i przesyłania.

Powodem użycia prefiksu dla właściwości jest możliwość szybkiego odfiltrowania właściwości z elementów potomnych, co jest przydatne, gdy trzeba je renderować, na przykład za pomocą drupal_render () , który zawiera następujący kod.

  // 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]);
    }
  }

Jeśli spojrzysz na element_children () , zauważysz, że kod do odfiltrowania właściwości jest następujący.

  // 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
źródło