Was sind "#" Eigenschaften?

22

Beim Lesen der Ajax-Framework-Dokumentation bin ich auf eine Erwähnung der #ajaxEigenschaft gestoßen. Ich weiß vom Stöbern durch den Code, dass es andere dieser Eigenschaften mit Rautezeichen vor ihnen gibt. Was bedeutet das Rautezeichen? Worum geht es bei diesen Eigenschaften?

Beth
quelle
Hoffentlich ist es in Ordnung, dass ich hier auf dieser Seite irgendwo ein "Nummernzeichen" hinzufüge (da dies ein Suchbegriff ist, den ich verwendet habe, um das herauszufinden, als "Hash" nicht zu hilfreichen Ergebnissen geführt hat).
Max Starkenburg

Antworten:

23

Dies hat mit Render-Arrays im Allgemeinen zu tun , es ist nicht nur AJAX-spezifisch oder die Formular-API (obwohl die Formular-API Render-Arrays ausschließlich zum Aufbau des Inhalts verwendet).

Vereinfacht ausgedrückt werden Array-Schlüssel in einem Render-Array ohne ein #vor dem Namen als untergeordnete Elemente des Render-Arrays betrachtet und anschließend selbst (rekursiv) gerendert.

Diejenigen mit einem #vor ihnen werden als Metadaten / Variablen für das Render-Array angesehen, die nach Bedarf verwendet werden können, und werden nicht selbst gerendert.

In den Render-Array-Dokumenten (oben verlinkt) ist dies kurz und bündig formuliert:

Ein Render-Array ist ein klassisches, strukturiertes Drupal-Array, das Daten (wahrscheinlich verschachtelt) zusammen mit Hinweisen darüber enthält, wie sie gerendert werden sollen (Eigenschaften wie #type).

Die #Schlüssel sind die "Hinweise", von denen der obige Absatz spricht, die Nichtschlüssel #sind die verschachtelten Daten.

Ich würde empfehlen, diese Seite gründlich zu lesen, sie enträtselt das gesamte Render-Array und liefert Codebeispiele.

Es gibt auch eine weitere kleine Erklärung / ein Codebeispiel auf der Themeseite, die nützlich sein könnten.

Render-Arrays werden in Drupal überall verwendet (Formulare, Themen, allgemeine Markups usw.). Wenn Sie sich also gut mit ihnen auskennen, können Sie die zukünftige Drupal-Entwicklung erheblich unterstützen.

Clive
quelle
Gut gesagt, schlagen Sie mich.
Chrisjlee
4

Die Formular-API verwendet ein # vor allen Eigenschaften, um zwischen Eigenschaften und untergeordneten Elementen zu unterscheiden. Im folgenden Code $form['choice_wrapper']['choice']handelt es sich um ein untergeordnetes Element und $form['choice_wrapper']['#tree']um eine Eigenschaft.

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

Alle diese Eigenschaften sind in der Formular-API-Referenz aufgeführt . Es gibt viele Eigenschaften, bei denen es jedoch ausschließlich um Rendering, Validierung und Übermittlung geht.

Der Grund für die Verwendung eines Präfixes für Eigenschaften ist das schnelle Herausfiltern der Eigenschaften aus den untergeordneten Elementen. Dies ist nützlich, wenn sie gerendert werden müssen, beispielsweise mit drupal_render () , das den folgenden Code enthält.

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

Wenn Sie sich element_children () ansehen , werden Sie feststellen, dass der Code zum Herausfiltern von Eigenschaften der folgende ist.

  // 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;
      }
    }
  }
kiamlaluno
quelle