¿Cómo puedo paginar millones y millones de registros con jQuery DataTables?

jQuery DataTables es un plugin fenomenal que sirve, entre otras cosas, para dotar de un plumazo a nuestras tablas HTML de funcionalidad tal como la ordenación de registros, la búsqueda de cosas y la paginación.

Muchas personas

La gracia que tiene es que, a diferencia de otras soluciones que delegan todas estas cosas en el servidor, jQuery DataTables las programa en el lado del cliente.

Como siempre en estos casos, amig@s, podéis echar un vistazo a la documentación oficial de DataTables para ver en detalle el funcionamiento de este plugin.

¿Sirve la paginación de DataTables para tablas con cientos de miles de registros? ¡Pues claro que sí!

Con DataTables podemos paginar cientos de miles de registros mediante AJAX, estableciendio diálogos JSON con el servidor cada vez que hay que refrescar la tabla con datos nuevos. Si no sabes qué es JSON, por cierto, puedes pinchar aquí.

Vamos a empezar definiendo el esqueleto de una tabla HTML:

<table style="width:100%" id="usersTable"> 
    <thead>
        <tr>
            <th>Id</th>
            <th>Nombre</th>
            <th>Email</th>         
        </tr>
    </thead>     
    <tbody></tbody>     
</table>

A continuación hay que inicializar el comportamiento que quieres que tenga tu tabla DataTables, la fuente de datos AJAX y el método HTTP 1.1 que deseas utilizar para transportar los datos:

$(function() { 
    $('#usersTable').dataTable({ 
        "iDisplayLength": 25,
        "aLengthMenu": [25, 50],
        "sPaginationType": "full_numbers",
        "bProcessing": true,
        "bServerSide": true,
        "sAjaxSource": "http://<?php echo $appIni['general']['base_url']; ?>/users/paginate",
        "sServerMethod": "POST",
        "bJQueryUI": true,
        "bPaginate": true,
        "bSort": false     
    }); 
    // ... 
});

Ya para acabar, sólo falta definir el programa PHP que responde en JSON al cliente. El siguiente ejemplo está basado en Zend Framework:

...

public function paginateAction() {
    $nTotal = $this->users->countAll();
    $users = $this->users->paginateUsers(
        $_POST['iDisplayLength'], 
        $_POST['iDisplayStart']
    );
    $aaData = array();

    foreach($users as $row) {         
        $aaData[] = array(                  
            $row['id'],
            $row['name'],
            $row['email']                           
        );             
    }   

    $aa = array(
        'sEcho' => $_POST['sEcho'],
        'iTotalRecords' => $nTotal,
        'iTotalDisplayRecords' => $nTotal,
        'aaData' => $aaData
    );

    print_r(json_encode($aa));

    exit;
}
...

Si quieres puedes echar un vistazo a la documentación oficial que trata la paginación AJAX con jQuery DataTables.