Я сталкиваюсь с проблемой, когда пользователь может отправить любую форму, созданную с помощью 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.
Любое понимание приветствуется!
Ответы:
У меня была точно такая же проблема, и мне удалось исправить ее с помощью механизмов блокировки от Drupal
В функции проверки я использовал:
И в функции отправки я снял блокировку:
источник
Здесь вы должны учитывать вес модуля:
источник
Если вы хотите эту функциональность во всех формах и больше контроля без кодирования, взгляните на модуль Hide Submit Button .
источник
надеюсь, это поможет ..
или вы можете сослаться Предотвращение нескольких нажатий кнопки отправки, а у drupal есть один модуль Скрыть кнопку отправки
источник
Это было моей проблемой и раньше. Мое решение этого состоит в том, чтобы отключить кнопку через JS.
.module:
JS:
источник