Pagination with Search Filter in CodeIgniter

Pagination gets complicated when to find specific groups of records when there is a large number of records are available.

By adding a search filter with pagination makes easier for the user to easily find records e.g. filter list by country, department, name etc.

It is easier to add pagination using pagination library in CodeIgniter.

In this tutorial, I am using the SESSION to store search value and filter the pagination list.

Pagination with search filter in CodeIgniter


Contents

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

 

1. Table structure

I am using posts table.

CREATE TABLE `posts` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `content` text NOT NULL,
  `link` varchar(255) 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");

 

3. Model

Create a Main_model.php file in application/models/ directory.

Create 3 methods –

  • _construct
  • getData() – This methods takes 3 parameters.

Fetch records from posts table and if the $search is not empty then set search value in title and content fields.

Return an array.

  • getrecordCount() – This method return total records.

If the $search is not empty then search value in title and content field.

Return the allcount value.

Completed Code

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

Class Main_model extends CI_Model {

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

  // Fetch records
  public function getData($rowno,$rowperpage,$search="") {
 
    $this->db->select('*');
    $this->db->from('posts');

    if($search != ''){
      $this->db->like('title', $search);
      $this->db->or_like('content', $search);
    }

    $this->db->limit($rowperpage, $rowno); 
    $query = $this->db->get();
 
    return $query->result_array();
  }

  // Select total records
  public function getrecordCount($search = '') {

    $this->db->select('count(*) as allcount');
    $this->db->from('posts');
 
    if($search != ''){
      $this->db->like('title', $search);
      $this->db->or_like('content', $search);
    }

    $query = $this->db->get();
    $result = $query->result_array();
 
    return $result[0]['allcount'];
  }

}

 

4. Controller

Create a User.php file in application/controllers/ directory.

Create 3 methods –

  • __construct – Load session, pagination library and Main_model model.
  • index() – Redirect to loadRecord() method.
  • loadRecord() – If search form get post then read $this->input->post('search') and assign in $search_text.

Also initialize SESSION search variable with $search_text.

If <form> does not post then check SESSION initialized or not. If value is defined then assign SESSION variable value in $search_text.

Count and fetch records from Main_model.

Configuration pagination and initialize $data array.

Here, for displaying search value on search box define $data['search'] = $search_text.

Load user_view and pass the $data.

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 session
    $this->load->library('session');

    // Load Pagination library
    $this->load->library('pagination');

    // Load model
    $this->load->model('Main_model');
  }

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

  public function loadRecord($rowno=0){

    // Search text
    $search_text = "";
    if($this->input->post('submit') != NULL ){
      $search_text = $this->input->post('search');
      $this->session->set_userdata(array("search"=>$search_text));
    }else{
      if($this->session->userdata('search') != NULL){
        $search_text = $this->session->userdata('search');
      }
    }

    // Row per page
    $rowperpage = 5;

    // Row position
    if($rowno != 0){
      $rowno = ($rowno-1) * $rowperpage;
    }
 
    // All records count
    $allcount = $this->Main_model->getrecordCount($search_text);

    // Get records
    $users_record = $this->Main_model->getData($rowno,$rowperpage,$search_text);
 
    // Pagination Configuration
    $config['base_url'] = base_url().'index.php/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;
    $data['search'] = $search_text;

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

}

 

5. View

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

Create a search <form> where I added a search box and a submit button. Set <form> action to <?= base_url() ?>index.php/User/loadRecord.

List records from $result in <table>.

Display the generated 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>Pagination with Search Filter in CodeIgniter</title>
  
    <style type="text/css">
    a {
     padding-left: 5px;
     padding-right: 5px;
     margin-left: 5px;
     margin-right: 5px;
    }
    </style>
  </head>
  <body>

   <!-- Search form (start) -->
   <form method='post' action="<?= base_url() ?>index.php/User/loadRecord" >
     <input type='text' name='search' value='<?= $search ?>'><input type='submit' name='submit' value='Submit'>
   </form>
   <br/>

   <!-- Posts List -->
   <table border='1' width='100%' style='border-collapse: collapse;'>
    <tr>
      <th>S.no</th>
      <th>Title</th>
      <th>Content</th>
    </tr>
    <?php 
    $sno = $row+1;
    foreach($result as $data){

      $content = substr($data['content'],0, 180)." ...";
      echo "<tr>";
      echo "<td>".$sno."</td>";
      echo "<td><a href='".$data['link']."' target='_blank'>".$data['title']."</a></td>";
      echo "<td>".$content."</td>";
      echo "</tr>";
      $sno++;

    }
    if(count($result) == 0){
      echo "<tr>";
      echo "<td colspan='3'>No record found.</td>";
      echo "</tr>";
    }
    ?>
   </table>

   <!-- Paginate -->
   <div style='margin-top: 10px;'>
   <?= $pagination; ?>
   </div>

 </body>
</html>

 

6. Demo

Enter search value in the textbox e.g. PHP, jQuery and click the submit button. Open in a new tab.


 

7. Conclusion

I used the SESSION to store search value when <form > submit and use to filter records.

If you like to add more than one search element then add it in <form> and initialize the SESSION in the controller and use it.

If you find this tutorial helpful then don’t forget to share.

Related Post

Spread the love
  •  
  •  
  •  
  •  
  •  
  •  

One Comment

  1. faheem said:

    working nice thanks for this

    March 7, 2018
    Reply

Leave a Reply

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