Что такое «#» свойства?


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

Все эти свойства перечислены в справочнике Form 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.