Estou com um problema no qual um usuário pode enviar qualquer formulário criado pela API do formulário várias vezes (clique rápido resultando em várias solicitações).
Eu coloquei a solução básica do cliente (javascript) para desativar o botão, mas estou curioso para saber qual é a melhor abordagem para evitar essa situação no lado do servidor.
Existe uma maneira recomendada de usar o sistema de token de formulário do Drupal para lidar com isso? Especialmente uma solução global de formulários (por exemplo, adicionando um validador personalizado a todos os formulários usando hook_form_alter ()).
Minha abordagem até agora tem sido algo assim:
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;
}
}
Estou com problemas em que o form_token não é exclusivo do formulário - parece permanecer o mesmo, aconteça o que acontecer. Provavelmente estou entendendo mal qual é o token no grande esquema da API de formulário.
Qualquer insight é apreciado!
Respostas:
Eu tive exatamente o mesmo problema e consegui corrigi-lo usando os mecanismos de bloqueio do Drupal
Na função validate, usei:
E na função de envio, soltei o bloqueio:
fonte
Aqui você deve considerar o peso do módulo:
fonte
Se você deseja essa funcionalidade em todos os formulários e mais controle sem codificação, dê uma olhada no módulo Hide Submit Button .
fonte
espero que isso ajude ..
ou você pode consultar Impedindo vários cliques no botão enviar e o drupal possui um módulo Ocultar botão enviar
fonte
Este foi o meu problema também antes. Minha solução para isso é desativar o botão via JS.
.módulo:
JS:
fonte