1ページに複数のフォームがありますか?


8

1つのページに複数のフォームを配置することはできますか?

クーポン提供ページを作ろうとしています。ページの両側に2つの異なるオファーがある2つのフォームが必要でした。各フォームには、クーポンコードのテキストフィールドと独自の送信ボタンがあります。最初の形式は大丈夫です。ただし、2番目のフォームの非表示の値は、最初のフォームの値によってオーバーライドされるようです。

私はhook_alterを使用して2番目のフォームを変更して別のフォームにしていますが、最初のフォームと同じform_idを持っています。これが私の問題の原因ですか、それとも他の場所を調べたり考えたりする必要がありますか?

2つのフォームの「form_id」と「form_token」の値は同じですが、「form_build_id」の値は異なります。

回答:


8

同じフォームを複数回追加する場合は、hook_forms()を実装する必要があります。例については、node_forms()を参照してください。

これにより、異なるform_idを使用できます。これらはすべて同じフォームビルダー関数を指します。たとえば、yourmodule_some_form_$iこれらを使用するためにhook_forms()を使用してから使用できますyourmodule_some_form

例については、http://www.mohitsharma.net/content/how-show-same-form-multiple-time-pageを参照してください


1
OPは、同じページで2つのフォームを使用することについて話している。を使用hook_forms()しても、これは自動的には解決されません。同じページで同じフォームを2回単純に使用する場合でも、同じフォームフィールドが2回繰り返されるという問題があります。
kiamlaluno

私があなたをフォローしているかどうかわかりません。現在6.xについては不明ですが、少なくともDrupal 7では、重複するIDがないことが確認されているため、同じページに同じフォームフィールドが複数ある場合でも問題はありませんか?
Berdir 2011

hook_forms()同じページに同じフォームフィールドを持つ2つのフォームがある場合は使用されません。異なるフォームIDに対して単一のフォームビルダーを使用できるようにするために使用されます。
kiamlaluno

これには、hook_forms()を使用できます。たとえば、mohitsharma.net
content

この記事で示した例は実用的ではありません。フォームには送信ボタンさえありませんhook_forms()。そのようなフォームでは私は使用しません。その後、OPは2つの形式のいずれかを変更します。
kiamlaluno

-1

同じページに複数のフォームを含めることができます。次のコードを使用するnode_admin_content()によって何が行われるかを確認します。

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

最初のIFステートメントを省略して、関数は独自の送信ハンドラーを持つ2つの異なるフォームを追加しています。

問題は、フォームフィールドが2回繰り返されることです。次の配列構造は、2つの「クーポン」フィールドがあるため、フォーム配列をフラット化すると問題を引き起こします。

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

使用されているコードを確認しないと、drupal_get_form()を呼び出すページコールバックを使用する方が、おそらくあなたの場合はより簡単な方法だと思います。

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

Drupal 6で次のコードを使用してみました。

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

$output2つのフォームの内容は次のとおりです(単一のフォームフィールドの出力は削除しました)。

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

同じフォームフィールドに割り当てられたHTML ID間に矛盾はなく、 "form_build_id"(または "form_token")の値は2つのフォームで異なります。

hook_form_alter()フォームを変更するために使用されるの実装は、フォームを変更する場合を理解できる必要があります。そうでない場合、両方のフォームに同じフィールドが表示されます。

ユーザーエクスペリエンスの観点から、独自の送信ボタンを備えた2つの異なるフォームを表示することが、達成しようとしていることを行うための最良の方法であるかどうかはわかりません。
他のフィールドに設定された値に基づいて異なるフィールドを表示するフォームを使用する方が良いと思います。たとえば、フォームにはクーポンのタイプのセレクターがあり、選択したクーポンのタイプに基づいて異なるフォームフィールドが表示されます。


同じフォームを再利用するのは簡単ではありません。
Berdir
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.