これまでのところ、いくつかのフィールドを持つフォームを作成するカスタムモジュールがあります。私のページの1つで、このフォームを2回(異なるブロック)印刷すると、フォームは同じ「form_id」を取得するため、いずれかを送信してエラーが発生すると、両方でエラーが強調表示され、フィールドに入力されます。送信したフォームだけでエラーが発生するようにしたいのですが、これを行う方法はありますか?
ありがとう!!
これまでのところ、いくつかのフィールドを持つフォームを作成するカスタムモジュールがあります。私のページの1つで、このフォームを2回(異なるブロック)印刷すると、フォームは同じ「form_id」を取得するため、いずれかを送信してエラーが発生すると、両方でエラーが強調表示され、フィールドに入力されます。送信したフォームだけでエラーが発生するようにしたいのですが、これを行う方法はありますか?
ありがとう!!
興味のある人は、これを行うためにhook_formsを使用する必要があります。このフックは、drupal_get_formに渡されたform_idが存在しない場合にのみ呼び出されます。これを使用する場合は、次のように、呼び出しで存在しないform_idを使用するようにしてください。
//Defining the form:
function mx_wtransnet_form_contacto($form, &$form_state, $block = null, $formType = null) {
}
フォーム(mx_transnet_form_contacto)をロードする代わりに、このフォームを複数回使用してさまざまなエラーハンドラーを取得したいので、存在しないフォームを呼び出します。
$form = drupal_get_form("mx_wtransnet_form_contacto_invalid", "contacto-mini");
次に、フックを作成します。
function mx_wtransnet_forms($form_id, $args) {
$forms = array();
if (strpos($form_id, '_contacto_') !==false) {
$forms[$form_id] = array(
'callback' => 'mx_wtransnet_form_contacto',
);
}
return $forms;
}
この関数は、存在しないすべてのdruapl_get_form呼び出しをキャッチするので、それらを処理/指示できます。私の例では、form_idにcontactoが含まれていることを確認してから、このフォームのコールバックを元の関数に設定します。
この場合、「form_id」が異なるが同じ送信ハンドラーを使用して別のフォームを作成することをお勧めします。
別のケース:ページに同じフォームを2回出力すると、フォーム要素のIDが同じであるため、JSエラーが発生する場合もあります。
フォームコードとその送信ハンドラー(DRY原則)を繰り返さない場合は、フォーム配列を持つカスタム関数を作成することをお勧めします
function form_my_custom($form_id){
$form['my_first_field'] = array();
$form['my_second_field'] = array();
$form['#attributes']['id'] = $form_id;
$form['my_submit_button'] = array(
'#submit' => array('my_custom_form_submit')
);
return $form;
}
function my_block1_form(){
return my_custom_form('my_form_id_1');
}
function my_block2_form(){
return my_custom_form('my_form_id_2');
}
function my_custom_form_submit(&$form, &$form_state){
// your submit handler.
}