|
я на своих проектах пользуюсь следующим классом пагинации:Код PHP<?php class Pagination { var $base_url = ''; //ссылка по которой строим пагинацию var $total_rows = ''; //количество ссылок которые нам нужны var $per_page = 10; // сколько у нас на странице var $num_links = 2; // количество выводимых ссылок var $cur_page = 0; var $first_link = '‹ First'; //стиль первой ссылки var $next_link = '>'; //стиль следующей ссылки var $prev_link = '<'; //стиль предыдущей ссылки var $last_link = 'Last ›'; //стиль последней ссылки//Обертки вокруг ссылок пагинации - чтобы было например <ul><li>первая ссылка</li> <li>2</li><li>3</li><li>последняя ссылка</li></ul> var $full_tag_open = ''; //обертка вокруг всех ссылок - тот самый <ul> var $full_tag_close = ''; var $first_tag_open = ''; //первая страница var $first_tag_close = ' '; var $last_tag_open = ' '; //последняя страница var $last_tag_close = ''; var $cur_tag_open = ' <b>'; //текущая страница var $cur_tag_close = '</b>'; var $next_tag_open = ' '; //следующая страница var $next_tag_close = ' '; var $prev_tag_open = ' '; //предыдущая страница var $prev_tag_close = ''; var $num_tag_open = ' '; //цыферы var $num_tag_close = ''; /** * Constructor * * @param array initialization parameters */ function Pagination($params = array()) { if (count($params) > 0) { $this->initialize($params); } } // -------------------------------------------------------------------- /** * Initialize * * @param array initialization parameters * @return void */ function initialize($params = array()) { if (count($params) > 0) { foreach ($params as $key => $val) { if (isset($this->$key)) { $this->$key = $val; } } } } // -------------------------------------------------------------------- /** * Generate the pagination links * * @return string */ function create_links() { // If our item count or per-page total is zero there is no need to continue. if ($this->total_rows == 0 OR $this->per_page == 0) { return ''; } // Calculate the total number of pages $num_pages = ceil($this->total_rows / $this->per_page); // Is there only one page? Hm... nothing more to do here then. if ($num_pages == 1) { return ''; } // Determine the current page number. $page = isset($_GET['page']); if ($page != 0) { $page = $_GET['page']; $this->cur_page = $page; // Prep the current page - no funny business! $this->cur_page = (int) $this->cur_page; } $this->num_links = (int)$this->num_links; if ($this->num_links < 1) { return 'Your number of links must be a positive number.'; } if ( ! is_numeric($this->cur_page)) { $this->cur_page = 0; } // Is the page number beyond the result range? // If so we show the last page if ($this->cur_page > $this->total_rows) { $this->cur_page = ($num_pages - 1) * $this->per_page; } $uri_page_number = $this->cur_page; $this->cur_page = floor(($this->cur_page/$this->per_page) + 1); // Calculate the start and end numbers. These determine // which number to start and end the digit links with $start = (($this->cur_page - $this->num_links) > 0) ? $this->cur_page - ($this->num_links - 1) : 1; $end = (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links : $num_pages; // Add a trailing slash to the base URL if needed $this->base_url = rtrim($this->base_url, '/') .''; // And here we go... $output = ''; // Render the "First" link if ($this->cur_page > $this->num_links) { $output .= $this->first_tag_open.'<a href="'.$this->base_url.'">'.$this->first_link.'</a>'.$this->first_tag_close; } // Render the "previous" link if ($this->cur_page != 1) { $i = $uri_page_number - $this->per_page; if ($i == 0) $i = ''; $output .= $this->prev_tag_open.'<a href="'.$this->base_url.$i.'">'.$this->prev_link.'</a>'.$this->prev_tag_close; } // Write the digit links for ($loop = $start -1; $loop <= $end; $loop++) { $i = ($loop * $this->per_page) - $this->per_page; if ($i >= 0) { if ($this->cur_page == $loop) { $output .= $this->cur_tag_open.$loop.$this->cur_tag_close; // Current page } else { $n = ($i == 0) ? '' : $i; $output .= $this->num_tag_open.'<a href="'.$this->base_url.$n.'">'.$loop.'</a>'.$this->num_tag_close; } } } // Render the "next" link if ($this->cur_page < $num_pages) { $output .= $this->next_tag_open.'<a href="'.$this->base_url.($this->cur_page * $this->per_page).'">'.$this->next_link.'</a>'.$this->next_tag_close; } // Render the "Last" link if (($this->cur_page + $this->num_links) < $num_pages) { $i = (($num_pages * $this->per_page) - $this->per_page); $output .= $this->last_tag_open.'<a href="'.$this->base_url.$i.'">'.$this->last_link.'</a>'.$this->last_tag_close; } // Kill double slashes. Note: Sometimes we can end up with a double slash // in the penultimate link so we'll kill all double slashes. $output = preg_replace("#([^:])//+#", "\\1/", $output); // Add the wrapper HTML if exists $output = $this->full_tag_open.$output.$this->full_tag_close; return $output; }}// END Pagination Class?>пример использования - возьмем эту страницу.Код PHP//конфигурация класса - можно конешно через сетторы (__set), но мне было удобнее массивом $config['base_url'] = 'http://pyha.ru/forum/topic/299.'; $config['per_page'] = '15'; $config['num_links'] = 4; $config['first_link'] = '« В начало |'; $config['last_link'] = '| В конец »'; $config['next_link'] = '>'; $config['prev_link'] = '<'; $config['full_tag_open'] = '<ul class="pagin">'; $config['full_tag_close'] = '</ul>'; $config['first_tag_open'] = '<li>'; $config['first_tag_close'] = '</li>'; $config['last_tag_open'] = '<li>'; $config['last_tag_close'] = '</li>'; $config['next_tag_open'] = '<li>'; $config['next_tag_close'] = '</li>'; $config['prev_tag_open'] = '<li>'; $config['prev_tag_close'] = '</li>'; $config['cur_tag_open'] = '<li class="active"><div>'; $config['cur_tag_close'] = '</div></li>'; $config['num_tag_open'] = '<li>'; $config['num_tag_close'] = '</li>'; $page = (empty($_GET['page']))? 0 : (int)$_GET['page']; $topics = $Tred->getTopics('299', $page); //массив топиков. Получаем на конкретно нужной странице $config['total_rows'] = $Tred->getCountTopics('299'); //всего допустим 74 топика, $pagination = new Pagination(); $pagination->initialize($config); echo $pagination->create_links(); foreach ($topics as $topic) { //вывод топика }или пример 2. Код PHP // конфиг как в примере 1 $page = (empty($_GET['page']))? 0 : (int)$_GET['page']; $topics = $Tred->getTopics('299'); //массив топиков. Получаем все топики. $config['total_rows'] = count($topics); //всего допустим 74 топика, $topics = array_slice($topics, $page, $config['per_page']); //обрезаем массив чтобы выводил столько сколько нужно $pagination = new Pagination(); $pagination->initialize($config); echo $pagination->create_links(); foreach ($topics as $topic) { //вывод топика }недостатки второго способа - при большом объеме массива он просто в памяти его будет держать.
|