In this PHP Codeigniter tutorial, I will let you know how to implement load more feature or you can say infinite scroll in Codeignite app.
In the web development, Sometime we need to show the page numbers with navigation link for pagination to load paginated records and sometime we need to load data on page scrolling without refreshing the whole page.
Infinite Scroll is the most user-friendly feature to add pagination in the data list.
Infinite scroll pagination replace the old pagination UI (conventional pagination) because when user clicks on the page number and navigate to next page then it reloads all the elements again in the page and this costs the bandwidth mainly when user browsing something in a mobile with limited data plan.
I will assume that you have downloaded fresh version of Codeigniter 3 to test this example.
Step 1: Database configurationIn the first step, I will create a new database for this example called tutorials
and create new table posts
in this tutorials database.
CREATE TABLE `posts` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `description` text NOT NULL, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
Now I have to modify the database configuration file with updated details in the Codeigniter application.
application/config/database.php<?php defined('BASEPATH') OR exit('No direct script access allowed'); $active_group = 'default'; $query_builder = TRUE; $db['default'] = array( 'dsn' => '', 'hostname' => 'localhost', 'username' => 'root', 'password' => '', 'database' => 'tutorials', 'dbdriver' => 'mysqli', 'dbprefix' => '', 'pconnect' => FALSE, 'db_debug' => (ENVIRONMENT !== 'production'), 'cache_on' => FALSE, 'cachedir' => '', 'char_set' => 'utf8', 'dbcollat' => 'utf8_general_ci', 'swap_pre' => '', 'encrypt' => FALSE, 'compress' => FALSE, 'stricton' => FALSE, 'failover' => array(), 'save_queries' => TRUE );
In this step, I will add one route in the route file to manage infinite scroll on data list.
application/config/routes.php<?php defined('BASEPATH') OR exit('No direct script access allowed'); $route['default_controller'] = 'welcome'; $route['404_override'] = ''; $route['translate_uri_dashes'] = FALSE; $route['post'] = 'PostController';
In this step, I will create a controller "PostController" to manage post data with index method.
application/controllers/PostController.php<?php defined('BASEPATH') OR exit('No direct script access allowed'); class PostController extends CI_Controller { private $perPage = 10; public function index() { $this->load->database(); $count = $this->db->get('posts')->num_rows(); if(!empty($this->input->get("page"))){ $start = $this->input->get("page") * $this->perPage; $query = $this->db->limit($start, $this->perPage)->get("posts"); $data['posts'] = $query->result(); $data['count']=$count; $result = $this->load->view('ajax_post', $data); echo json_encode($result); }else{ $query = $this->db->limit($this->perPage,0)->get("posts"); $data['posts'] = $query->result(); $data['count']=$count; $this->load->view('post', $data); } } }
In this step, I will create here two files, first one for the normal page load view with ajax query and another for ajax page load view.
application/views/post.php<!DOCTYPE html> <html> <head> <title>PHP Codeigniter load more data on page scroll</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> </head> <body> <div class="container"> <h2 class="text-center">PHP Codeigniter 3 - load more data with infinite scroll pagination</h2> <br/> <div class="col-md-12" id="ajax-post-container"> <?php $this->load->view('ajax_post', $posts); ?> </div> </div> <div class="loader" style="display:none"> <img src="<?php print base_url('loader.gif')?>"> </div> <script type="text/javascript"> var page = 1; var total_pages = <?php print $count?>; $(window).scroll(function() { if($(window).scrollTop() + $(window).height() >= $(document).height()) { page++; if(page < total_pages) { loadMore(page); } } }); function loadMore(page){ $.ajax( { url: '?page=' + page, type: "GET", beforeSend: function() { $('.loader').show(); } }) .done(function(data) { $('.loader').hide(); $("#ajax-post-container").append(data); }); } </script> </body> </html>
<?php foreach($posts as $post){ ?> <div> <h3><a href=""><?php echo $post->title ?></a></h3> <p><?php echo $post->description ?></p> </div> <?php } ?>