Blame | Last modification | View Log | Download
<?php/*V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.Released under both BSD license and Lesser GPL library license.Whenever there is any discrepancy between the two licenses,the BSD license will take precedence.Set tabs to 4 for best viewing.This class provides recordset pagination withFirst/Prev/Next/Last links.Feel free to modify this class for your own use asit is very basic. To learn how to use it, see theexample in adodb/tests/testpaging.php."Pablo Costa" <pablo@cbsp.com.br> implemented Render_PageLinks().Please note, this class is entirely unsupported,and no free support requests except for bug reportswill be entertained by the author.*/class ADODB_Pager {var $id; // unique id for pager (defaults to 'adodb')var $db; // ADODB connection objectvar $sql; // sql usedvar $rs; // recordset generatedvar $curr_page; // current page number before Render() called, calculated in constructorvar $rows; // number of rows per pagevar $linksPerPage=10; // number of links per page in navigation barvar $showPageLinks;var $gridAttributes = 'width=100% border=1 bgcolor=white';// Localize text strings herevar $first = '<code>|<</code>';var $prev = '<code><<</code>';var $next = '<code>>></code>';var $last = '<code>>|</code>';var $moreLinks = '...';var $startLinks = '...';var $gridHeader = false;var $htmlSpecialChars = true;var $page = 'Page';var $linkSelectedColor = 'red';var $cache = 0; #secs to cache with CachePageExecute()//----------------------------------------------// constructor//// $db adodb connection object// $sql sql statement// $id optional id to identify which pager,// if you have multiple on 1 page.// $id should be only be [a-z0-9]*//function ADODB_Pager(&$db,$sql,$id = 'adodb', $showPageLinks = false){global $PHP_SELF;$curr_page = $id.'_curr_page';if (empty($PHP_SELF)) $PHP_SELF = htmlspecialchars($_SERVER['PHP_SELF']); // htmlspecialchars() to prevent XSS attacks$this->sql = $sql;$this->id = $id;$this->db = $db;$this->showPageLinks = $showPageLinks;$next_page = $id.'_next_page';if (isset($_GET[$next_page])) {$_SESSION[$curr_page] = (integer) $_GET[$next_page];}if (empty($_SESSION[$curr_page])) $_SESSION[$curr_page] = 1; ## at first page$this->curr_page = $_SESSION[$curr_page];}//---------------------------// Display link to first pagefunction Render_First($anchor=true){global $PHP_SELF;if ($anchor) {?><a href="<?php echo $PHP_SELF,'?',$this->id;?>_next_page=1"><?php echo $this->first;?></a> <?php} else {print "$this->first ";}}//--------------------------// Display link to next pagefunction render_next($anchor=true){global $PHP_SELF;if ($anchor) {?><a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->AbsolutePage() + 1 ?>"><?php echo $this->next;?></a> <?php} else {print "$this->next ";}}//------------------// Link to last page//// for better performance with large recordsets, you can set// $this->db->pageExecuteCountRows = false, which disables// last page counting.function render_last($anchor=true){global $PHP_SELF;if (!$this->db->pageExecuteCountRows) return;if ($anchor) {?><a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->LastPageNo() ?>"><?php echo $this->last;?></a> <?php} else {print "$this->last ";}}//---------------------------------------------------// original code by "Pablo Costa" <pablo@cbsp.com.br>function render_pagelinks(){global $PHP_SELF;$pages = $this->rs->LastPageNo();$linksperpage = $this->linksPerPage ? $this->linksPerPage : $pages;for($i=1; $i <= $pages; $i+=$linksperpage){if($this->rs->AbsolutePage() >= $i){$start = $i;}}$numbers = '';$end = $start+$linksperpage-1;$link = $this->id . "_next_page";if($end > $pages) $end = $pages;if ($this->startLinks && $start > 1) {$pos = $start - 1;$numbers .= "<a href=$PHP_SELF?$link=$pos>$this->startLinks</a> ";}for($i=$start; $i <= $end; $i++) {if ($this->rs->AbsolutePage() == $i)$numbers .= "<font color=$this->linkSelectedColor><b>$i</b></font> ";else$numbers .= "<a href=$PHP_SELF?$link=$i>$i</a> ";}if ($this->moreLinks && $end < $pages)$numbers .= "<a href=$PHP_SELF?$link=$i>$this->moreLinks</a> ";print $numbers . ' ';}// Link to previous pagefunction render_prev($anchor=true){global $PHP_SELF;if ($anchor) {?><a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->AbsolutePage() - 1 ?>"><?php echo $this->prev;?></a> <?php} else {print "$this->prev ";}}//--------------------------------------------------------// Simply rendering of grid. You should override this for// better control over the format of the grid//// We use output buffering to keep code clean and readable.function RenderGrid(){global $gSQLBlockRows; // used by rs2html to indicate how many rows to displayinclude_once(ADODB_DIR.'/tohtml.inc.php');ob_start();$gSQLBlockRows = $this->rows;rs2html($this->rs,$this->gridAttributes,$this->gridHeader,$this->htmlSpecialChars);$s = ob_get_contents();ob_end_clean();return $s;}//-------------------------------------------------------// Navigation bar//// we use output buffering to keep the code easy to read.function RenderNav(){ob_start();if (!$this->rs->AtFirstPage()) {$this->Render_First();$this->Render_Prev();} else {$this->Render_First(false);$this->Render_Prev(false);}if ($this->showPageLinks){$this->Render_PageLinks();}if (!$this->rs->AtLastPage()) {$this->Render_Next();$this->Render_Last();} else {$this->Render_Next(false);$this->Render_Last(false);}$s = ob_get_contents();ob_end_clean();return $s;}//-------------------// This is the footerfunction RenderPageCount(){if (!$this->db->pageExecuteCountRows) return '';$lastPage = $this->rs->LastPageNo();if ($lastPage == -1) $lastPage = 1; // check for empty rs.if ($this->curr_page > $lastPage) $this->curr_page = 1;return "<font size=-1>$this->page ".$this->curr_page."/".$lastPage."</font>";}//-----------------------------------// Call this class to draw everything.function Render($rows=10){global $ADODB_COUNTRECS;$this->rows = $rows;if ($this->db->dataProvider == 'informix') $this->db->cursorType = IFX_SCROLL;$savec = $ADODB_COUNTRECS;if ($this->db->pageExecuteCountRows) $ADODB_COUNTRECS = true;if ($this->cache)$rs = &$this->db->CachePageExecute($this->cache,$this->sql,$rows,$this->curr_page);else$rs = &$this->db->PageExecute($this->sql,$rows,$this->curr_page);$ADODB_COUNTRECS = $savec;$this->rs = &$rs;if (!$rs) {print "<h3>Query failed: $this->sql</h3>";return;}if (!$rs->EOF && (!$rs->AtFirstPage() || !$rs->AtLastPage()))$header = $this->RenderNav();else$header = " ";$grid = $this->RenderGrid();$footer = $this->RenderPageCount();$this->RenderLayout($header,$grid,$footer);$rs->Close();$this->rs = false;}//------------------------------------------------------// override this to control overall layout and formatingfunction RenderLayout($header,$grid,$footer,$attributes='border=1 bgcolor=beige'){echo "<table ".$attributes."><tr><td>",$header,"</td></tr><tr><td>",$grid,"</td></tr><tr><td>",$footer,"</td></tr></table>";}}?>