Sangat masuk akal jika ingin menggunakan file tpl untuk menampilkan formulir. Anda dapat menggunakan banyak CSS dan #prefix
/ #suffix
properti asing untuk mendapatkan hasil yang serupa, tetapi dengan menggunakan tpl, Anda tidak perlu mengacaukan pemisahan logika dan lapisan presentasi Anda dan tidak harus menargetkan pemilih CSS yang jelek seperti #user-login label
. Berikut ini contoh dalam Drupal 7 ...
mytheme / template.php:
function mytheme_theme($existing, $type, $theme, $path) {
// Ex 1: the "story" node edit form.
$items['story_node_form'] = array(
'render element' => 'form',
'template' => 'node-edit--story',
'path' => drupal_get_path('theme', 'mytheme') . '/template/form',
);
// Ex 2: a custom form that comes from a custom module's "custom_donate_form()" function.
$items['custom_donate_form'] = array(
'render element' => 'form',
'template' => 'donate',
'path' => drupal_get_path('theme', 'mytheme') . '/template/form',
);
return $items;
}
custom_donate_form ():
function custom_donate_form($form, &$form_state) {
$form['first_name'] = array(
'#type' => 'textfield',
'#attributes' => array('placeholder' => t('First name')),
);
$form['last_name'] = array(
'#type' => 'textfield',
'#attributes' => array('placeholder' => t('Last name')),
);
$form['address'] = array(
'#type' => 'textfield',
'#attributes' => array('placeholder' => t('Address')),
);
$form['city'] = array(
'#type' => 'textfield',
'#attributes' => array('placeholder' => t('City')),
);
$form['state'] = array(
'#type' => 'select',
'#options' => array(
'default' => 'State',
'...' => '...',
),
);
$form['zip'] = array(
'#type' => 'textfield',
'#attributes' => array('placeholder' => t('Zip')),
);
$form['email'] = array(
'#type' => 'textfield',
'#attributes' => array('placeholder' => t('Email')),
);
$form['phone'] = array(
'#type' => 'textfield',
'#attributes' => array('placeholder' => t('Phone')),
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Submit',
);
return $form;
}
mytheme / template / form / donate.tpl.php:
<div class="row">
<div class="small-12 medium-12 large-8 columns">
<div class="row">
<div class="small-12 columns">
<h5>Contact Information</h5>
</div>
</div>
<div class="row">
<div class="small-12 large-6 medium-6 columns">
<?php print render($form['first_name']); ?>
</div>
<div class="small-12 large-6 medium-6 columns">
<?php print render($form['last_name']); ?>
</div>
</div>
<div class="row">
<div class="small-12 medium-6 large-6 columns">
<?php print render($form['address']); ?>
</div>
<div class="small-12 medium-6 large-6 columns">
<?php print render($form['city']); ?>
</div>
</div>
<div class="row">
<div class="small-12 medium-3 large-3 columns">
<?php print render($form['state']); ?>
</div>
<div class="small-12 medium-3 large-3 columns">
<?php print render($form['zip']); ?>
</div>
<div class="medium-6 large-6 columns"></div>
</div>
<div class="row">
<div class="small-12 medium-6 large-6 columns">
<?php print render($form['email']); ?>
</div>
<div class="small-12 medium-6 large-6 columns">
<?php print render($form['phone']); ?>
</div>
</div>
</div>
<div class="row">
<div class="small-12 medium-12 large-8 large-offset-2 columns">
<?php print render($form['submit']); ?>
</div>
</div>
</div>
<!-- Render any remaining elements, such as hidden inputs (token, form_id, etc). -->
<?php print drupal_render_children($form); ?>
Ini menggunakan Foundation , yang memberi kita formulir seperti ini:
print drupal_render_children($form)
yang membuat formulir benar-benar melakukan hal-hal :).engine
, jika Anda menggunakan sesuatu yang tidak standar. Misalnya'engine' => 'twig'
.user_profile_form
atauuser_register_form
. Dalam skenario itu Anda harus a) melakukan tema Anda di tema admin (atau subtema dari itu jika Anda tidak dapat mengubah tema admin dasar) atau b) menempatkan tema Anda dalam modul khusus. Kalau tidak, tema Anda tidak akan terlihat.Anda harus mengimplementasikan hook_form_alter () dalam modul atau template.php dan mengatur properti tema # form :
Kemudian terapkan tema baru:
Dan kemudian tambahkan formulir - template user_login.tpl.php dengan mengikuti kode untuk membuat formulir:
sumber
#theme
properti adalah sangat sangat sederhana dan disebutkan untuk pertama kalinya benar-benar rendah di dalam jawaban, super aneh. Ini jelas merupakan metode favorit saya.Meskipun Anda mungkin dapat menggunakan solusi kiamlaluno, saya pribadi tidak akan melakukannya.
Apa alasan Anda membutuhkan file templat untuk formulir? Jika itu karena Anda ingin markup yang sedikit berbeda untuk formulir yang ada? Jika demikian maka Anda dapat menggunakan
hook_form_alter()
untuk mengubah formulir sebelum diberikan. Menggunakan Formulir API Anda, Anda dapat memodifikasi semua bidang formulir menyuntikkan elemen html dll.Berikut adalah contoh
hook_form_alter()
yang saya buat yang memodifikasi blok form login drupal standar:Contoh di atas membungkus seluruh formulir dalam DIV yang memiliki gaya sebaris untuk mengubah warna latar belakang menjadi merah. Itu juga menambahkan paragraf teks bantuan ke awal formulir.
Seperti inilah bentuk login pengguna saya sekarang setelah kode di atas dimuat:
Lihat referensi API Formulir untuk informasi lebih lanjut: Referensi API Formulir
sumber
Sebenarnya saya tidak pernah perlu menggunakan file templat untuk formulir.
Sejauh yang saya bisa lihat, kode inti Drupal menggunakan fungsi tema, ketika formulir, atau bagian dari formulir perlu dirender dengan cara tertentu; fungsi tema yang memanggil drupal_render () biasanya cukup untuk tujuan apa pun.
Untuk membalas pertanyaan, membuat file templat untuk formulir tidak berbeda dari membuat file templat yang bukan untuk formulir.
Tentukan fungsi tema, gunakan sebagai fungsi tema nama pemanggil formulir pembangun. Kode harus serupa dengan yang berikut:
Jika formulir berisi nilai
$form['field_1']
, nilainya akan tersedia di file templat sebagai$field_1
. File template juga dapat menggunakan nilai apa pun yang diteruskantemplate_preprocess_mymodule_form()
.sumber
$form['#theme']
.Saya akan selalu gaya dengan menambahkan ke file CSS saya menggunakan penyeleksi untuk mengidentifikasi elemen yang akan ditata sebagai berikut untuk formulir login inti
Di atas saya hanya menambahkan
sites/all/themes/theme-name/css/theme-name.css
Jika apa yang Anda perlu gaya tidak memiliki ID atau pemilih yang cukup akurat maka perlu menggunakan
hook
pendekatan untuk memodifikasi HTML juga menambahkan pengidentifikasi.IMO menggunakan gaya inline pada elemen adalah praktik yang sangat buruk yang harus ditinggalkan dan diganti dengan menggunakan
class
danid
sumber
Untuk tema formulir, Anda dapat menggunakan custom css, seperti yang dijelaskan dalam Themeing Drupal 7 Forms (Termasuk CSS dan JS) .
Pada dasarnya Anda perlu melakukan langkah-langkah ini:
sumber
Saya cukup yakin Anda dapat menggunakan templat untuk formulir, tetapi Anda harus menggunakan hook_theme untuk mendaftarkan templat di tempat pertama. Saya punya situasi di mana formulir benar - benar perlu berbasis tabel daripada berbasis div dan perubahan #prefix dan #suffix sederhana tidak benar-benar memotongnya. Jika tertarik saya mungkin bisa mencoba dan menggali contoh.
sumber