* @version 1.0 * @package paginated-comments-pager */ class Paginated_Comments_Pager { /** * Items per page. * * This is used, along with $item_total, to calculate how many * pages are needed. * @var int */ var $items_per_page; /** * Total number of items * * This is used, along with $items_per_page, to calculate how many * pages are needed. * @var int */ var $item_total; /** * Current page * @var int */ var $current_page; /** * Number of pages needed * @var int */ var $num_pages; /** * Constructor */ function Paginated_Comments_Pager($items_per_page, $item_total) { $this->items_per_page = $items_per_page; $this->item_total = $item_total; $this->num_pages = (int) ceil($this->item_total / $this->items_per_page); $this->set_current_page(1); } /** * Set current page number * @param int $page */ function set_current_page($page) { $this->current_page = min($page, $this->num_pages()); $this->current_page = max($this->current_page, 1); } /** * Get current page * @return int */ function get_current_page() { return $this->current_page; } /** * Get items per page * @return int */ function get_items_per_page() { return $this->items_per_page; } /** * Get total items * @return int */ function get_total_items() { return $this->item_total; } /** * Number of pages needed * @return int */ function num_pages() { return $this->num_pages; } /** * Is last page * @return boolean */ function is_last_page() { return ($this->get_current_page() == $this->num_pages()); } /** * Is first page * @return boolean */ function is_first_page() { return ($this->get_current_page() == 1); } /** * Get page numbers within range * @param int $page_range number of pages to display at one time, default: all pages * @return array */ function get_page_numbers($page_range=null) { if ( !isset($page_range) ) { return range(1, $this->num_pages()); } else { // set boundaries $pages = $this->num_pages(); $range_halved = (int) floor($page_range / 2); $count_start = $this->current_page - $range_halved; $count_end = $this->current_page + $range_halved; // adjust boundaries while ( $count_start < 1 ) { $count_start++; $count_end++; } while ( $count_end > $pages ) { $count_end--; $count_start--; } $count_start = max($count_start, 1); return range($count_start, $count_end); } } } /* * Implements the Pager interface but inverts numbers. (Decorator pattern) */ class Paginated_Comments_InvertedPager { /** * Pager Object Reference * @var object */ var $pager; /** * Constructor */ function Paginated_Comments_InvertedPager(&$pager) { $this->pager =& $pager; } /** * Invert page order * @param int $page */ function _invert_page($page) { return $this->pager->num_pages() + 1 - $page; } /** * Set current page number * @param int $page */ function set_current_page($page) { $this->pager->set_current_page($this->_invert_page($page)); } /** * Get current page * @return int */ function get_current_page() { return $this->_invert_page($this->pager->get_current_page()); } /** * Get page numbers within range * @param int $page_range number of pages to display at one time, default: all pages * @return array */ function get_page_numbers($page_range=null) { return array_map(array(&$this, '_invert_page'), $this->pager->get_page_numbers($page_range)); } /** * Get items per page * @return int */ function get_items_per_page() { return $this->pager->get_items_per_page(); } /** * Get total items * @return int */ function get_total_items() { return $this->pager->get_total_items(); } /** * Number of pages needed * @return int */ function num_pages() { return $this->pager->num_pages(); } /** * Is last page * @return boolean */ function is_last_page() { return ($this->get_current_page() == $this->num_pages()); } /** * Is first page * @return boolean */ function is_first_page() { return ($this->get_current_page() == 1); } } /** * Prints page number links using a Pager instance */ class Paginated_Comments_PagePrinter { /** * Pager Object Reference * @var object */ var $pager; /** * URL formatting string for building page links * * This should be a formatting string which will be passed to sprintf() * (see: ), it should include 1 conversion * specification: %u (to hold the page number) * @var string */ var $url; /** * Number of pages to show at one time * @var int */ var $page_range; /** * Constructor */ function Paginated_Comments_PagePrinter(&$pager, $url='', $page_range=null) { $this->pager =& $pager; $this->set_page_range($page_range); $this->set_url($url); } /** * Generate previous link * @param string $text Text to link * @param string $title title attribute for the link * @return string */ function get_prev_link($text='«', $title='Previous Page') { if ( $this->pager->is_first_page() ) return ''; return ''.$text.''; } /** * Generate next link * @param string $text Text to link * @param string $title title attribute for the link * @return string */ function get_next_link($text='»', $title='Next Page') { if ( $this->pager->is_last_page() ) return ''; return ''.$text.''; } /** * Get page links * @return string HTML */ function get_links($separator=' ', $pre_cur_page='[', $post_cur_page=']') { $pages = $this->pager->num_pages(); $page_links= ''; // print page numbers $cur_page = $this->pager->get_current_page(); $num_links = array(); $page_numbers = $this->pager->get_page_numbers($this->page_range); $asc = ($page_numbers[0] < $page_numbers[1]); if ( $asc ) { if( $page_numbers[0] != 1 ) $num_links[] = '1 …"; } else { if( $page_numbers[0] != $this->pager->num_pages() ) $num_links[] = '".$this->pager->num_pages()." …"; } foreach ( $page_numbers as $i) { if ( $i == $cur_page ) $num_links[] = $pre_cur_page.$i.$post_cur_page; else $num_links[] = '$i"; } if( $asc ) { if( $page_numbers[count($page_numbers)-1] != $this->pager->num_pages() ) $num_links[] = '… ".$this->pager->num_pages().""; } else { if( $page_numbers[count($page_numbers)-1] != 1 ) $num_links[] = '… 1"; } $page_links .= implode($separator, $num_links); return $page_links; } /** * Set page range * @param int $max */ function set_page_range($max) { $this->page_range = $max; } /** * Set URL * @param string $url */ function set_url($url) { $this->url = $url; } /** * Get formatted URL (including page number) * @param int $page page number * @return string */ function get_url($page) { return sprintf($this->url, $page); } } ?>