Perché hook_form_alter () è così disordinato?


40

Ecco un esempio in cui mi sono appena imbattuto. Sto cercando di inserire un po 'di HTML nell'etichetta del mio 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)

Perché ci sono tre attributi #title popolati con solo uno usato?


1
dove viene generato questo array $ form? come so non abbiamo $ form con questa struttura in hook_form_alter
Mohammad Ali Akbari

Grazie per questo. Mi stavo togliendo i capelli. La struttura dell'array è ridicola.
JM01

Risposte:


72

Quello che vedi è come Drupal rappresenta i campi in un modulo. Si scompone così:

  • I figli dell'array esterno, $form['field_back']['und']( 'und'per 'undefined'), sono le diverse lingue in cui il campo è stato tradotto. In Drupal, si consiglia di utilizzare LANGUAGE_NONEper il 'und'codice.
  • I bambini all'interno di ciascun array di lingue, ad esempio $form['field_feedback']['und'][0], rappresentano le diverse voci per il campo. Ad esempio, se un campo ha cardinalità illimitato, e ci sono diverse voci per quel campo, mostreranno come $form['field_feedback']['und'][0], $form['field_feedback']['und'][1], etc.
  • Infine hai gli elementi di input del modulo, per i valori dei campi stessi, ad es $form['field_feedback']['und'][0]['value']. In questo caso il nome della colonna è value, per un tipo di campo di riferimento nodo sarebbe nid, e così via. Se a un campo sono associate più colonne di dati, vedrai anche più figli. Questi sono rappresentati da un campo di testo / casella di selezione / widget speciale e alla fine forniranno il valore per il campo.

Il fatto che i titoli siano stati aggiunti ai vari elementi in tutta la gerarchia è per inciso ad essere sincero. La visualizzazione o meno di tali titoli nel modulo dipende dalle impostazioni particolari dell'array di rendering in cui #titlesono contenute.

Per cambiare il titolo sul widget del modulo effettivo, devi solo preoccuparti dell'elemento del modulo nella parte inferiore dell'array: ovvero gli elementi di input effettivi ( $form['field_feedback']['und'][0]['value'], ecc.).

Vale probabilmente la pena notare che l'elemento / widget utilizzato per un determinato campo potrebbe essere piuttosto complesso. Se non lo hai già, dovresti installare il modulo Devel e usare la dpm()funzione per ispezionare l' $formarray; che ti mostrerà esattamente dove sono gli elementi dell'array che stai cercando di indirizzare.


3
In breve, l'aggiunta di #title a qualcosa che Drupal non considera un array API forma non ha alcun effetto; anche in quel caso, non si dice che #title sia preso in considerazione, poiché non è un attributo per tutti gli elementi del modulo implementati da Drupal. L'API di campo complica le cose, in quanto aggiunge un array normale all'array di moduli, ma ciò non confonde Drupal che cerca #type , per riconoscere un elemento del modulo.
kiamlaluno
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.