Występuje problem polegający na tym, że użytkownik może wielokrotnie przesłać dowolny formularz zbudowany przez interfejs API formularza (szybkie kliknięcie powoduje powstanie wielu żądań).
Włączyłem podstawowe rozwiązanie polegające na wyłączeniu przycisku po stronie klienta (javascript), ale jestem ciekawy, jakie jest najlepsze podejście do zapobiegania tej sytuacji po stronie serwera.
Czy istnieje zalecany sposób użycia systemu tokenów formularzy Drupala do obsługi tego? Zwłaszcza globalne rozwiązanie formularza (tj. Dodanie niestandardowego walidatora do każdego formularza za pomocą hook_form_alter ()).
Moje podejście do tej pory było takie:
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;
}
}
Mam problem z tym, że form_token nie jest unikalny dla formularza - wydaje się, że pozostaje taki sam bez względu na to, co się stanie. Prawdopodobnie nie rozumiem, czym jest token w wielkim schemacie interfejsu API.
Doceniamy każdy wgląd!