0

これまでのところ、いくつかのフィールドを持つフォームを作成するカスタムモジュールがあります。私のページの1つで、このフォームを2回(異なるブロック)印刷すると、フォームは同じ「form_id」を取得するため、いずれかを送信してエラーが発生すると、両方でエラーが強調表示され、フィールドに入力されます。送信したフォームだけでエラーが発生するようにしたいのですが、これを行う方法はありますか?

ありがとう!!

4

3 に答える 3

1

興味のある人は、これを行うために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が含まれていることを確認してから、このフォームのコールバックを元の関数に設定します。

于 2013-03-20T11:57:36.067 に答える
0

この場合、「form_id」が異なるが同じ送信ハンドラーを使用して別のフォームを作成することをお勧めします。

別のケース:ページに同じフォームを2回出力すると、フォーム要素のIDが同じであるため、JSエラーが発生する場合もあります。

于 2013-03-20T04:44:40.023 に答える
0

フォームコードとその送信ハンドラー(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. 
}  
于 2013-03-21T21:21:29.893 に答える