Nhiều hình thức trên một trang?


8

Có thể đặt nhiều hình thức trên một trang không?

Tôi đang cố gắng để làm cho một trang cung cấp phiếu giảm giá. Tôi muốn có hai hình thức cho hai đề nghị khác nhau ở mỗi bên của một trang. Mỗi biểu mẫu có một trường văn bản cho mã phiếu giảm giá và nút gửi riêng. Các hình thức đầu tiên hoạt động ổn; tuy nhiên, các giá trị ẩn của biểu mẫu thứ hai dường như bị ghi đè bởi biểu mẫu thứ nhất.

Tôi đang sử dụng hook_alter để thay đổi hình thức thứ hai để làm cho nó khác đi, nhưng nó vẫn có cùng form_id như hình thức đầu tiên. Đây có phải là những gì gây ra vấn đề của tôi, hoặc tôi cần phải nhìn / suy nghĩ ở một nơi khác?

Hai biểu mẫu có cùng giá trị cho "form_id" và "form_token", nhưng các giá trị khác nhau cho "form_build_id."

Câu trả lời:


8

Nếu bạn muốn thêm cùng một hình thức nhiều lần, bạn cần triển khai hook_forms () . Xem node_forms () để biết ví dụ.

Điều này cho phép sử dụng các form_id khác nhau, tất cả đều trỏ đến cùng một hàm xây dựng biểu mẫu. Ví dụ: bạn có thể sử dụng yourmodule_some_form_$ivà sau đó sử dụng hook_forms () để trỏ chúng tới yourmodule_some_form.

Xem http://www.mohitsharma.net/content/how-show-same-form-mult Môn-time-page để biết ví dụ


1
OP đang nói về việc sử dụng hai hình thức trên cùng một trang; sử dụng hook_forms()không tự động giải quyết điều này. Nếu bạn đơn giản sử dụng cùng một biểu mẫu hai lần trên cùng một trang, bạn vẫn gặp vấn đề về việc có cùng một trường biểu mẫu lặp lại hai lần.
kiamlaluno

Không chắc chắn nếu tôi theo bạn. Không chắc chắn về 6.x ngay bây giờ, nhưng tại Drupal 7, chắc chắn rằng không có id trùng lặp, vì vậy không có vấn đề gì khi có cùng một trường mẫu nhiều lần trên cùng một trang?
Berdir

hook_forms()không được sử dụng để có hai biểu mẫu có cùng trường biểu mẫu trong cùng một trang; nó được sử dụng để cho phép có một trình tạo biểu mẫu duy nhất cho các ID biểu mẫu khác nhau.
kiamlaluno

Bạn có thể sử dụng hook_forms () cho chính xác điều này. Xem ví dụ mohitsharma.net/content/how-show-same-form-mult Môn
time

Ví dụ được đưa ra trong bài viết đó là không thực tế; biểu mẫu thậm chí không có nút gửi và đối với biểu mẫu đó tôi sẽ không sử dụng hook_forms(). OP sau đó đang thay đổi một trong hai hình thức.
kiamlaluno

-1

Bạn có thể có nhiều hơn một hình thức trong cùng một trang; xem những gì được thực hiện bởi node_admin_content () , sử dụng đoạn mã sau:

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;
}

Thoát khỏi câu lệnh IF đầu tiên, hàm đang thêm hai biểu mẫu khác nhau có trình xử lý đệ trình riêng.

Vấn đề là với các trường mẫu được lặp lại hai lần. Cấu trúc mảng sau sẽ tạo ra vấn đề khi mảng biểu mẫu được làm phẳng, vì sẽ có hai trường "phiếu giảm giá".

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

Không thấy mã được sử dụng, tôi có thể nghĩ rằng sử dụng một cuộc gọi lại trang gọi drupal_get_form () có lẽ là cách dễ dàng hơn, trong trường hợp của bạn.

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

Tôi đã thử sử dụng đoạn mã sau trong Drupal 6.

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

Nội dung của $outputhai mẫu là mẫu sau (Tôi đã loại bỏ đầu ra cho các trường mẫu đơn).

<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"  />

Không có xung đột giữa ID HTML được gán cho cùng một trường biểu mẫu và giá trị cho "form_build_id" (hoặc "form_token") khác nhau ở hai biểu mẫu.

Việc triển khai hook_form_alter()được sử dụng để thay đổi biểu mẫu sẽ có thể hiểu trong trường hợp nào cần thay đổi biểu mẫu hoặc cả hai biểu mẫu sẽ hiển thị cùng các trường.

Từ quan điểm của trải nghiệm người dùng, tôi không chắc chắn rằng hiển thị hai hình thức khác nhau bằng các nút gửi riêng là cách tốt nhất để làm những gì bạn đang cố gắng đạt được.
Tôi nghĩ rằng sử dụng một biểu mẫu hiển thị các trường khác nhau dựa trên các giá trị được đặt cho các trường khác sẽ tốt hơn. Ví dụ: biểu mẫu có thể có bộ chọn cho loại phiếu giảm giá và sẽ hiển thị các trường biểu mẫu khác nhau dựa trên loại phiếu được chọn.


Điều đó không đơn giản khi bạn muốn sử dụng lại cùng một hình thức.
Berdir
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.