Я сталкиваюсь с проблемой, когда пользователь может отправить любую форму, созданную с помощью 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.
Любое понимание приветствуется!