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!
Odpowiedzi:
Miałem dokładnie ten sam problem i udało mi się go naprawić za pomocą mechanizmów blokujących Drupala
W funkcji sprawdzania poprawności użyłem:
W funkcji przesyłania zwolniłem blokadę:
źródło
Tutaj powinieneś wziąć pod uwagę wagę modułu:
źródło
Jeśli chcesz tę funkcjonalność we wszystkich formularzach i większą kontrolę bez kodowania, zajrzyj do modułu Ukryj przycisk wysyłania.
źródło
mam nadzieję, że to pomoże ..
lub możesz polecić Zapobieganie wielokrotnym kliknięciom przycisku wysyłania, a drupal ma jeden moduł Ukryj przycisk wysyłania
źródło
To był mój problem także wcześniej. Moim rozwiązaniem jest wyłączenie przycisku za pomocą JS.
.moduł:
JS:
źródło