In PHP è semplice interagire con jQuery per implementare l'infinite scroll.
Possiamo implementare la seguente soluzione:
class Ajax {
public function infiniteScroll(Database $db) {
$total_posts = $db->select("SELECT count(*) AS total FROM posts");
$per_page = 10;
$pages = floor(intval($total_posts[0]['total'] ) / $per_page);
$current_page = (isset($_GET['page']) && ctype_digit($_GET['page']) && intval($_GET['page']) <= $pages) ? intval($_GET['page']) : 1;
$offset = $current_page * $per_page;
$query = "SELECT * FROM posts ORDER BY published DESC LIMIT $per_page OFFSET $offset";
$posts = $db->select($query);
$this->json($posts);
}
private function json($data) {
header('Content-Type: application/json');
echo json_encode($data);
exit;
}
}
Si tratta di una classica paginazione di dati in PHP. L'unica differenza è che il client via AJAX invia un numero progressivo che indica la pagina corrente che si vuole visualizzare. In pratica si tratta di incrementare un contatore memorizzando il risultato dell'incremento:
var getPosts = function( value ) {
value = parseInt( value, 10 ) || 1;
var perPage = 10;
var $posts = $( ".ajax-scroll .post" );
var current = $posts.length;
var page = value + 1; // Incremento
$.get( "/ajax/infiniteScroll", { page: page }, function( response ) {
if( Array.isArray( response ) && response.length > 0 ) {
var html = '';
for( var i = 0; i < response.length; i++ ) {
var post = response[i];
// Si costruisce l'output HTML
}
// Salvataggio della pagina corrente ed output HTML
$( ".ajax-scroll" ).data( "page", page ).append( html );
}
});
};
Si presuppone che i risultati vengano inseriti in un elemento contenitore con classe ajax-scroll. A questo punto il client collega la routine della funzione vista allo scrolling della pagina:
if( $( ".ajax-scroll" ).length && $( ".ajax-scroll .post" ).length ) {
$( ".ajax-scroll" ).data( "page", 1 ); // Si parte da pagina 1, ossia dai post già presenti
$( window ).scroll(function() {
if( $( window ).scrollTop() + $( window ).height() >= $( document ).height() ) {
getProducts( $( ".ajax-scroll" ).data( "page" ) );
}
});
}
Il metodo Ajax::infiniteScroll()
è stato volutamente riproposto nell'URL della richiesta AJAX, in modo che se si utilizza il pattern MVC l'utilizzo è pressoché immediato.