「#」プロパティとは何ですか?


22

Ajaxフレームワークのドキュメントを読みながら、この#ajaxプロパティについて言及しました。これらのプロパティには、その前にハッシュ記号が付いたものが他にもあることが、コードをざっと見てみるとわかります。ハッシュ記号は何を意味しますか?これらのプロパティは何ですか?


このページのどこかに "シャープ記号"を追加したいと思います( "ハッシュ"で役に立たない結果になっていないときに、これを理解するために使用していた検索用語であるため)。
マックス・スターケンバーグ

回答:


23

これは一般にレンダー配列と関係があり AJAXまたはフォームAPIに固有のものではありません(フォームAPIはコンテンツの構築にレンダー配列のみを使用します)。

簡単に言えば、#名前の前にないレンダー配列の配列キーは、レンダー配列の子と見なされ、その後(再帰的に)レンダリングされます。

それら#彼らの前には、必要に応じて使用するレンダリングアレイ用のメタデータ/変数として見られている、と自体がレンダリングされません。

レンダー配列ドキュメント(上記にリンク)は、実際にこれを簡潔かつ簡潔に記述しています。

レンダー配列は、データ(おそらくネストされている)をレンダリングする方法に関するヒント(#typeなどのプロパティ)とともに提供する、古典的なDrupal構造化配列です。

#キーは上の段落が話していることを「ヒント」であり、非#キーは、ネストされたデータです。

そのページを読むことを徹底的にお勧めします。レンダー配列全体を分かりやすく説明し、コード例を提供します。

また、ページドキュメントのテーマ設定に関する別の小さな説明/コード例もあります

レンダー配列は、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;
      }
    }
  }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.