Me encuentro con un problema en el que un usuario puede enviar cualquier formulario creado por la API del formulario varias veces (hacer clic rápidamente dando como resultado múltiples solicitudes).
He puesto la solución básica del lado del cliente (javascript) de deshabilitar el botón, pero tengo curiosidad por saber cuál es el mejor enfoque para prevenir esta situación en el lado del servidor.
¿Hay alguna forma recomendada de usar el sistema de token de formulario de Drupal para manejar esto? Especialmente una solución de formulario global (es decir, agregar un validador personalizado a cada formulario usando hook_form_alter ()).
Mi enfoque hasta ahora ha sido algo como esto:
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;
}
}
Me encuentro con problemas donde el form_token no es exclusivo del formulario, parece que permanece igual pase lo que pase. Probablemente estoy malinterpretando cuál es el token en el gran esquema de la API de formulario.
Cualquier idea es apreciada!
Respuestas:
Tuve exactamente el mismo problema y logré solucionarlo usando los mecanismos de bloqueo de Drupal
En la función de validación que utilicé:
Y en la función de envío, liberé el bloqueo:
fuente
Aquí debe considerar el peso del módulo:
fuente
Si desea esta funcionalidad en todos los formularios y más control sin codificación, eche un vistazo al módulo Ocultar botón de envío .
fuente
Espero que esto ayude.
o puede referirse Evitar múltiples clics del botón Enviar y Drupal tiene un módulo Ocultar botón Enviar
fuente
Este era mi problema también antes. Mi solución a esto es desactivar el botón a través de JS.
.módulo:
JS:
fuente