(boolean)first page link, 'last' => boolean, 'prev' => boolean, 'next' => boolean) * @param string Bits to process * * @return string Compiled HTML */ protected abstract function _navigationProcessor($baselink, $next, $prev, $show, $bits); /** * Set the Pagination->perpage and Pagination->page variables */ protected abstract function _setVariables(); /** * Constructor */ public function __construct() { if (!BSApp::$input instanceof BSInput) { throw new Exception('BSApp::$input is not an instance of BSInput'); } } /** * Returns the current page number * * @return integer Current page */ public function getPage() { return $this->page; } /** * Returns the current perpage value * * @return integer Current perpage */ public function getPerPage() { return $this->perpage; } /** * Sets total * * @param integer Total number */ public function setTotal($total) { $this->total = $total; } /** * Returns the number of pages to be in the navigator * * @param integer Number of pages */ public function getPageCount() { return $this->pagecount; } /** * Takes all of the information from the set() functions and then * prepares all of the data through verification */ public function processIncomingData() { $this->_setVariables(); $this->page = BSApp::$input->clean($this->page, TYPE_INT); $this->perpage = BSApp::$input->clean($this->perpage, TYPE_INT); $this->pagelinks = BSApp::$input->clean($this->pagelinks, TYPE_INT); if ($this->page <= 0) { $this->page = 1; } if ($this->perpage <= 0) { $this->perpage = $this->defaultperpage; } if ($this->perpage > $this->maxperpage) { $this->perpage = $this->maxperpage; } $this->perpage = BSApp::$input->clean($this->perpage, TYPE_INT); } /** * Takes the variables and splits up the pages */ public function splitPages() { $this->pagecount = ceil($this->total / $this->perpage); if ($this->pagelinks == 0) { $this->pagelinks = $this->pagecount; } } /** * Returns the lower limit of the pages * * @param integer Page number * * @return integer Lower result limit */ public function fetchLimit($page = null) { if ($page === null) { $page = $this->page; } $limit = $page * $this->perpage; if ($page < 1) { $page = 1; $limit = 0; } else if ($page > $this->pagecount) { $page = $this->pagecount - 1; $limit = $this->total; } if ($limit < 0) { return 0; } else if ($limit > $this->total) { return $this->total; } else { return $limit; } } /** * Constructs the page navigator * * @param string Base link path * @param bool Add a ? or a & to the path so it's link-friendly * * @return string Generated HTML page navigator */ public function constructPageNav($baselink, $addParam = true) { // handle base link if ($addParam) { if (strpos($baselink, '?') === false) { $baselink .= '?'; } else if (!strpos($baselink, '#\?$#') && !strpos($baselink, '&')) { $baselink .= '&'; } } // first page number in page nav $startpage = $this->page - $this->pagelinks; if ($startpage < 1) { $startpage = 1; } // last page number in page nav $endpage = $this->page + $this->pagelinks; if ($endpage > $this->pagecount) { $endpage = $this->pagecount; } // prev page in page nav $prevpage = $this->page - 1; if ($prevpage < 1) { $prevpage = 1; } // next page in page nav $nextpage = $this->page + 1; if ($nextpage > $this->pagecount) { $nextpage = $this->pagecount; } // show the prev page $show['prev'] = true; if ($this->page == $startpage) { $show['prev'] = false; } // show the next page $show['next'] = true; if ($this->page == $endpage) { $show['next'] = false; } // show the first page $show['first'] = false; if ($startpage > 1) { $show['first'] = true; } // show the last page $show['last'] = false; if ($endpage < $this->pagecount) { $show['last'] = true; } // construct the page bits $bits = ''; for ($i = $startpage; $i <= $endpage; $i++) { if ($i == $this->page) { $nolink = true; } else { $nolink = false; } $bits .= $this->_bitProcessor($baselink, $nolink, $i); } return $this->_navigationProcessor($baselink, $nextpage, $prevpage, $show, $bits); } } ?>