Cosa sono le proprietà "#"?


22

Durante la lettura della documentazione del framework Ajax mi sono imbattuto nella menzione della #ajaxproprietà. Con la ricerca del codice so che ci sono altre di queste proprietà con segni di hash davanti a loro. Cosa significa il segno hash? In cosa consistono queste proprietà?


Spero che vada bene per me aggiungere "cancelletto" da qualche parte qui in questa pagina (dato che è un termine di ricerca che stavo usando per provare a capirlo, quando "hash" non mi stava dando risultati troppo utili).
Max Starkenburg,

Risposte:


23

Ciò ha a che fare con gli array di rendering in generale, non è solo specifico di AJAX o dell'API del modulo (sebbene l'API del modulo utilizzi gli array di rendering esclusivamente per costruirne il contenuto).

In parole povere, le chiavi di array in un array di rendering senza un #davanti al nome sono viste come elementi secondari dell'array di rendering e vengono successivamente rese loro stesse (ricorsivamente).

Quelli con un #davanti sono visti come metadati / variabili che l'array di rendering può usare come necessario e non sono essi stessi resi.

I documenti dell'array di rendering (collegati sopra) in realtà lo rendono carino e succintamente:

Un array di rendering è un classico array strutturato di Drupal che fornisce dati (probabilmente nidificati) insieme a suggerimenti su come dovrebbero essere resi (proprietà, come #type).

Le #chiavi sono i "suggerimenti" di cui parla il paragrafo precedente, le non #chiavi sono i dati nidificati.

Consiglio vivamente di dare una lettura a quella pagina, fa un buon lavoro di demistificare l'intera cosa dell'array di rendering e fornisce esempi di codice.

C'è anche un'altra piccola spiegazione / esempio di codice sui documenti della pagina Theming che potrebbe essere utile.

Le matrici di rendering sono utilizzate ovunque in Drupal (forme, temi, markup generale, ecc.), Quindi conoscerne una buona parte aiuterà molto nel futuro sviluppo di Drupal.


Beh, mettimi alla prova.
chrisjlee,

4

L'API del modulo utilizza un # davanti a tutte le proprietà, per distinguere tra proprietà ed elementi figlio. Nel codice seguente, $form['choice_wrapper']['choice']è un elemento figlio, mentre $form['choice_wrapper']['#tree']è una proprietà.

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

Tutte queste proprietà sono elencate nel riferimento API del modulo . Esistono molte proprietà, ma riguardano il rendering, la convalida e l'invio.

Il motivo per utilizzare un prefisso per le proprietà è riuscire a filtrare rapidamente le proprietà dagli elementi figlio, che è utile quando devono essere renderizzate, ad esempio con drupal_render () , che contiene il seguente codice.

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

Se guardi element_children () , noterai che il codice per filtrare le proprietà è il seguente.

  // 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;
      }
    }
  }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.