¿Qué son las propiedades "#"?

22

Mientras leía la documentación del marco de Ajax me encontré con la mención de la #ajaxpropiedad. Sé por leer el código que hay otras de estas propiedades con signos hash delante de ellas. ¿Qué significa el signo hash? ¿De qué se tratan estas propiedades?

beth
fuente
Espero que esté bien para mí querer agregar "signo de libra" en algún lugar aquí en esta página (ya que ese es un término de búsqueda que estaba usando para tratar de resolver esto, cuando "hash" no estaba obteniendo resultados demasiado útiles).
Max Starkenburg

Respuestas:

23

Esto tiene que ver con las matrices de renderizado en general, no solo es específico para AJAX o la API de formulario (aunque la API de formulario utiliza matrices de renderizado exclusivamente para construir su contenido).

En pocas palabras, las teclas de matriz en una matriz de representación sin #delante del nombre se ven como elementos secundarios de la matriz de representación y, posteriormente, se representan a sí mismas (recursivamente).

Aquellos con un #frente de ellos son vistos como metadatos / variables para que la matriz de renderización los use según sea necesario, y no se representan ellos mismos.

Los documentos de la matriz de renderizado (vinculados a lo anterior) en realidad ponen esto agradable y sucintamente:

Una matriz de renderizado es una matriz estructurada de Drupal clásica que proporciona datos (probablemente anidados) junto con sugerencias sobre cómo se debe representar (propiedades, como #type).

Las #claves son las "pistas" de las que habla el párrafo anterior, las no #claves son los datos anidados.

Recomiendo encarecidamente leer esa página, hace un buen trabajo de desmitificación de todo el conjunto de renderizado y proporciona ejemplos de código.

También hay otro pequeño ejemplo de explicación / código en Theming the page docs que podría ser útil.

Las matrices de renderizado se utilizan por todas partes en Drupal (formularios, temas, marcado general, etc.), por lo que conocer un poco sobre ellas ayudará mucho con el desarrollo futuro de Drupal.

Clive
fuente
Bueno, ponme a golpe.
chrisjlee
4

El formulario API utiliza un # delante de todas las propiedades, para hacer una distinción entre propiedades y elementos secundarios. En el siguiente código, $form['choice_wrapper']['choice']es un elemento hijo, mientras que $form['choice_wrapper']['#tree']es una propiedad.

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

Todas esas propiedades se enumeran en la referencia de API de formulario . Hay muchas propiedades, pero se trata de renderizar, validar y enviar.

La razón para usar un prefijo para las propiedades es poder filtrar rápidamente las propiedades de los elementos secundarios, lo cual es útil cuando se necesitan renderizar, por ejemplo con drupal_render () , que contiene el siguiente código.

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

Si observa element_children () , notará que el código para filtrar las propiedades es el siguiente.

  // 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
fuente