Make pagination with CodeIgniter Framework

Pagination on the page improves the user experience when there is a large number of records are available.

CodeIgniter has provided a library for effectively handle the pagination functionality.

In this tutorial, I am using the pagination library to create the paginated list of fetched result from MySQL database.

Make pagination with CodeIgniter Framework


Contents

  1. Table structure
  2. Configuration
  3. Model
  4. Controller
  5. View
  6. Conclusion

 

1. Table structure

I am using users table.

CREATE TABLE `users` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `username` varchar(80) NOT NULL,
  `name` varchar(80) NOT NULL,
  `email` varchar(80) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 

2. Configuration

Navigate to application/config/database.php and define Database connection.

$db['default'] = array(
 'dsn' => '',
 'hostname' => 'localhost',
 'username' => 'root', // Username
 'password' => '', // Password
 'database' => 'tutorial', // Database name
 '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
);

Default controller

Open application/config/routes.php and edit default_controller value to User.

$route['default_controller'] = 'User';

Load Database

To access the MySQL database require loading database library.

Open application/config/autoload.php and add the database in libraries array().

$autoload['libraries'] = array("database");

Remove index.php from URL

Navigate to application/config/config.php and replace $config['index'] = "index.php"; with $config["index"] = "";.

  • Create .htaccess file in your project root directory.
  • Write following code in it –
RewriteEngine On
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]

 

3. Model

Create application/models/User_model.php.

Create two function getData() and getrecordCount().

getData() – Fetch and return records from users table according to the $rowno and $rowperpage value.

getrecordCount() – Return total records in users table.

Completed Code

<?php 

if ( ! defined('BASEPATH')) exit('No direct script access allowed');
Class User_Model extends CI_Model {

 public function __construct() { 
   parent::__construct();  
 }

 // Fetch records 
 public function getData($rowno,$rowperpage) { 
   $this->db->select('*'); 
   $this->db->from('users');        
   $this->db->limit($rowperpage, $rowno);    
   $query = $this->db->get();        
   return $query->result_array(); 
 }

 // Select total records    
 public function getrecordCount() {
   $this->db->select('count(*) as allcount');      
   $this->db->from('users');      
   $query = $this->db->get();      
   $result = $query->result_array();            
   return $result[0]['allcount'];    
 }
}

 

4. Controller

Create a application/controllers/User.php.

Define a constructor, index(), and loadRecord() methods.

__construct() – Load pagination library using $this->load->library() and User_model.

index() – Redirect to loadRecord() method.

loadRecord() – Set $rowperpage to 5 and if $rowno value is not equal to 0 then $rowno = ($rowno-1) * $rowperpage.

Get the total records by calling getrecordCount() method and user records by calling getData() method where pass $rowno and $rowperpage value.

Set the pagination configuration.

Pass the $config to $this->pagination->initialize($config) and get the links with $this->pagination->create_links() and initialize $data['pagination'].

Pass the $user_record in $data['result'] and $rowno in $data['row'].

Load the user_view and pass the $data variable.

Completed Code

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class User extends CI_Controller {
 public function __construct(){         
   parent::__construct();        
   $this->load->helper('url');
   
   // Load Pagination library 
   $this->load->library('pagination');
   
   // Load model 
   $this->load->model('User_model'); 
 } 

 public function index() { 
   redirect('User/loadRecord'); 
 }

 public function loadRecord($rowno=0){
   // Row per page 
   $rowperpage = 5;
   
   // Row position 
   if($rowno != 0){ 
     $rowno = ($rowno-1) * $rowperpage; 
   }            

   // All records count      
   $allcount = $this->User_model->getrecordCount();

   // Get  records      
   $users_record = $this->User_model->getData($rowno,$rowperpage);   
         
   // Pagination Configuration      
   $config['base_url'] = base_url().'User/loadRecord';      
   $config['use_page_numbers'] = TRUE;      
   $config['total_rows'] = $allcount; 
   $config['per_page'] = $rowperpage;

   // Initialize 
   $this->pagination->initialize($config);

   $data['pagination'] = $this->pagination->create_links(); 
   $data['result'] = $users_record; 
   $data['row'] = $rowno;

   // Load view 
   $this->load->view('user_view',$data); 
  }
}

 

5. View

Create a new application/views/user_view.php file.

Display users record by looping on the $result variable and for display pagination with $pagination.

Completed Code

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
?>
<!DOCTYPE html>
<html lang="en">
 <head> 
  <meta charset="utf-8"> <title>CodeIgniter</title>
  <style type="text/css"> 
  a { 
   padding-left: 5px; 
   padding-right: 5px; 
   margin-left: 5px; 
   margin-right: 5px; 
  } 
  </style>
 </head>
 <body>
  <table border='1' style='border-collapse: collapse;'> 
   <tr> 
    <th>S.no</th> 
    <th>Username</th> 
    <th>Name</th> 
    <th>Email</th> 
   </tr> 
   <?php  
    $sno = $row+1; 
    foreach($result as $data){ 
      echo "<tr>"; 
      echo "<td>".$sno."</td>"; 
      echo "<td>".$data['username']."</td>"; 
      echo "<td>".$data['name']."</td>"; 
      echo "<td>".$data['email']."</td>"; 
      echo "</tr>"; 
      $sno++; 
    } 
    ?> 
  </table>
  <!-- Paginate --> 
  <div style='margin-top: 10px;'> 
  <?= $pagination; ?> 
  </div>
 </body>
</html>

 

6. Conclusion

You need to load the pagination library and set the required configuration for initializing. Then create the paginate numeric links and use it in the view.

I have only used some of the configuration for pagination library you can learn more about it from here.

Related Post

Spread the love
  •  
  •  
  •  
  •  
  •  
  •  

3 Comments

  1. Staria said:

    Hi… wonderful tutorial! It works beautifully! However, I do have a question:
    In the controller file, is there a way we might change the urls that are generated. For example, the url looks like “http://localhost/pilot/User/loadRecord/2”. Basically, what I am asking is… is there a way of rewriting the url so that it doesn’t show the name of the controller called?

    August 8, 2018
    Reply
    • Yogesh Singh said:

      You can do this by creating routes.
      Ex –
      Open application/config/routes.php.
      Here, define two routes –
      $route[‘loadrecord’] = ‘User/loadRecord’;
      $route[‘loadrecord/(:num)’] = ‘User/loadRecord/$1’;

      Now, use loadrecord in the place of User/loadRecord in the User.php file.

      You can learn more about routing here.

      August 8, 2018
      Reply
      • Staria said:

        I am trying to get this to work on categories. For example, I have “articles” with the category “acne” and I am trying to use pagination to go through each page of the category. Sadly, it isn’t going as smoothly as your tutorial. No worries, I am certain I will figure it out. :o)

        Thank you for the additional information. I will be sure to read through it.

        August 13, 2018
        Reply

Leave a Reply

Your email address will not be published. Required fields are marked *