Concettualmente puoi risolvere in altro modo, più "elegante"....
Usi ajax per fare la richiesta di aggiornamento dei dati a seguito di ricerca e ricarichi la tabella coi nuovi dati.
La tabella la costruisci usando la jquery.datatable (una classe che trovi facilmente con Google. Lavora in javascript ma è molto potente e customizzabile).Ti crei uno scrippettino per rendere DataTable la tabella, l'importante è che ci sia qualcosa di questo genere
codice:
function do_data_table(id_tabella, sorting, section, data_type, filter, total) {
if (sorting == undefined) {
sort_order = [ [ 1, "desc" ] ];
} else {
sort_order = sorting;
}
if (data_type == undefined) {
dataTypes = [];
} else {
dataTypes = data_type;
}
if (total == undefined) {
total = 10;
}
data_table_rendered = $("#" + id_tabella).DataTable(
{
bJQueryUI : false,
sPaginationType : "full_numbers",
aoColumnDefs : dataTypes,
iTotalRecords : total,
iTotalDisplayRecords : total,
scrollX : true,
bPaginate : true,
bProcessing : true,
bDeferRender : true,
aaSorting : sort_order,
bServerSide : true,
sServerMethod : "POST",
ajax : {
url : "/ajax_requests/ajax_" + section + "/get_" + section
+ "_tabella" + "/" + filter,
dataType : 'json',
type : "POST",
data : function(d) {
d.filtro_utente = $('#filtro_utente').val();
}
},
oLanguage : {
sUrl : "/assets/js/dataTable/translate/italian.txt"
}
});
}
Lato php/html (dipende se usi dei templates php o direttamente codice html) avrai quindi qualcosa del genere
codice:
do_data_table('tabella_utenti', [[ 1, 'desc' ]], 'utenti', [ { 'sType': 'date', 'aTargets': [ 6, 7, 8 ] }, { 'sType': 'numeric', aTargets: [ 1, 4 ] }, { 'sClass': 'dt-body-right', 'aTargets': [ 4 ] }, { 'aTargets': [ 0, 5, 9 ], 'bSortable': false, 'bSearchable': false }, { 'visible': false, 'targets': 10 } ], null, 1 );
Nella documentazione di DataTable trovi tutte le indicazioni per i parametri sType, aTargets ecc.
Quando il form viene inviato (in realtà non è un form, sarà la DataTable a fare il trigger), chiamerà la pagina
/ajax_requests/ajax_" + section + "/get_" + section + "_tabella" + "/" + filter
ovvero
/ajax_requests/ajax_utenti/get_utenti_tabella
e in post avrai il valore del campo con ID filtro_utente.
La paginetta ajax_utenti sarà qualcosa del tipo
codice:
public function __construct( ) {
parent::__construct();
// Carico il model
$this->load->model( "utenti/utenti_model" );
$this->corrispondenza_nomi_colonne = array (
0 => "ID",
1 => "Nome",
2 => "Cognome",
3 => "Abbonamento",
);
}
public function get_utenti_tabella( ) {
$filtro = array ();
$post_dati = $_POST;
$sorting = $this->corrispondenza_nomi_colonne [$post_dati ["order"] [0] ["column"]];
$sorting_dir = $post_dati ["order"] [0] ["dir"];
$search = $post_dati ["search"] ["value"]; i
f (trim( $sorting ) != "") {
$this->model->set_order_by( "`{$sorting}` {$sorting_dir}" );
}
// Qui faccio eventuale filtro di ricerca, così mi torna bello
if (trim( $search ) != "" and strlen( trim( $search ) ) > 3) {
$filtro ["ricerca"] = trim( $search );
};
$records = $this->model->get_record( $filtro, "utenti", $post_dati ["start"], $post_dati ["length"] );
$total_records = $this->model->get_record( $filtro, "utenti", 0, 999999, true ) [0]->totale;
// Elaboro il risultato per costruire la risposta alla data table
$result = new stdClass();
$result->sEcho = $post_dati ["draw"];
$result->iTotalRecords = $total_records;
if (isset( $filtro ["ricerca"] )) {
$result->iTotalDisplayRecords = sizeof( $records );
} else {
$result->iTotalDisplayRecords = $total_records;
};
$result->aaData = array ();
$progressivo = 0;
foreach ( $records as $riga ) {
$result->aaData [] = array (
0 => "<div title=\"Seleziona\" alt=\"Seleziona\"><input name=\"check_gruppo\" id=\"check_utente\" value=\"{$riga->ID}\" type=\"checkbox\" rel=\"id_utente_{$riga-ID}\"></div>",
1 => "<div title=\"Nome\" alt=\"Nome\">{$riga->Nome}</div>",
......
);
}
$coded = json_encode( $result );
print $coded;
}
Studiati un attimo il codice e la documentazione di DataTable, vedrai che è molto interessante come soluzione
(perdona la formattazione del codice php ma l'editor non me la mantiene....)