Що таке "#" властивості?


22

Читаючи рамкову документацію Ajax, я натрапив на #ajaxвласність. Мені відомо, що за допомогою коду мимоволі про те, що перед ними є інші ці властивості з хеш-знаками. Що означає хеш-знак? Про що ці властивості?


Сподіваюсь, це нормально, що я хотів би десь на цій сторінці додати "знак фунта" (оскільки це пошуковий термін, який я використовував, щоб спробувати це зрозуміти, коли "хеш" не дав мені надто корисних результатів).
Макс Старкенбург

Відповіді:


23

Це пов'язано з масивами візуалізації взагалі, це не тільки специфічно для AJAX або API форми (хоча API форми використовує масиви візуалізації виключно для створення його вмісту).

Простіше кажучи, клавіші масиву в масиві візуалізації без імені #перед іменем розглядаються як діти масиву візуалізації, а згодом надаються самі (рекурсивно).

Ті , з# перед ними розглядаються як мета - дані / змінні для візуалізації масиву використання по мірі необхідності, і самі не надані.

Документи масиву візуалізації (пов'язані вище) насправді ставлять це добре і стисло:

Масив візуалізації - це класичний структурований масив Drupal, який надає дані (ймовірно, вкладені) разом із підказками щодо того, як він повинен бути наданий (властивості, як # type).

Ці #ключі є «підказкою» , що вище пункт говорить про те , що не- #ключі вкладених дані.

Я настійно рекомендую прочитати цю сторінку прочитаною, це непогано виконує демістифікацію всього масиву візуалізації та надає приклади коду.

Також є ще один невеликий приклад пояснення / коду на сторінці Theming який може бути корисним.

Масиви візуалізації використовуються повсюдно в Drupal (форми, теми, загальна розмітка тощо), тому знаючи про них трохи, допоможе багато в майбутньому Drupal розвитку.


Добре поставив бити мене до цього.
chrisjlee

4

API форми використовує # перед усіма властивостями, щоб розрізняти властивості та дочірні елементи. У наведеному нижче коді $form['choice_wrapper']['choice']є дочірнім елементом, а $form['choice_wrapper']['#tree']є властивістю.

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

Усі ці властивості перелічені у посиланні на API форми . Властивостей багато, але всі вони стосуються надання, перевірки та подання.

Причиною використання префікса властивостей є можливість швидкого відфільтрування властивостей з дочірніх елементів, що корисно, коли вони потребують надання, наприклад, з drupal_render () , який містить наступний код.

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

Якщо ви подивитеся на element_children () , ви помітите код для фільтрації властивостей наступний.

  // 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;
      }
    }
  }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.