
Originariamente inviata da
KillerWorm
Ho dato uno sguardo
Prima cosa: non tenere conto di quanto ho indicato nei post precedenti. Non conoscendo il plugin ho scritto qualche castroneria facendo supposizioni errate
In realtà la tabella viene aggiornata regolarmente quando manovri i checkbox. Gli elementi che sono mostrati a video sono esattamente parte di quelli che stanno dentro l'istanza dataTable.
Il problema sta in quel ciclo del submit, come avevi immaginato tu.
Analizzando meglio ciò che va a fare quello script, si può rilevare un problemi di logica.
Traducendo lo script in umanese:
- Ciclo tutti i checkbox
- Considero solo quelli che NON sono già mostrati sulla pagina (dal momento che quelli visibili sulla pagina sono già considerati come dati da inviare col form)
- Per ognuno di quelli non mostrati, verifico se è selezionato
- Se lo è, allora creo una sua copia hidden nel form (così che sia considerato come dato del form)
-
Se non lo è, allora rimuovo dalla pagina TUTTI gli hidden
Puoi capire quindi che quest'ultima azione, se l'ultimo box esaminato NON risulta selezionato, va a rimuovere comunque TUTTI gli hidden appena creati dal ciclo stesso.
Ora, nel caso in cui si usa la funzione "seleziona tutto", l'ultimo checkbox nella tabella risulterà selezionato, e per tale motivo non avverrà quell'ultima azione.
Invece, selezionando qualche checkbox in una singola pagina della tabella, questi saranno comunque considerati perché sono già presenti nel form; non le copie hidden che invece verrebbero erroneamente rimosse.
Spero di aver chiarito la causa del problema, o quantomeno di non averti creato maggiore confusione
Per risolvere, basterà spostare quell'azione prima che sia eseguito il ciclo; per cui, tutti gli hidden del form sono rimossi preventivamente, quindi sono ricreati, attraverso il ciclo, solo quelli relativi ai ceckbox selezionati e non presenti già nel DOM.
Potrebbe essere una cosa del genere:
codice:
$('form').on('submit', function(e){
var $form = $(this);
// Rimuovo TUTTI gli input hidden del form
$form.find("input[type='hidden']").remove();
// Ciclo SOLO i checkbox selezionati della tabella
table.$('input:checked').each(function(){
// Se questo checkbox non è già nel DOM
if (!$.contains(document, this)){
// Creo la copia hidden
$form.append(
$('<input>')
.attr('type', 'hidden')
.attr('name', this.name)
.val(this.value)
);
}
});
});
Ultima considerazione: dal momento che al submit vengono considerati i checkbox visibili sulla pagina (che siano checked oppure no), mentre gli hidden non posseggono la proprietà "checked", lato server dovrai fare attenzione a come valutare questi elementi; cioè dovrai prendere in considerazione tutti gli hidden come fossero dei
checkbox checked, mentre i checkbox (che sono quelli restati visibili nella pagina) vanno verificati considerando solo i
checked. Presumo tu abbia già considerato questo, in quanto valeva anche nel caso del "seleziona tutto".
Fai sapere.