ユーザーがForm APIによって作成されたフォームを複数回送信できるという問題が発生しています(高速クリックすると複数のリクエストが発生します)。
ボタンを無効にする基本的なクライアントサイド(JavaScript)ソリューションを導入しましたが、この状況を防ぐ最善の方法はサーバーサイドにあるのかどうか知りたいです。
Drupalのフォームトークンシステムを使用してこれを処理するための推奨される方法はありますか?特にグローバルフォームソリューション(つまり、hook_form_alter()を使用してすべてのフォームにカスタムバリデーターを追加する)。
これまでの私のアプローチは次のようなものでした:
function mymodule_form_alter(&$form, &$form_state, $form_id) {
$form['#validate'][] = 'mymodule_form_validate';
}
function mymodule_form_validate(&$form, &$form_state){
//initialize form array
if (!isset($_SESSION['submitted_forms'])){
$_SESSION['submitted_forms'] = array();
}
$form_token = $form_state['values']['form_token'];
if ( isset($_SESSION['submitted_forms'][$form_token]) && $_SESSION['submitted_forms'][$form_token] = TRUE ){
form_set_error('name]', 'This form has already been submitted');
}
else{
$_SESSION['submitted_forms'][$form_token] = TRUE;
}
}
form_tokenがフォームに固有ではないという問題が発生しています。何が起こっても同じままであるようです。フォームapiのグランドスキームのトークンが何であるか私はおそらく誤解しているでしょう。
どんな洞察も感謝しています!