]>
Commit | Line | Data |
---|---|---|
59c06b17 CS |
1 | <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); |
2 | /** | |
3 | * CodeIgniter | |
4 | * | |
5 | * An open source application development framework for PHP 5.1.6 or newer | |
6 | * | |
7 | * @package CodeIgniter | |
8 | * @author ExpressionEngine Dev Team | |
9 | * @copyright Copyright (c) 2008 - 2011, EllisLab, Inc. | |
10 | * @license http://codeigniter.com/user_guide/license.html | |
11 | * @link http://codeigniter.com | |
12 | * @since Version 1.0 | |
13 | * @filesource | |
14 | */ | |
15 | ||
16 | // ------------------------------------------------------------------------ | |
17 | ||
18 | /** | |
19 | * Pagination Class | |
20 | * | |
21 | * @package CodeIgniter | |
22 | * @subpackage Libraries | |
23 | * @category Pagination | |
24 | * @author ExpressionEngine Dev Team | |
25 | * @link http://codeigniter.com/user_guide/libraries/pagination.html | |
26 | */ | |
27 | class CI_Pagination { | |
28 | ||
29 | var $base_url = ''; // The page we are linking to | |
30 | var $prefix = ''; // A custom prefix added to the path. | |
31 | var $suffix = ''; // A custom suffix added to the path. | |
32 | ||
33 | var $total_rows = 0; // Total number of items (database results) | |
34 | var $per_page = 10; // Max number of items you want shown per page | |
35 | var $num_links = 2; // Number of "digit" links to show before/after the currently viewed page | |
36 | var $cur_page = 0; // The current page being viewed | |
37 | var $use_page_numbers = FALSE; // Use page number for segment instead of offset | |
38 | var $first_link = '‹ First'; | |
39 | var $next_link = '>'; | |
40 | var $prev_link = '<'; | |
41 | var $last_link = 'Last ›'; | |
42 | var $uri_segment = 3; | |
43 | var $full_tag_open = ''; | |
44 | var $full_tag_close = ''; | |
45 | var $first_tag_open = ''; | |
46 | var $first_tag_close = ' '; | |
47 | var $last_tag_open = ' '; | |
48 | var $last_tag_close = ''; | |
49 | var $first_url = ''; // Alternative URL for the First Page. | |
50 | var $cur_tag_open = ' <strong>'; | |
51 | var $cur_tag_close = '</strong>'; | |
52 | var $next_tag_open = ' '; | |
53 | var $next_tag_close = ' '; | |
54 | var $prev_tag_open = ' '; | |
55 | var $prev_tag_close = ''; | |
56 | var $num_tag_open = ' '; | |
57 | var $num_tag_close = ''; | |
58 | var $page_query_string = FALSE; | |
59 | var $query_string_segment = 'per_page'; | |
60 | var $display_pages = TRUE; | |
61 | var $anchor_class = ''; | |
62 | ||
63 | /** | |
64 | * Constructor | |
65 | * | |
66 | * @access public | |
67 | * @param array initialization parameters | |
68 | */ | |
69 | public function __construct($params = array()) | |
70 | { | |
71 | if (count($params) > 0) | |
72 | { | |
73 | $this->initialize($params); | |
74 | } | |
75 | ||
76 | if ($this->anchor_class != '') | |
77 | { | |
78 | $this->anchor_class = 'class="'.$this->anchor_class.'" '; | |
79 | } | |
80 | ||
81 | log_message('debug', "Pagination Class Initialized"); | |
82 | } | |
83 | ||
84 | // -------------------------------------------------------------------- | |
85 | ||
86 | /** | |
87 | * Initialize Preferences | |
88 | * | |
89 | * @access public | |
90 | * @param array initialization parameters | |
91 | * @return void | |
92 | */ | |
93 | function initialize($params = array()) | |
94 | { | |
95 | if (count($params) > 0) | |
96 | { | |
97 | foreach ($params as $key => $val) | |
98 | { | |
99 | if (isset($this->$key)) | |
100 | { | |
101 | $this->$key = $val; | |
102 | } | |
103 | } | |
104 | } | |
105 | } | |
106 | ||
107 | // -------------------------------------------------------------------- | |
108 | ||
109 | /** | |
110 | * Generate the pagination links | |
111 | * | |
112 | * @access public | |
113 | * @return string | |
114 | */ | |
115 | function create_links() | |
116 | { | |
117 | // If our item count or per-page total is zero there is no need to continue. | |
118 | if ($this->total_rows == 0 OR $this->per_page == 0) | |
119 | { | |
120 | return ''; | |
121 | } | |
122 | ||
123 | // Calculate the total number of pages | |
124 | $num_pages = ceil($this->total_rows / $this->per_page); | |
125 | ||
126 | // Is there only one page? Hm... nothing more to do here then. | |
127 | if ($num_pages == 1) | |
128 | { | |
129 | return ''; | |
130 | } | |
131 | ||
132 | // Set the base page index for starting page number | |
133 | if ($this->use_page_numbers) | |
134 | { | |
135 | $base_page = 1; | |
136 | } | |
137 | else | |
138 | { | |
139 | $base_page = 0; | |
140 | } | |
141 | ||
142 | // Determine the current page number. | |
143 | $CI =& get_instance(); | |
144 | ||
145 | if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE) | |
146 | { | |
147 | if ($CI->input->get($this->query_string_segment) != $base_page) | |
148 | { | |
149 | $this->cur_page = $CI->input->get($this->query_string_segment); | |
150 | ||
151 | // Prep the current page - no funny business! | |
152 | $this->cur_page = (int) $this->cur_page; | |
153 | } | |
154 | } | |
155 | else | |
156 | { | |
157 | if ($CI->uri->segment($this->uri_segment) != $base_page) | |
158 | { | |
159 | $this->cur_page = $CI->uri->segment($this->uri_segment); | |
160 | ||
161 | // Prep the current page - no funny business! | |
162 | $this->cur_page = (int) $this->cur_page; | |
163 | } | |
164 | } | |
165 | ||
166 | // Set current page to 1 if using page numbers instead of offset | |
167 | if ($this->use_page_numbers AND $this->cur_page == 0) | |
168 | { | |
169 | $this->cur_page = $base_page; | |
170 | } | |
171 | ||
172 | $this->num_links = (int)$this->num_links; | |
173 | ||
174 | if ($this->num_links < 1) | |
175 | { | |
176 | show_error('Your number of links must be a positive number.'); | |
177 | } | |
178 | ||
179 | if ( ! is_numeric($this->cur_page)) | |
180 | { | |
181 | $this->cur_page = $base_page; | |
182 | } | |
183 | ||
184 | // Is the page number beyond the result range? | |
185 | // If so we show the last page | |
186 | if ($this->use_page_numbers) | |
187 | { | |
188 | if ($this->cur_page > $num_pages) | |
189 | { | |
190 | $this->cur_page = $num_pages; | |
191 | } | |
192 | } | |
193 | else | |
194 | { | |
195 | if ($this->cur_page > $this->total_rows) | |
196 | { | |
197 | $this->cur_page = ($num_pages - 1) * $this->per_page; | |
198 | } | |
199 | } | |
200 | ||
201 | $uri_page_number = $this->cur_page; | |
202 | ||
203 | if ( ! $this->use_page_numbers) | |
204 | { | |
205 | $this->cur_page = floor(($this->cur_page/$this->per_page) + 1); | |
206 | } | |
207 | ||
208 | // Calculate the start and end numbers. These determine | |
209 | // which number to start and end the digit links with | |
210 | $start = (($this->cur_page - $this->num_links) > 0) ? $this->cur_page - ($this->num_links - 1) : 1; | |
211 | $end = (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links : $num_pages; | |
212 | ||
213 | // Is pagination being used over GET or POST? If get, add a per_page query | |
214 | // string. If post, add a trailing slash to the base URL if needed | |
215 | if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE) | |
216 | { | |
217 | $this->base_url = rtrim($this->base_url).'&'.$this->query_string_segment.'='; | |
218 | } | |
219 | else | |
220 | { | |
221 | $this->base_url = rtrim($this->base_url, '/') .'/'; | |
222 | } | |
223 | ||
224 | // And here we go... | |
225 | $output = ''; | |
226 | ||
227 | // Render the "First" link | |
228 | if ($this->first_link !== FALSE AND $this->cur_page > ($this->num_links + 1)) | |
229 | { | |
230 | $first_url = ($this->first_url == '') ? $this->base_url : $this->first_url; | |
231 | $output .= $this->first_tag_open.'<a '.$this->anchor_class.'href="'.$first_url.'">'.$this->first_link.'</a>'.$this->first_tag_close; | |
232 | } | |
233 | ||
234 | // Render the "previous" link | |
235 | if ($this->prev_link !== FALSE AND $this->cur_page != 1) | |
236 | { | |
237 | if ($this->use_page_numbers) | |
238 | { | |
239 | $i = $uri_page_number - 1; | |
240 | } | |
241 | else | |
242 | { | |
243 | $i = $uri_page_number - $this->per_page; | |
244 | } | |
245 | ||
246 | if ($i == 0 && $this->first_url != '') | |
247 | { | |
248 | $output .= $this->prev_tag_open.'<a '.$this->anchor_class.'href="'.$this->first_url.'">'.$this->prev_link.'</a>'.$this->prev_tag_close; | |
249 | } | |
250 | else | |
251 | { | |
252 | $i = ($i == 0) ? '' : $this->prefix.$i.$this->suffix; | |
253 | $output .= $this->prev_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$i.'">'.$this->prev_link.'</a>'.$this->prev_tag_close; | |
254 | } | |
255 | ||
256 | } | |
257 | ||
258 | // Render the pages | |
259 | if ($this->display_pages !== FALSE) | |
260 | { | |
261 | // Write the digit links | |
262 | for ($loop = $start -1; $loop <= $end; $loop++) | |
263 | { | |
264 | if ($this->use_page_numbers) | |
265 | { | |
266 | $i = $loop; | |
267 | } | |
268 | else | |
269 | { | |
270 | $i = ($loop * $this->per_page) - $this->per_page; | |
271 | } | |
272 | ||
273 | if ($i >= $base_page) | |
274 | { | |
275 | if ($this->cur_page == $loop) | |
276 | { | |
277 | $output .= $this->cur_tag_open.$loop.$this->cur_tag_close; // Current page | |
278 | } | |
279 | else | |
280 | { | |
281 | $n = ($i == $base_page) ? '' : $i; | |
282 | ||
283 | if ($n == '' && $this->first_url != '') | |
284 | { | |
285 | $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$this->first_url.'">'.$loop.'</a>'.$this->num_tag_close; | |
286 | } | |
287 | else | |
288 | { | |
289 | $n = ($n == '') ? '' : $this->prefix.$n.$this->suffix; | |
290 | ||
291 | $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$n.'">'.$loop.'</a>'.$this->num_tag_close; | |
292 | } | |
293 | } | |
294 | } | |
295 | } | |
296 | } | |
297 | ||
298 | // Render the "next" link | |
299 | if ($this->next_link !== FALSE AND $this->cur_page < $num_pages) | |
300 | { | |
301 | if ($this->use_page_numbers) | |
302 | { | |
303 | $i = $this->cur_page + 1; | |
304 | } | |
305 | else | |
306 | { | |
307 | $i = ($this->cur_page * $this->per_page); | |
308 | } | |
309 | ||
310 | $output .= $this->next_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$this->prefix.$i.$this->suffix.'">'.$this->next_link.'</a>'.$this->next_tag_close; | |
311 | } | |
312 | ||
313 | // Render the "Last" link | |
314 | if ($this->last_link !== FALSE AND ($this->cur_page + $this->num_links) < $num_pages) | |
315 | { | |
316 | if ($this->use_page_numbers) | |
317 | { | |
318 | $i = $num_pages; | |
319 | } | |
320 | else | |
321 | { | |
322 | $i = (($num_pages * $this->per_page) - $this->per_page); | |
323 | } | |
324 | $output .= $this->last_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$this->prefix.$i.$this->suffix.'">'.$this->last_link.'</a>'.$this->last_tag_close; | |
325 | } | |
326 | ||
327 | // Kill double slashes. Note: Sometimes we can end up with a double slash | |
328 | // in the penultimate link so we'll kill all double slashes. | |
329 | $output = preg_replace("#([^:])//+#", "\\1/", $output); | |
330 | ||
331 | // Add the wrapper HTML if exists | |
332 | $output = $this->full_tag_open.$output.$this->full_tag_close; | |
333 | ||
334 | return $output; | |
335 | } | |
336 | } | |
337 | // END Pagination Class | |
338 | ||
339 | /* End of file Pagination.php */ | |
340 | /* Location: ./system/libraries/Pagination.php */ |