Por que hook_form_alter () é tão bagunçado?

40

Aqui está um exemplo que acabei de encontrar. Estou tentando colocar um pouco de HTML no rótulo do meu campo.

$form['field_feedback']['und']['#title'] <- has the title
$form['field_feedback']['und'][0]['#title'] <- has the title
$form['field_feedback']['und'][0]['value']['#title'] <- has the title. (Works)

Por que existem três atributos #title preenchidos com apenas um sendo usado?

Joren
fonte
11
onde essa matriz $ form é gerada? como eu sei que nós não temos nenhuma forma $ com esta estrutura em hook_form_alter
Mohammad Ali Akbari
Obrigado por isso. Eu estava puxando meu cabelo. A estrutura da matriz é ridícula.
JM01

Respostas:

72

O que você está vendo é como o Drupal representa os campos em um formulário. Ele se divide assim:

  • Os filhos da matriz externa, $form['field_back']['und']( 'und'for 'undefined'), são os diferentes idiomas para os quais o campo foi traduzido. Em Drupal, recomenda-se a utilização LANGUAGE_NONEde 'und'no código.
  • Os filhos dentro de cada matriz de idiomas, por exemplo $form['field_feedback']['und'][0], representam as diferentes entradas para o campo. Por exemplo, se um campo tem cardinalidade ilimitada, e há várias entradas para esse campo, eles vão mostrar como $form['field_feedback']['und'][0], $form['field_feedback']['und'][1], etc.
  • Finalmente, você tem o (s) elemento (s) de entrada do formulário, para os próprios valores do campo, por exemplo $form['field_feedback']['und'][0]['value']. Nesse caso, o nome da coluna é value, para um tipo de campo de referência de nó, seria nide assim por diante. Se um campo tiver várias colunas de dados associadas, você verá mais filhos também. Eles são representados por um campo de texto / caixa de seleção / widget especial e, finalmente, fornecerão o valor para o campo.

O fato de os títulos terem sido adicionados aos vários elementos em toda a hierarquia é incidental para ser honesto. A exibição ou não desses títulos no formulário depende das configurações específicas da matriz de renderização na qual cada um #titleestá contido.

Para alterar o título no widget de formulário real, você só precisa se preocupar com o elemento do formulário na parte inferior da matriz: ou seja, os elementos de entrada reais ( $form['field_feedback']['und'][0]['value'], etc.).

Provavelmente vale a pena notar que o elemento / widget usado para um campo específico pode ser bastante complexo. Se você ainda não o possui, instale o módulo Devel e use a dpm()função para inspecionar a $formmatriz; que mostrará exatamente onde estão os elementos que você está tentando segmentar na matriz.

Clive
fonte
3
Em resumo, adicionar #title a algo que o Drupal não considera uma matriz de API de formulário não tem efeito; mesmo nesse caso, não se diz que o título seja levado em consideração, pois não é um atributo para todos os elementos de formulário que o Drupal implementa. A API do campo complica os assuntos, pois adiciona uma matriz normal à matriz do formulário, mas isso não confunde o Drupal que procura #type para reconhecer um elemento do formulário.
kiamlaluno