O que são propriedades "#"?

22

Ao ler a documentação da estrutura do Ajax, me deparei com a menção da #ajaxpropriedade. Eu sei, ao vasculhar o código, existem outras dessas propriedades com sinais de hash na frente deles. O que o sinal de hash significa? Quais são essas propriedades?

beth
fonte
Espero que seja bom adicionar "sinal de libra" em algum lugar aqui nesta página (já que esse é um termo de pesquisa que eu estava usando para tentar descobrir isso, quando "hash" não estava obtendo resultados muito úteis).
Max Starkenburg 13/09

Respostas:

23

Isso tem a ver com matrizes de renderização em geral, não é apenas específico para o AJAX ou a API do formulário (embora a API do formulário use matrizes de renderização exclusivamente para criar seu conteúdo).

Simplificando, chaves de matriz em uma matriz de renderização sem um #na frente do nome são vistas como filhos da matriz de renderização e, posteriormente, são renderizadas (recursivamente).

Aqueles com um #na frente deles são vistos como metadados / variáveis ​​para a matriz de renderização usar conforme necessário e não são renderizados.

Os documentos da matriz de renderização (vinculados acima) na verdade colocam isso de maneira agradável e sucinta:

Uma matriz de renderização é uma matriz estruturada Drupal clássica que fornece dados (provavelmente aninhados), além de dicas sobre como devem ser renderizadas (propriedades, como #type).

As #chaves são as 'dicas' das quais o parágrafo acima está falando, as não #chaves são os dados aninhados.

Eu recomendaria completamente que a página fosse lida, ele faz um bom trabalho para desmistificar toda a coisa da matriz de renderização e fornece exemplos de código.

Há também outro pequeno exemplo de explicação / código nos documentos Theming the page que podem ser úteis.

As matrizes de renderização são usadas em todo o Drupal (formulários, temas, marcação geral etc.), portanto, conhecer um pouco sobre elas ajudará muito no desenvolvimento futuro do Drupal.

Clive
fonte
Bem, ponha-me à frente.
Chrisjlee #
4

A API do formulário usa um # na frente de todas as propriedades, para fazer uma distinção entre propriedades e elementos filhos. No código a seguir, $form['choice_wrapper']['choice']é um elemento filho, enquanto $form['choice_wrapper']['#tree']é uma propriedade.

  // 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 essas propriedades estão listadas na referência da API do formulário . Existem muitas propriedades, mas são todas sobre renderização, validação e envio.

O motivo para usar um prefixo para propriedades é poder filtrar rapidamente as propriedades dos elementos filhos, o que é útil quando eles precisam ser renderizados, por exemplo, com drupal_render () , que contém o código a seguir.

  // 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 você observar element_children () , notará que o código para filtrar as propriedades é o seguinte.

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