Saya cukup yakin itu adalah fungsi tema. Fungsi tema mana yang digunakan adalah pertanyaan. :)
akalata
Ah kamu di sana.
chrisjlee
Saya pikir Anda juga dapat menggunakan kunci #attribute untuk mendefinisikan kelas
Mika A.
@Mika A. Ini hanya berlaku untuk tag <input> saya ingin mengubah kelas bungkusnya (a <div>).
chrisjlee
Jawaban:
5
Anda dapat mengganti secara theme_form_element()normal jika Anda ingin mengubah tema secara global. Jika Anda tertarik untuk memodifikasi hanya satu elemen formulir tertentu maka saya menyadari beberapa pilihan.
Anda bisa mendaftarkan fungsi tema baru untuk tipe elemen elemen tertentu yang Anda minati (mis. Bidang teks). Anda kemudian membuat fungsi tema ini (berdasarkan aslinya, mis. theme_textfield()) Tetapi itu tidak memanggil theme('form_element', ...)pada akhirnya (Anda bisa menangani pembungkus dan elemen dalam fungsi satu tema, atau Anda bisa membuat fungsi tema pembungkus terpisah dan gunakan itu). Akhirnya Anda menambahkan #themeproperti ke elemen formulir tertentu, dan elemen itu akan mendapatkan tema khusus Anda.
Anda dapat membuat file template bernama form_element.tpl.phpyang hanya memiliki perilaku default theme_form_element()dan kemudian gunakan hook_preprocess_form_element()untuk menambahkan saran template. Kemudian Anda membuat templat baru yang sesuai dengan saran. Anda sering mendengar orang-orang mengatakan bahwa template sedikit lebih lambat daripada fungsi, dan untuk panggilan tema yang sering digunakan seperti itu saya dapat membayangkan orang-orang menolak untuk menggunakan template. Saya belum pernah melakukan pengukuran untuk ini sendiri. Selain itu, Anda perlu memiliki konteks yang cukup pada tahap persiapan untuk dapat membuat saran.
@ ChrisJ.Lee Apakah Anda ingin mengganti pembungkus pada semua elemen, atau hanya satu saja?
Andy
hanya satu.
chrisjlee
@ Chrisjlee Saya sudah memperbarui jawabannya.
Andy
4
Saya tahu ini adalah utas yang sangat lama, tetapi saya telah belajar cara mengubah elemen formulir dan menambahkan kelas. Saya sempat membuat modul khusus:
Ini adalah solusi alternatif yang baik - jangan menambahkan kelas ke pembungkus div, hanya membungkus pembungkus div dalam div Anda sendiri dan mereka Anda dapat menerapkan kelas apa pun yang Anda inginkan.
Felix Eve
3
Untuk Mengubah "wrapper" Anda perlu mengganti form_element. Pada dasarnya semua elemen formulir di-render dengan tema theme_form_element($element,$value);form_element (file form.inc)
Jadi untuk mengubah cara ini membuat elemen formulir Anda, Anda cukup menyalin fungsi itu ke folder template.php Anda dan ganti namanya menjadi: phptemplate_form_element($element,$value)
sekarang Anda dapat membuat perubahan apa pun dan itu akan digunakan alih-alih fungsi aslinya
Jawaban ini membantu saya, tetapi perhatikan bahwa ini berlaku khusus untuk Drupal 8.x dan yang lebih baru.
Will Martin
0
Yang penting, theme_form_element hanya akan memodifikasi div pembungkus induk langsung dan ini mungkin bukan target yang dimaksudkan untuk efek CSS.
[Meskipun tidak terprogram, jika seseorang hanya ingin menerapkan kelas ke pembungkus atas bidang simpul (pembungkusnya, pembungkusnya, pembungkusnya) saya dapat menggunakan modul "Kelompok bidang" dengan memilih "Kelola Bidang" untuk jenis konten tertentu dan pilih "Tambah grup baru" sebagai DIV sederhana. Kemudian label dapat dihapus dan kelas yang diinginkan ditugaskan ke pembungkus tambahan (tapi sekarang kami memiliki pembungkus lebih banyak) - dengan bersarang tanpa batas]
function my_module_form_alter(&$form,&$form_state, $form_id){
$form['account']['mail']['#my_theme_wrapper_attributes']['class'][]='form-field--inline';}
Ada kasus datang dalam yang tidak #prefix/#suffixatau #attributes => array('class')memberikan hasil yang diinginkan. Kasus khusus saya adalah menambahkan kelas ke div ajax-wrapper di sekitar elemen managed_file. #prefix/#suffixmenciptakan wadah baru dan #attributes/'class'memodifikasi kelas elemen dalam, bukan yang terluar.
Div terluar normal adalah adil
<divid="edit-doc1--XX-ajax-wrapper">
yang sulit ditargetkan di CSS. Saya dapat menargetkan [id^="edit-doc"]atau [id$="-ajax-wrapper"]tetapi kedua target ini lebih dari sekedar elemen yang saya inginkan.
Solusi yang saya temukan adalah menambahkan #processelemen ke formulir dan memanipulasi kode elemen secara manual. Berikut #processatribut yang ditambahkan ke deklarasi item formulir:
Dan inilah mymodule_managed_file_process()fungsinya:
function mymodule_managed_file_process($element,&$form_state, $form){// Call the original function to perform its processing.
$element = file_managed_file_process($element, $form_state, $form);// Add our own class for theming.
$element['#prefix']= str_replace('id=','class="managed-file-wrapper" id=',
$element['#prefix']);return $element;}
Mengandalkan subtitusi string tidak terlalu portabel, jadi gunakan str_replacedengan risiko Anda sendiri. Namun kode ini, memang mengubah DIV terluar untuk menambahkan kelas yang diperlukan:
Jawaban:
Anda dapat mengganti secara
theme_form_element()
normal jika Anda ingin mengubah tema secara global. Jika Anda tertarik untuk memodifikasi hanya satu elemen formulir tertentu maka saya menyadari beberapa pilihan.Anda bisa mendaftarkan fungsi tema baru untuk tipe elemen elemen tertentu yang Anda minati (mis. Bidang teks). Anda kemudian membuat fungsi tema ini (berdasarkan aslinya, mis.
theme_textfield()
) Tetapi itu tidak memanggiltheme('form_element', ...)
pada akhirnya (Anda bisa menangani pembungkus dan elemen dalam fungsi satu tema, atau Anda bisa membuat fungsi tema pembungkus terpisah dan gunakan itu). Akhirnya Anda menambahkan#theme
properti ke elemen formulir tertentu, dan elemen itu akan mendapatkan tema khusus Anda.Anda dapat membuat file template bernama
form_element.tpl.php
yang hanya memiliki perilaku defaulttheme_form_element()
dan kemudian gunakanhook_preprocess_form_element()
untuk menambahkan saran template. Kemudian Anda membuat templat baru yang sesuai dengan saran. Anda sering mendengar orang-orang mengatakan bahwa template sedikit lebih lambat daripada fungsi, dan untuk panggilan tema yang sering digunakan seperti itu saya dapat membayangkan orang-orang menolak untuk menggunakan template. Saya belum pernah melakukan pengukuran untuk ini sendiri. Selain itu, Anda perlu memiliki konteks yang cukup pada tahap persiapan untuk dapat membuat saran.sumber
Saya tahu ini adalah utas yang sangat lama, tetapi saya telah belajar cara mengubah elemen formulir dan menambahkan kelas. Saya sempat membuat modul khusus:
sumber
Untuk Mengubah "wrapper" Anda perlu mengganti form_element. Pada dasarnya semua elemen formulir di-render dengan tema
theme_form_element($element,$value);
form_element (file form.inc)Jadi untuk mengubah cara ini membuat elemen formulir Anda, Anda cukup menyalin fungsi itu ke folder template.php Anda dan ganti namanya menjadi:
phptemplate_form_element($element,$value)
sekarang Anda dapat membuat perubahan apa pun dan itu akan digunakan alih-alih fungsi aslinya
theme_form_element($element,$value);
dari form.incphptemplate_form_element($element,$value)
sumber
Anda dapat menggunakan properti wrapper_attributes .
sumber
Yang penting, theme_form_element hanya akan memodifikasi div pembungkus induk langsung dan ini mungkin bukan target yang dimaksudkan untuk efek CSS.
[Meskipun tidak terprogram, jika seseorang hanya ingin menerapkan kelas ke pembungkus atas bidang simpul (pembungkusnya, pembungkusnya, pembungkusnya) saya dapat menggunakan modul "Kelompok bidang" dengan memilih "Kelola Bidang" untuk jenis konten tertentu dan pilih "Tambah grup baru" sebagai DIV sederhana. Kemudian label dapat dihapus dan kelas yang diinginkan ditugaskan ke pembungkus tambahan (tapi sekarang kami memiliki pembungkus lebih banyak) - dengan bersarang tanpa batas]
sumber
Anda bisa menggunakannya
dan ini akan membungkusnya
sumber
Jadikan atribut wrapper dapat dikonfigurasi!
Buat fungsi tema elemen bentuk Anda sendiri di tema Anda ...
sites/all/themes/MY_THEME/theme/form-element.theme.inc
Maka Anda dapat melakukan hal-hal seperti ini ...
sumber
Ada kasus datang dalam yang tidak
#prefix/#suffix
atau#attributes => array('class')
memberikan hasil yang diinginkan. Kasus khusus saya adalah menambahkan kelas ke div ajax-wrapper di sekitar elemen managed_file.#prefix/#suffix
menciptakan wadah baru dan#attributes/'class'
memodifikasi kelas elemen dalam, bukan yang terluar.Div terluar normal adalah adil
yang sulit ditargetkan di CSS. Saya dapat menargetkan
[id^="edit-doc"]
atau[id$="-ajax-wrapper"]
tetapi kedua target ini lebih dari sekedar elemen yang saya inginkan.Solusi yang saya temukan adalah menambahkan
#process
elemen ke formulir dan memanipulasi kode elemen secara manual. Berikut#process
atribut yang ditambahkan ke deklarasi item formulir:Dan inilah
mymodule_managed_file_process()
fungsinya:Mengandalkan subtitusi string tidak terlalu portabel, jadi gunakan
str_replace
dengan risiko Anda sendiri. Namun kode ini, memang mengubah DIV terluar untuk menambahkan kelas yang diperlukan:sumber
Anda bisa menggunakan cara di atas untuk menambahkan kelas pada elemen formulir.
sumber