/res_pager.tpl. ***************************************************************************/ class pager { private $link_url; private $min_pages_shown; private $max_pages_shown; // Use {page} in link_url als placeholder for the selected page number // and/or {offset} for the 0-based data offset of the selected page. function __construct($link_url, $min_pages_shown=2, $max_pages_shown=15) { global $tpl; $this->link_url = $link_url; $this->min_pages_shown = $min_pages_shown; if (($max_pages_shown % 2) == 0) $tpl->error("pager: max pages shown must be odd"); $this->max_pages_shown = $max_pages_shown; } function make_from_pagenr($current_page, $total_pages, $page_size=false) { global $tpl; if (mb_strpos($this->link_url,'{offset}') && $page_size === false) { $tpl->error('page size is not set for offset paging'); } elseif ($total_pages < $this->min_pages_shown) { // not enough pages - disable pager $tpl->assign('pages_list',false); } else { $first_page = 1; $last_page = $total_pages; $current_page = min(max($current_page,$first_page),$last_page); if ($current_page == $first_page) { $tpl->assign('pages_first_link',false); $tpl->assign('pages_prev_link',false); } else { $tpl->assign('pages_first_link', $this->pagelink($first_page, $page_size)); $tpl->assign('pages_prev_link', $this->pagelink($current_page-1, $page_size)); } $pages = array(); $lrspan = ($this->max_pages_shown-1) / 2; $from_page = max($first_page, $current_page-$lrspan); $to_page = min($last_page, max($first_page, $current_page-$lrspan) + $this->max_pages_shown - 1); $from_page = max($first_page, $to_page - $this->max_pages_shown + 1); for ($page = $from_page; $page <= $to_page; $page++) { if ($page == $current_page) $pages[$page] = false; else $pages[$page] = $this->pagelink($page, $page_size); } $tpl->assign('pages_list', $pages); if ($current_page == $last_page) { $tpl->assign('pages_next_link',false); $tpl->assign('pages_last_link',false); } else { $tpl->assign('pages_next_link', $this->pagelink($current_page+1, $page_size)); $tpl->assign('pages_last_link', $this->pagelink($last_page, $page_size)); } if ($last_page-$first_page < 2) { $tpl->assign('pages_first_link',null); $tpl->assign('pages_last_link',null); } } } function make_from_offset($current_offset, $total_items, $page_size) { $this->make_from_pagenr( floor($current_offset/$page_size) + 1, ceil($total_items/$page_size), $page_size); } private function pagelink($page,$page_size) { return mb_ereg_replace('{page}', $page, mb_ereg_replace('{offset}', ($page-1) * $page_size, $this->link_url)); } } ?>