Beragam formulir pada satu halaman?

8

Apakah mungkin untuk meletakkan beberapa formulir pada satu halaman?

Saya mencoba membuat halaman penawaran kupon. Saya ingin memiliki dua formulir untuk dua penawaran berbeda di setiap sisi halaman. Setiap formulir memiliki bidang teks untuk kode kupon dan tombol kirim sendiri. Bentuk pertama berfungsi dengan baik; namun nilai tersembunyi bentuk kedua tampaknya ditimpa oleh bentuk pertama.

Saya menggunakan hook_alter untuk mengubah bentuk kedua untuk membuatnya berbeda, tetapi masih memiliki form_id yang sama dengan yang pertama. Apakah ini yang menyebabkan masalah saya, atau apakah saya perlu mencari / berpikir di tempat lain?

Kedua formulir memiliki nilai yang sama untuk "form_id" dan "form_token," tetapi nilai yang berbeda untuk "form_build_id."

pengguna1359
sumber

Jawaban:

8

Jika Anda ingin menambahkan formulir yang sama beberapa kali, Anda perlu menerapkan hook_forms () . Lihat node_forms () untuk contoh.

Ini memungkinkan untuk menggunakan form_id yang berbeda, yang semuanya mengarah ke fungsi pembuat form yang sama. Misalnya, Anda dapat menggunakan yourmodule_some_form_$idan kemudian menggunakan hook_forms () untuk mengarahkannya yourmodule_some_form.

Lihat http://www.mohitsharma.net/content/how-show-same-form-multiple-time-page untuk contoh

Berdir
sumber
1
OP berbicara tentang menggunakan dua formulir pada halaman yang sama; menggunakan hook_forms()tidak secara otomatis menyelesaikan ini. Jika Anda sederhana menggunakan formulir yang sama dua kali di halaman yang sama, Anda masih memiliki masalah dengan bidang formulir yang sama diulang dua kali.
kiamlaluno
Tidak yakin apakah saya mengikuti Anda. Tidak yakin tentang 6.x saat ini, tetapi saat ini Drupal 7 memastikan bahwa tidak ada duplikat id, jadi seharusnya tidak ada masalah ketika memiliki bidang formulir yang sama beberapa kali di halaman yang sama?
Berdir
hook_forms()tidak digunakan untuk memiliki dua formulir dengan bidang formulir yang sama di halaman yang sama; digunakan untuk memungkinkan memiliki pembangun formulir tunggal untuk ID formulir yang berbeda.
kiamlaluno
Anda dapat menggunakan hook_forms () untuk hal ini. Lihat misalnya mohitsharma.net/content/how-show-same-form-multiple-time-page
Berdir
Contoh yang diberikan dalam artikel itu tidak praktis; formulir bahkan tidak memiliki tombol pengiriman, dan untuk formulir seperti itu saya tidak akan menggunakan hook_forms(). OP kemudian mengubah salah satu dari dua bentuk.
kiamlaluno
-1

Anda dapat memiliki lebih dari satu formulir di halaman yang sama; lihat apa yang dilakukan oleh node_admin_content () , yang menggunakan kode berikut:

function node_admin_content($form_state) {
  if (isset($form_state['values']['operation']) && $form_state['values']['operation'] == 'delete') {
    return node_multiple_delete_confirm($form_state, array_filter($form_state['values']['nodes']));
  }
  $form = node_filter_form();

  $form['#theme'] = 'node_filter_form';
  $form['admin']  = node_admin_nodes();

  return $form;
}

Meninggalkan pernyataan IF pertama, fungsi ini menambahkan dua bentuk berbeda yang memiliki penangan pengajuan mereka sendiri.

Masalahnya adalah dengan bidang formulir yang diulang dua kali. Struktur array berikut akan membuat masalah ketika array bentuk diratakan, karena akan ada dua bidang "kupon".

$form['first form']['coupon'] = array(
  '#type' => 'textfield', 
  '#title' => t('Coupon'), 
  '#default_value' => variable_get('mymodule_coupon'), 
  '#size' => 60, 
  '#maxlength' => 128, 
  '#required' => TRUE,
);

$form['second form']['coupon'] = array(
  '#type' => 'textfield', 
  '#title' => t('Coupon'), 
  '#default_value' => variable_get('mymodule_coupon'), 
  '#size' => 60, 
  '#maxlength' => 128, 
  '#required' => TRUE,
);

Tanpa melihat kode yang digunakan, saya dapat berpikir bahwa menggunakan panggilan balik halaman yang memanggil drupal_get_form () mungkin merupakan cara yang lebih mudah, dalam kasus Anda.

$output = drupal_get_form("form identifier") . drupal_get_form("form identifier");

Saya mencoba menggunakan kode berikut di Drupal 6.

module_load_include('inc', 'path', 'path.admin');
$output = drupal_get_form('path_admin_form') . drupal_get_form('path_admin_form');

Konten $outputuntuk dua formulir adalah yang berikut (saya menghapus output untuk bidang formulir tunggal).

<form action="/dr61/devel/php"  accept-charset="UTF-8" method="post" id="path-admin-form-1">
<div><div class="form-item" id="edit-language-1-wrapper">

<input type="submit" name="op" id="edit-submit" value="Create new alias"  class="form-submit" />
<input type="hidden" name="form_build_id" id="form-4eb9304baac34f292901ca23d925ff03" value="form-4eb9304baac34f292901ca23d925ff03"  />
<input type="hidden" name="form_token" id="edit-path-admin-form-form-token" value="cd429a06b84e381eb82ef04cd5033eeb"  />
<input type="hidden" name="form_id" id="edit-path-admin-form" value="path_admin_form"  />
<form action="/dr61/devel/php"  accept-charset="UTF-8" method="post" id="path-admin-form-1">
<div><div class="form-item" id="edit-language-1-wrapper">

<input type="submit" name="op" id="edit-submit-1" value="Create new alias"  class="form-submit" />
<input type="hidden" name="form_build_id" id="form-fb363c7ca6d88f71d98e86f8a69b0379" value="form-fb363c7ca6d88f71d98e86f8a69b0379"  />
<input type="hidden" name="form_token" id="edit-path-admin-form-form-token-1" value="cd429a06b84e381eb82ef04cd5033eeb"  />
<input type="hidden" name="form_id" id="edit-path-admin-form-1" value="path_admin_form"  />

Tidak ada konflik antara ID HTML yang ditetapkan ke bidang formulir yang sama, dan nilai untuk "form_build_id" (atau "form_token") berbeda dalam dua bentuk.

Implementasi yang hook_form_alter()digunakan untuk mengubah formulir harus dapat memahami dalam hal mana untuk mengubah formulir, atau kedua formulir akan menampilkan bidang yang sama.

Dari sudut pandang pengalaman pengguna, saya tidak yakin menunjukkan dua bentuk berbeda dengan tombol pengiriman mereka sendiri adalah cara terbaik untuk melakukan apa yang ingin Anda capai.
Saya akan berpikir bahwa menggunakan formulir yang memperlihatkan bidang berbeda berdasarkan pada nilai yang ditetapkan untuk bidang lain akan lebih baik. Misalnya, formulir dapat memiliki pemilih untuk jenis kupon, dan akan menampilkan bidang formulir yang berbeda berdasarkan jenis kupon yang dipilih.

kiamlaluno
sumber
Tidak sesederhana itu ketika Anda ingin menggunakan kembali formulir yang sama .
Berdir