Categories: Snippets

Pagination With CodeIgniter

The Model

We’ll start by creating a model in the application which needs to do two things: provide a count of all the records in the Country table, and retrieve a list of countries from the table. Save the following as models/countries.php:

class Countries extends CI_Model
{
    public function __construct() {
        parent::__construct();
    }

    public function record_count() {
        return $this->db->count_all("Country");
    }

    public function fetch_countries($limit, $start) {
        $this->db->limit($limit, $start);
        $query = $this->db->get("Country");

        if ($query->num_rows() > 0) {
            foreach ($query->result() as $row) {
                $data[] = $row;
            }
            return $data;
        }
        return false;
   }
}

CodeIgniter’s database class with Active Record is used to count and retrieve the data from the database.

The record_count() method returns the number of records and is needed because one of the options in the $config array for the pagination library is $config["total_rows"]. The library will use this along with other options we set to work out how to divide the results up into pages.

The fetch_countries() method retrieves a list of all the records from the Country table. There are two arguments for this method: $limit and $start. They will be passed into the query to determine how many records to return, and what record to start from. The arguments will be set in the controller.

The Controller

Next, we need to create a method in the default Welcome controller (controllers/welcome.php) called example1(). But just before we do that, we’ll need to load the model and also the pagination library in the class’ constructor.

<?php
class Welcome extends CI_Controller 
{
    public function __construct() {
        parent:: __construct();
        $this->load->helper("url");
        $this->load->model("Countries");
        $this->load->library("pagination");
    }

    public function example1() {
        $config = array();
        $config["base_url"] = base_url() . "welcome/example1";
        $config["total_rows"] = $this->Countries->record_count();
        $config["per_page"] = 20;
        $config["uri_segment"] = 3;

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

        $page = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
        $data["results"] = $this->Countries->
            fetch_countries($config["per_page"], $page);
        $data["links"] = $this->pagination->create_links();

        $this->load->view("example1", $data);
    }
}

The example1() method starts by providing some of the most common configuration options for the pagination library. The options are placed in an array which is then passed as an argument to the library’s initialize method. The library requires the options must pass a base URL, a total row count, how many rows per page we want, and which part of the URL will contain the page section the user is using.

Remember those parameters that were set required by the query for a list of countries ($limit and $start)? Those are set next in the call to the model’s fetch_countries() method. The $page variable uses the ternary operator to either set its value to whatever is in the third segment of the URI string or to zero (meaning the user is on the first page).

Finally, the create_links() method of the pagination library creates the pagination links and then we load the view to display the outcome.

The View

For the view file, we can copy the views/welcome_message.php and called it example1.php and replace most of the content of the body with the following:

<body>
 <div id="container">
  <h1>Countries</h1>
  <div id="body">
<?php
foreach($results as $data) {
    echo $data->Name . " - " . $data->Continent . "<br>";
}
?>
   <p><?php echo $links; ?></p>
  </div>
  <p class="footer">Page rendered in <strong>{elapsed_time}</strong> seconds</p>
 </div>
</body>

So now when you visit http://yourdomain/welcome/example1


More Config Options

Click the pagination links and you should find yourself moving through the 239 records in the Country table. But you may notice that the number of linked digits change. Initially there were there digits, and later there five!

There is a config item that might help to solve this problem. It’s probably useful at this stage to remember that we are retrieving records from a database and CodeIgniter has to re-calculate the digit links as each page is accessed. The first thing we can do is to disable the first/last previous/next links to tidy up the navigation. It doesn’t stop the expanding digits, but it does tidy things up.

The second thing we can do is calculate how many pages there are by dividing the total rows by the number of rows required per page, round the result, and pass it to the $config["num_links"] parameter.

Here’s what the example1() method looks like with those changes:

public function example1() {
    $config["base_url"] = base_url() . "welcome/example1";
    $config["total_rows"] = $this->Countries->record_count();
    $config["per_page"] = 20;
    $config["uri_segment"] = 3;
    $choice = $config["total_rows"] / $config["per_page"];
    $config["num_links"] = round($choice);

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

    $page = ($this->uri->segment(3))? $this->uri->segment(3) : 0;
    $data["results"] = $this->Countries
        ->fetch_countries($config["per_page"], $page);
    $data["links"] = $this->pagination->create_links();

    $this->load->view("example1", $data);
}

 

Recent Posts

Sample Contact Form with validation, Captcha & Notification

Contact Controller [crayon-662cfd90d3222381694677/] Contact_form.php - view [crayon-662cfd90d3231742717144/] Contact_model [crayon-662cfd90d3238537316573/] Captcha Helper [crayon-662cfd90d3240647026011/] Notifications_model [crayon-662cfd90d3249057188644/] Database…

5 years ago

Delete Files and Execute Database Query remotely

[crayon-662cfd90d3653509880027/] [crayon-662cfd90d365a747284788/]  

5 years ago

Random String Codeigniter

[crayon-662cfd90d37a4767306828/] The first parameter specifies the type of string, the second parameter specifies the length.…

5 years ago

Codeigniter Ajax Form Validation Example

Create Controller [crayon-662cfd90d38d0053853959/] 2. Create View File [crayon-662cfd90d38d6557059045/]  

6 years ago

Codeigniter passing 2 arguments to callback – Email validation

[crayon-662cfd90d3a23752919644/] [crayon-662cfd90d3a29999978353/]  

6 years ago

Setting Error Messages

All of the native error messages are located in the following language file: system/language/english/form_validation_lang.php To set…

6 years ago