Drupal non sembra impedire l'invio di più moduli, anche sulle pagine dei nodi. Questo QA suggerisce di risolverlo sul lato server.
Come posso disabilitare il pulsante di invio dopo aver fatto clic?
Qualche altra soluzione?
Drupal non sembra impedire l'invio di più moduli, anche sulle pagine dei nodi. Questo QA suggerisce di risolverlo sul lato server.
Come posso disabilitare il pulsante di invio dopo aver fatto clic?
Qualche altra soluzione?
Risposte:
È solo in sviluppo ma il modulo Nascondi invio farebbe il trucco. Una delle caratteristiche è:
Nasconde (o disabilita) il pulsante di invio dopo aver fatto clic
L'ho appena installato su un sito di sviluppo e sembra funzionare bene per i moduli di aggiunta dei nodi; quando fai clic sul pulsante di invio, viene nascosto e sostituito con un'immagine di caricamento e un messaggio "Please wait ...", prima che il modulo venga infine inviato. Non l'ho provato su nessun'altra forma però.
hook_form_alter()
- se lo sta usando hook_form_FORMID_alter()
, passa a generico hook_form_alter()
. Se è generico hook_form_alter()
con if dentro, aggiungine un po or
'in questo if
.
Ecco la soluzione per Drupal 7. Il codice è la versione semplificata del modulo Nascondi invio.
Questo codice funziona perfettamente anche con pulsanti "Aggiungi altro" e moduli AJAX.
Drupal.behaviors.hideSubmitButton = {
attach: function(context) {
$('form.node-form', context).once('hideSubmitButton', function () {
var $form = $(this);
$form.find('input.form-submit').click(function (e) {
var el = $(this);
el.after('<input type="hidden" name="' + el.attr('name') + '" value="' + el.attr('value') + '" />');
return true;
});
$form.submit(function (e) {
if (!e.isPropagationStopped()) {
$('input.form-submit', $(this)).attr('disabled', 'disabled');
return true;
}
});
});
}
};
Il modo più semplice è fare una soluzione javascript basata su temi per disabilitare il pulsante dopo l'invio del modulo. Nel file theme.info, inserisci il tuo file javascript in modo che possa essere caricato dal tema API.
scripts[] = js/themename-script.js
Ora nella themename-script.js aggiungi alla sezione Drupal.behaviors.themename per assomigliare al seguente:
Drupal.behaviors.themename = function()
{
$('.node-form').submit(function(){
$('#edit-submit').attr("disabled", "disabled");
$('#edit-preview').attr("disabled", "disabled");
});
}
Quindi il flusso è il seguente:
Sono sicuro che ci sia qualche elaborazione ajax che quanto sopra potrebbe essere pericoloso e l'invio del modulo non potrà mai essere eseguito di nuovo se viene rilevato un errore nella convalida form_api, quindi testalo e personalizzalo per soddisfare le tue esigenze. Ho disabilitato entrambi i pulsanti poiché era ancora possibile fare clic sul pulsante di anteprima mentre il pulsante di invio era disabilitato. Ovviamente il tuo chilometraggio può variare.
Drupal.behaviors
stile di dichiarazione; non funzionerà per Drupal 7. Dovrebbe esserlo Drupal.behaviors.themename = { attach: function (context, settings) { // ...
. Vedi Gestione di JavaScript in Drupal 7 per maggiori informazioni