什么是“#”属性?


22

在阅读Ajax框架文档时,我偶然提到了该#ajax属性。通过遍历代码,我知道这些属性中还有其他属性,其前面带有井号。哈希符号表示什么?这些特性到底是什么?


希望我可以在此页面的此处添加“英镑符号”(因为这是我用来试图弄清楚这一点的搜索词,而“哈希”并没有给我带来太大帮助)。
Max Starkenburg

Answers:


23

通常,这与渲染数组有关,不仅限于AJAX或表单API(尽管表单API仅使用渲染数组来构建其内容)。

简而言之,在渲染数组#中名称前面不带a的数组键将被视为渲染数组的子级,并随后对其进行递归渲染(递归)。

那些一个#在他们面前被视为用于渲染阵列用作必需的元数据/变量,而不是本身呈现。

渲染数组文档(链接到上面)实际上很简洁:

渲染数组是经典的Drupal结构化数组,它提供数据(可能是嵌套的)以及有关应如何渲染(属性,如#type)的提示。

#键是“提示”,上面的段落在谈论,非#键是嵌套的数据。

我会彻底建议您阅读该页面,它可以很好地使整个渲染数组变得神秘,并提供代码示例。

主题页面文档上还有另一个小的解释/代码示例,可能会有用。

渲染数组在Drupal的各个地方(窗体,主题,常规标记等)都得到了广泛使用,因此,了解它们的一些知识将对Drupal的未来开发有很大帮助。


好吧,击败我。
chrisjlee 2012年

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;
      }
    }
  }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.