Mengapa hook_form_alter () sangat berantakan?

40

Ini contoh yang baru saja saya temui. Saya mencoba memasukkan beberapa HTML ke label bidang saya.

$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)

Mengapa ada tiga atribut #title yang terisi dengan hanya satu yang digunakan?

Joren
sumber
1
di mana array $ form ini dihasilkan? seperti yang saya tahu kita tidak memiliki $ form dengan struktur ini di hook_form_alter
Mohammad Ali Akbari
Terima kasih untuk ini. Saya mencabut rambut saya. Struktur array konyol.
JM01

Jawaban:

72

Apa yang Anda lihat adalah bagaimana Drupal merepresentasikan bidang dalam formulir. Itu rusak seperti ini:

  • Anak-anak dari array luar, $form['field_back']['und']( 'und'untuk 'undefined'), adalah berbagai bahasa yang telah diterjemahkan oleh bidang ini. Dalam Drupal, Anda dianjurkan untuk digunakan LANGUAGE_NONEuntuk 'und'dalam kode.
  • Anak-anak di dalam setiap larik bahasa, misalnya $form['field_feedback']['und'][0], mewakili entri yang berbeda untuk bidang tersebut. Sebagai contoh, jika lapangan memiliki kardinalitas terbatas, dan ada beberapa entri untuk bidang itu, mereka akan menunjukkan sebagai $form['field_feedback']['und'][0], $form['field_feedback']['und'][1], dll
  • Akhirnya Anda memiliki elemen input bentuk, untuk nilai bidang itu sendiri, misalnya $form['field_feedback']['und'][0]['value']. Dalam hal ini nama kolomnya adalah value, untuk tipe bidang referensi simpul nid, dan seterusnya. Jika suatu bidang memiliki beberapa kolom data yang terkait dengannya, Anda juga akan melihat lebih banyak anak. Ini diwakili oleh bidang teks / kotak pilih / widget khusus, dan pada akhirnya akan memberikan nilai untuk bidang tersebut.

Fakta bahwa judul telah ditambahkan ke berbagai elemen di seluruh hierarki adalah insidental jujur. Apakah atau tidak judul-judul tersebut ditampilkan pada formulir adalah ke pengaturan tertentu dari array render di mana masing #title- masing berisi.

Untuk mengubah judul pada widget form aktual, Anda hanya perlu khawatir tentang elemen form di bagian paling bawah array: yaitu elemen input aktual ( $form['field_feedback']['und'][0]['value'], dll.).

Mungkin perlu dicatat bahwa elemen / widget yang digunakan untuk bidang tertentu mungkin cukup kompleks. Jika Anda belum memilikinya, Anda harus menginstal modul Devel dan menggunakan dpm()fungsi untuk memeriksa $formarray; yang akan menunjukkan dengan tepat di mana dalam array elemen yang Anda coba targetkan.

Clive
sumber
3
Singkatnya, menambahkan #title ke sesuatu yang Drupal tidak menganggap bentuk array API tidak berpengaruh; bahkan dalam kasus itu, tidak dikatakan # judul dipertimbangkan, karena itu bukan atribut untuk semua elemen bentuk yang diterapkan Drupal. API bidang memperumit masalah, karena menambahkan array normal ke form array, tetapi itu tidak membingungkan Drupal yang mencari #type , untuk mengenali elemen formulir.
kiamlaluno