CodeIgniter’s Pagination class is very easy to use. I set up following code.
Create this file Pagination.php in the system/libraries/Pagination.php folder
system/libraries/Pagination.php
001.
<?php
if
( ! defined(
'BASEPATH'
))
exit
(
'No direct script access allowed'
);
002.
/**
003.
* CodeIgniter
004.
*
005.
* An open source application development framework for PHP 4.3.2 or newer
006.
*
007.
* @package CodeIgniter
008.
* @author ExpressionEngine Dev Team
009.
* @copyright Copyright (c) 2006, EllisLab, Inc.
010.
* @license http://codeigniter.com/user_guide/license.html
011.
* @link http://codeigniter.com
012.
* @since Version 1.0
013.
* @filesource
014.
*/
015.
016.
// ------------------------------------------------------------------------
017.
018.
/**
019.
* Pagination Class
020.
*
021.
* @package CodeIgniter
022.
* @subpackage Libraries
023.
* @category Pagination
024.
* @author ExpressionEngine Dev Team
026.
*/
027.
class
CI_Pagination {
028.
029.
var
$base_url
=
''
;
// The page we are linking to
030.
var
$total_rows
=
''
;
// Total number of items (database results)
031.
var
$per_page
= 10;
// Max number of items you want shown per page
032.
var
$num_links
= 2;
// Number of "digit" links to show before/after the currently viewed page
033.
var
$cur_page
= 0;
// The current page being viewed
034.
var
$first_link
=
'‹ Start'
;
035.
var
$next_link
=
'>'
;
036.
var
$prev_link
=
'<'
;
037.
var
$last_link
=
'End ›'
;
038.
var
$uri_segment
= 3;
039.
var
$full_tag_open
=
''
;
040.
var
$full_tag_close
=
''
;
041.
var
$first_tag_open
=
''
;
042.
var
$first_tag_close
=
' '
;
043.
var
$last_tag_open
=
' '
;
044.
var
$last_tag_close
=
''
;
045.
var
$cur_tag_open
=
' <b>'
;
046.
var
$cur_tag_close
=
'</b>'
;
047.
var
$next_tag_open
=
' '
;
048.
var
$next_tag_close
=
' '
;
049.
var
$prev_tag_open
=
' '
;
050.
var
$prev_tag_close
=
''
;
051.
var
$num_tag_open
=
' '
;
052.
var
$num_tag_close
=
''
;
053.
var
$page_query_string
= FALSE;
054.
var
$query_string_segment
=
'per_page'
;
055.
056.
/**
057.
* Constructor
058.
*
059.
* @access public
060.
* @param array initialization parameters
061.
*/
062.
function
CI_Pagination(
$params
=
array
())
063.
{
064.
if
(
count
(
$params
) > 0)
065.
{
066.
$this
->initialize(
$params
);
067.
}
068.
069.
log_message(
'debug'
,
"Pagination Class Initialized"
);
070.
}
071.
072.
// --------------------------------------------------------------------
073.
074.
/**
075.
* Initialize Preferences
076.
*
077.
* @access public
078.
* @param array initialization parameters
079.
* @return void
080.
*/
081.
function
initialize(
$params
=
array
())
082.
{
083.
if
(
count
(
$params
) > 0)
084.
{
085.
foreach
(
$params
as
$key
=>
$val
)
086.
{
087.
if
(isset(
$this
->
$key
))
088.
{
089.
$this
->
$key
=
$val
;
090.
}
091.
}
092.
}
093.
}
094.
095.
// --------------------------------------------------------------------
096.
097.
/**
098.
* Generate the pagination links
099.
*
100.
* @access public
101.
* @return string
102.
*/
103.
104.
function
create_links()
105.
{
106.
// If our item count or per-page total is zero there is no need to continue.
107.
if
(
$this
->total_rows == 0 OR
$this
->per_page == 0)
108.
{
109.
return
''
;
110.
}
111.
112.
// Calculate the total number of pages
113.
$num_pages
=
ceil
(
$this
->total_rows /
$this
->per_page);
114.
115.
// Is there only one page? Hm... nothing more to do here then.
116.
if
(
$num_pages
== 1)
117.
{
118.
return
''
;
119.
}
120.
121.
// Determine the current page number.
122.
$CI
=& get_instance();
123.
124.
if
(
$CI
->config->item(
'enable_query_strings'
) === TRUE OR
$this
->page_query_string === TRUE)
125.
{
126.
if
(
$CI
->input->get(
$this
->query_string_segment) != 0)
127.
{
128.
$this
->cur_page =
$CI
->input->get(
$this
->query_string_segment);
129.
130.
// Prep the current page - no funny business!
131.
$this
->cur_page = (int)
$this
->cur_page;
132.
}
133.
}
134.
else
135.
{
136.
if
(
$CI
->uri->segment(
$this
->uri_segment) != 0)
137.
{
138.
$this
->cur_page =
$CI
->uri->segment(
$this
->uri_segment);
139.
140.
// Prep the current page - no funny business!
141.
$this
->cur_page = (int)
$this
->cur_page;
142.
}
143.
}
144.
145.
$this
->num_links = (int)
$this
->num_links;
146.
147.
if
(
$this
->num_links < 1)
148.
{
149.
show_error(
'Your number of links must be a positive number.'
);
150.
}
151.
152.
if
( !
is_numeric
(
$this
->cur_page))
153.
{
154.
$this
->cur_page = 0;
155.
}
156.
157.
// Is the page number beyond the result range?
158.
// If so we show the last page
159.
if
(
$this
->cur_page >
$this
->total_rows)
160.
{
161.
$this
->cur_page = (
$num_pages
- 1) *
$this
->per_page;
162.
}
163.
164.
$uri_page_number
=
$this
->cur_page;
165.
$this
->cur_page =
floor
((
$this
->cur_page/
$this
->per_page) + 1);
166.
167.
// Calculate the start and end numbers. These determine
168.
// which number to start and end the digit links with
169.
$start
= ((
$this
->cur_page -
$this
->num_links) > 0) ?
$this
->cur_page - (
$this
->num_links - 1) : 1;
170.
$end
= ((
$this
->cur_page +
$this
->num_links) <
$num_pages
) ?
$this
->cur_page +
$this
->num_links :
$num_pages
;
171.
172.
// Is pagination being used over GET or POST? If get, add a per_page query
173.
// string. If post, add a trailing slash to the base URL if needed
174.
if
(
$CI
->config->item(
'enable_query_strings'
) === TRUE OR
$this
->page_query_string === TRUE)
175.
{
176.
$this
->base_url = rtrim(
$this
->base_url).AMP.
$this
->query_string_segment.
'='
;
177.
}
178.
else
179.
{
180.
$this
->base_url = rtrim(
$this
->base_url,
'/'
) .
'/'
;
181.
}
182.
183.
// And here we go...
184.
$output
=
''
;
185.
186.
// Render the "First" link
187.
if
(
$this
->cur_page >
$this
->num_links)
188.
{
189.
$output
.=
$this
->first_tag_open.
'<a href="'
.
$this
->base_url.
'">'
.
$this
->first_link.
'</a>'
.
$this
->first_tag_close;
190.
}
191.
192.
// Render the "previous" link
193.
if
(
$this
->cur_page != 1)
194.
{
195.
$i
=
$uri_page_number
-
$this
->per_page;
196.
if
(
$i
== 0)
$i
=
''
;
197.
$output
.=
$this
->prev_tag_open.
'<a href="'
.
$this
->base_url.
$i
.
'">'
.
$this
->prev_link.
'</a>'
.
$this
->prev_tag_close;
198.
}
199.
200.
// Write the digit links
201.
for
(
$loop
=
$start
-1;
$loop
<=
$end
;
$loop
++)
202.
{
203.
$i
= (
$loop
*
$this
->per_page) -
$this
->per_page;
204.
205.
if
(
$i
>= 0)
206.
{
207.
if
(
$this
->cur_page ==
$loop
)
208.
{
209.
$output
.=
$this
->cur_tag_open.
$loop
.
$this
->cur_tag_close;
// Current page
210.
}
211.
else
212.
{
213.
$n
= (
$i
== 0) ?
''
:
$i
;
214.
$output
.=
$this
->num_tag_open.
'<a href="'
.
$this
->base_url.
$n
.
'">'
.
$loop
.
'</a>'
.
$this
->num_tag_close;
215.
}
216.
}
217.
}
218.
219.
// Render the "next" link
220.
if
(
$this
->cur_page <
$num_pages
)
221.
{
222.
$output
.=
$this
->next_tag_open.
'<a href="'
.
$this
->base_url.(
$this
->cur_page *
$this
->per_page).
'">'
.
$this
->next_link.
'</a>'
.
$this
->next_tag_close;
223.
}
224.
225.
// Render the "Last" link
226.
if
((
$this
->cur_page +
$this
->num_links) <
$num_pages
)
227.
{
228.
$i
= ((
$num_pages
*
$this
->per_page) -
$this
->per_page);
229.
$output
.=
$this
->last_tag_open.
'<a href="'
.
$this
->base_url.
$i
.
'">'
.
$this
->last_link.
'</a>'
.
$this
->last_tag_close;
230.
}
231.
232.
// Kill double slashes. Note: Sometimes we can end up with a double slash
233.
// in the penultimate link so we'll kill all double slashes.
234.
$output
= preg_replace(
"#([^:])//+#"
,
"\1/"
,
$output
);
235.
236.
// Add the wrapper HTML if exists
237.
$output
=
$this
->full_tag_open.
$output
.
$this
->full_tag_close;
238.
239.
return
$output
;
240.
}
241.
242.
function
create_links_left()
243.
{
244.
// If our item count or per-page total is zero there is no need to continue.
245.
if
(
$this
->total_rows == 0 OR
$this
->per_page == 0)
246.
{
247.
return
''
;
248.
}
249.
250.
// Calculate the total number of pages
251.
$num_pages
=
ceil
(
$this
->total_rows /
$this
->per_page);
252.
253.
// Is there only one page? Hm... nothing more to do here then.
254.
if
(
$num_pages
== 1)
255.
{
256.
return
''
;
257.
}
258.
259.
// Determine the current page number.
260.
$CI
=& get_instance();
261.
262.
if
(
$CI
->config->item(
'enable_query_strings'
) === TRUE OR
$this
->page_query_string === TRUE)
263.
{
264.
if
(
$CI
->input->get(
$this
->query_string_segment) != 0)
265.
{
266.
$this
->cur_page =
$CI
->input->get(
$this
->query_string_segment);
267.
268.
// Prep the current page - no funny business!
269.
$this
->cur_page = (int)
$this
->cur_page;
270.
}
271.
}
272.
else
273.
{
274.
if
(
$CI
->uri->segment(
$this
->uri_segment) != 0)
275.
{
276.
$this
->cur_page =
$CI
->uri->segment(
$this
->uri_segment);
277.
278.
// Prep the current page - no funny business!
279.
$this
->cur_page = (int)
$this
->cur_page;
280.
}
281.
}
282.
283.
$this
->num_links = (int)
$this
->num_links;
284.
285.
if
(
$this
->num_links < 1)
286.
{
287.
show_error(
'Your number of links must be a positive number.'
);
288.
}
289.
290.
if
( !
is_numeric
(
$this
->cur_page))
291.
{
292.
$this
->cur_page = 0;
293.
}
294.
295.
// Is the page number beyond the result range?
296.
// If so we show the last page
297.
if
(
$this
->cur_page >
$this
->total_rows)
298.
{
299.
$this
->cur_page = (
$num_pages
- 1) *
$this
->per_page;
300.
}
301.
302.
$uri_page_number
=
$this
->cur_page;
303.
$this
->cur_page =
floor
((
$this
->cur_page/
$this
->per_page) + 1);
304.
305.
// Calculate the start and end numbers. These determine
306.
// which number to start and end the digit links with
307.
$start
= ((
$this
->cur_page -
$this
->num_links) > 0) ?
$this
->cur_page - (
$this
->num_links - 1) : 1;
308.
$end
= ((
$this
->cur_page +
$this
->num_links) <
$num_pages
) ?
$this
->cur_page +
$this
->num_links :
$num_pages
;
309.
310.
// Is pagination being used over GET or POST? If get, add a per_page query
311.
// string. If post, add a trailing slash to the base URL if needed
312.
if
(
$CI
->config->item(
'enable_query_strings'
) === TRUE OR
$this
->page_query_string === TRUE)
313.
{
314.
$this
->base_url = rtrim(
$this
->base_url).AMP.
$this
->query_string_segment.
'='
;
315.
}
316.
else
317.
{
318.
$this
->base_url = rtrim(
$this
->base_url,
'/'
) .
'/'
;
319.
}
320.
321.
// And here we go...
322.
$output
=
''
;
323.
324.
// Render the "First" link
325.
if
(
$this
->cur_page >
$this
->num_links)
326.
{
327.
$output
.=
$this
->first_tag_open.
'<a href="'
.
$this
->base_url.
'">'
.
$this
->first_link.
'</a>'
.
$this
->first_tag_close;
328.
}
329.
330.
// Render the "previous" link
331.
if
(
$this
->cur_page != 1)
332.
{
333.
$i
=
$uri_page_number
-
$this
->per_page;
334.
if
(
$i
== 0)
$i
=
''
;
335.
$output
.=
$this
->prev_tag_open.
'<a href="'
.
$this
->base_url.
$i
.
'">'
.
$this
->prev_link.
'</a>'
.
$this
->prev_tag_close;
336.
}
337.
338.
// Write the digit links
339.
for
(
$loop
=
$start
-1;
$loop
<=
$end
;
$loop
++)
340.
{
341.
$i
= (
$loop
*
$this
->per_page) -
$this
->per_page;
342.
343.
if
(
$i
>= 0)
344.
{
345.
if
(
$this
->cur_page ==
$loop
)
346.
{
347.
$output
.=
$this
->cur_tag_open.
$loop
.
$this
->cur_tag_close;
// Current page
348.
}
349.
else
350.
{
351.
$n
= (
$i
== 0) ?
''
:
$i
;
352.
$output
.=
$this
->num_tag_open.
'<a href="'
.
$this
->base_url.
$n
.
'">'
.
$loop
.
'</a>'
.
$this
->num_tag_close;
353.
}
354.
}
355.
}
356.
357.
// Render the "next" link
358.
if
(
$this
->cur_page <
$num_pages
)
359.
{
360.
$output
.=
$this
->next_tag_open.
'<a href="'
.
$this
->base_url.(
$this
->cur_page *
$this
->per_page).
'">'
.
$this
->next_link.
'</a>'
.
$this
->next_tag_close;
361.
}
362.
363.
// Render the "Last" link
364.
if
((
$this
->cur_page +
$this
->num_links) <
$num_pages
)
365.
{
366.
$i
= ((
$num_pages
*
$this
->per_page) -
$this
->per_page);
367.
$output
.=
$this
->last_tag_open.
'<a href="'
.
$this
->base_url.
$i
.
'">'
.
$this
->last_link.
'</a>'
.
$this
->last_tag_close;
368.
}
369.
370.
// Kill double slashes. Note: Sometimes we can end up with a double slash
371.
// in the penultimate link so we'll kill all double slashes.
372.
$output
= preg_replace(
"#([^:])//+#"
,
"\1/"
,
$output
);
373.
374.
// Add the wrapper HTML if exists
375.
$output
=
$this
->full_tag_open.
$output
.
$this
->full_tag_close;
376.
377.
return
$output
;
378.
}
379.
380.
function
create_links_right()
381.
{
382.
// If our item count or per-page total is zero there is no need to continue.
383.
if
(
$this
->total_rows == 0 OR
$this
->per_page == 0)
384.
{
385.
return
''
;
386.
}
387.
388.
// Calculate the total number of pages
389.
$num_pages
=
ceil
(
$this
->total_rows /
$this
->per_page);
390.
391.
// Is there only one page? Hm... nothing more to do here then.
392.
if
(
$num_pages
== 1)
393.
{
394.
return
''
;
395.
}
396.
397.
// Determine the current page number.
398.
$CI
=& get_instance();
399.
400.
if
(
$CI
->config->item(
'enable_query_strings'
) === TRUE OR
$this
->page_query_string === TRUE)
401.
{
402.
if
(
$CI
->input->get(
$this
->query_string_segment) != 0)
403.
{
404.
$this
->cur_page =
$CI
->input->get(
$this
->query_string_segment);
405.
406.
// Prep the current page - no funny business!
407.
$this
->cur_page = (int)
$this
->cur_page;
408.
}
409.
}
410.
else
411.
{
412.
if
(
$CI
->uri->segment(
$this
->uri_segment) != 0)
413.
{
414.
$this
->cur_page =
$CI
->uri->segment(
$this
->uri_segment);
415.
416.
// Prep the current page - no funny business!
417.
$this
->cur_page = (int)
$this
->cur_page;
418.
}
419.
}
420.
421.
$this
->num_links = (int)
$this
->num_links;
422.
423.
if
(
$this
->num_links < 1)
424.
{
425.
show_error(
'Your number of links must be a positive number.'
);
426.
}
427.
428.
if
( !
is_numeric
(
$this
->cur_page))
429.
{
430.
$this
->cur_page = 0;
431.
}
432.
433.
// Is the page number beyond the result range?
434.
// If so we show the last page
435.
if
(
$this
->cur_page >
$this
->total_rows)
436.
{
437.
$this
->cur_page = (
$num_pages
- 1) *
$this
->per_page;
438.
}
439.
440.
$uri_page_number
=
$this
->cur_page;
441.
$this
->cur_page =
floor
((
$this
->cur_page/
$this
->per_page) + 1);
442.
443.
// Calculate the start and end numbers. These determine
444.
// which number to start and end the digit links with
445.
$start
= ((
$this
->cur_page -
$this
->num_links) > 0) ?
$this
->cur_page - (
$this
->num_links - 1) : 1;
446.
$end
= ((
$this
->cur_page +
$this
->num_links) <
$num_pages
) ?
$this
->cur_page +
$this
->num_links :
$num_pages
;
447.
448.
// Is pagination being used over GET or POST? If get, add a per_page query
449.
// string. If post, add a trailing slash to the base URL if needed
450.
if
(
$CI
->config->item(
'enable_query_strings'
) === TRUE OR
$this
->page_query_string === TRUE)
451.
{
452.
$this
->base_url = rtrim(
$this
->base_url).AMP.
$this
->query_string_segment.
'='
;
453.
}
454.
else
455.
{
456.
$this
->base_url = rtrim(
$this
->base_url,
'/'
) .
'/'
;
457.
}
458.
459.
// And here we go...
460.
$output
=
''
;
461.
462.
// Render the "First" link
463.
if
(
$this
->cur_page >
$this
->num_links)
464.
{
465.
$output
.=
$this
->first_tag_open.
'<a href="'
.
$this
->base_url.
'">'
.
$this
->first_link.
'</a>'
.
$this
->first_tag_close;
466.
}
467.
468.
// Render the "previous" link
469.
if
(
$this
->cur_page != 1)
470.
{
471.
$i
=
$uri_page_number
-
$this
->per_page;
472.
if
(
$i
== 0)
$i
=
''
;
473.
$output
.=
$this
->prev_tag_open.
'<a href="'
.
$this
->base_url.
$i
.
'">'
.
$this
->prev_link.
'</a>'
.
$this
->prev_tag_close;
474.
}
475.
476.
// Write the digit links
477.
for
(
$loop
=
$start
-1;
$loop
<=
$end
;
$loop
++)
478.
{
479.
$i
= (
$loop
*
$this
->per_page) -
$this
->per_page;
480.
481.
if
(
$i
>= 0)
482.
{
483.
if
(
$this
->cur_page ==
$loop
)
484.
{
485.
$output
.=
$this
->cur_tag_open.
$loop
.
$this
->cur_tag_close;
// Current page
486.
}
487.
else
488.
{
489.
$n
= (
$i
== 0) ?
''
:
$i
;
490.
$output
.=
$this
->num_tag_open.
'<a href="'
.
$this
->base_url.
$n
.
'">'
.
$loop
.
'</a>'
.
$this
->num_tag_close;
491.
}
492.
}
493.
}
494.
495.
// Render the "next" link
496.
if
(
$this
->cur_page <
$num_pages
)
497.
{
498.
$output
.=
$this
->next_tag_open.
'<a href="'
.
$this
->base_url.(
$this
->cur_page *
$this
->per_page).
'">'
.
$this
->next_link.
'</a>'
.
$this
->next_tag_close;
499.
}
500.
501.
// Render the "Last" link
502.
if
((
$this
->cur_page +
$this
->num_links) <
$num_pages
)
503.
{
504.
$i
= ((
$num_pages
*
$this
->per_page) -
$this
->per_page);
505.
$output
.=
$this
->last_tag_open.
'<a href="'
.
$this
->base_url.
$i
.
'">'
.
$this
->last_link.
'</a>'
.
$this
->last_tag_close;
506.
}
507.
508.
// Kill double slashes. Note: Sometimes we can end up with a double slash
509.
// in the penultimate link so we'll kill all double slashes.
510.
$output
= preg_replace(
"#([^:])//+#"
,
"\1/"
,
$output
);
511.
512.
// Add the wrapper HTML if exists
513.
$output
=
$this
->full_tag_open.
$output
.
$this
->full_tag_close;
514.
515.
return
$output
;
516.
}
517.
518.
}
519.
// END Pagination Class
520.
521.
/* End of file Pagination.php */
522.
/* Location: ./system/libraries/Pagination.php */
Here’s the controller:
01.
function
index()
02.
{
03.
//load model class
04.
$this
->load->model(
'mdl_tests'
,
'tests'
);
05.
06.
//load pagination class
07.
08.
$this
->load->library(
'pagination'
);
09.
10.
//The $config array contains your configuration variables.
11.
12.
$config
[
'base_url'
] = base_url().
'tests/index/'
;
13.
$config
[
'total_rows'
] =
$this
->db->count_all(
'ms_tests'
);
14.
15.
$config
[
'per_page'
] =
'10'
;
16.
//The number of items you intend to show per page. In the above example, you would be showing 10 items per page.
17.
18.
$config
[
'full_tag_open'
] =
'<p align="center">'
;
19.
$config
[
'full_tag_close'
] =
'</p>'
;
20.
21.
$config
[
'first_link'
] =
'First'
;
22.
$config
[
'last_link'
] =
'Last'
;
23.
24.
$config
[
'next_link'
] =
' NEXT 4 ISSUE >>'
;
25.
$config
[
'prev_link'
] =
'<< PREVIOUS 4 ISSUE '
;
26.
27.
$config
[
'num_tag_open'
] =
'<span> <u>'
;
28.
$config
[
'num_tag_close'
] =
'</u> </span>'
;
29.
30.
$this
->pagination->initialize(
$config
);
31.
32.
$this
->data[
'pagination'
] =
$this
->pagination->create_links();
33.
$this
->data[
'results'
] =
$this
->tests->get_tests_issue(
$config
[
'per_page'
],
$this
->uri->segment(3));
34.
35.
$this
->load->view(
'pagination_sample'
,
$this
->data);
36.
37.
}
Here’s the model:
1.
function
get_tests_issue(
$num
,
$offset
) {
2.
$query
=
$this
->db->get(
'ms_tests'
,
$num
,
$offset
);
3.
return
$query
;
4.
}
The view:
01.
<div
class
=
"clearfix"
>
02.
<?=
$pagination
?>
03.
</div>
04.
<?php
05.
foreach
(
$tests
as
$test
) :
06.
echo
$test
[
'title'
];
07.
endforeach
08.
?>
09.
10.
<div
class
=
"clearfix"
>
11.
<?=
$pagination
?>
12.
</div>