Что такое свойства "#"?


Во время чтения Документация по фреймворку Ajax Я наткнулся на упоминание о свойстве #ajax. Я знаю, просматривая код, что есть и другие из этих свойств с хэш-знаками перед ними. Что означает знак хэша? О чем все эти свойства?

 23
7
Author: beth, 2012-06-05

2 answers

Это связано с массивами визуализации в общем, это относится не только к AJAX или API формы (хотя API формы использует массивы визуализации исключительно для создания своего контента).

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

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

Документы массива визуализации (связанные с выше) на самом деле выражают это красиво и лаконично:

Массив визуализации - это классический структурированный массив Drupal, который предоставляет данные (возможно, вложенные) вместе с подсказками о том, как их следует отображать (свойства, такие как #тип).

Ключи # являются "подсказками", о которых говорится в приведенном выше абзаце, ключи, отличные от #, являются вложенными данными.

Я бы настоятельно рекомендовал прочитав эту страницу, она хорошо справляется с де-мистификацией всего массива визуализации и предоставляет примеры кода.

Есть также еще одно небольшое объяснение/пример кода на Тематизации страницы документы, которые могут быть полезны.

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

 23
Author: Clive, 2012-07-10 20:09:52

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;
      }
    }
  }
 4
Author: kiamlaluno, 2012-06-05 19:18:24