ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/WEBCONDDB/php_CondDB/adodb/adodb-pager.inc.php
Revision: 1.1
Committed: Fri Jun 29 07:49:19 2007 UTC (17 years, 10 months ago) by kdziedzi
Branch: MAIN
CVS Tags: V01-01-02, V01-01-01, V1_01_00, V01-01-00, V1_00_01, HEAD
Log Message:
Introducing new order in project

File Contents

# User Rev Content
1 kdziedzi 1.1 <?php
2    
3     /*
4     V4.93 10 Oct 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
5     Released under both BSD license and Lesser GPL library license.
6     Whenever there is any discrepancy between the two licenses,
7     the BSD license will take precedence.
8     Set tabs to 4 for best viewing.
9    
10     This class provides recordset pagination with
11     First/Prev/Next/Last links.
12    
13     Feel free to modify this class for your own use as
14     it is very basic. To learn how to use it, see the
15     example in adodb/tests/testpaging.php.
16    
17     "Pablo Costa" <pablo@cbsp.com.br> implemented Render_PageLinks().
18    
19     Please note, this class is entirely unsupported,
20     and no free support requests except for bug reports
21     will be entertained by the author.
22    
23     */
24     class ADODB_Pager {
25     var $id; // unique id for pager (defaults to 'adodb')
26     var $db; // ADODB connection object
27     var $sql; // sql used
28     var $rs; // recordset generated
29     var $curr_page; // current page number before Render() called, calculated in constructor
30     var $rows; // number of rows per page
31     var $linksPerPage=10; // number of links per page in navigation bar
32     var $showPageLinks;
33    
34     var $gridAttributes = 'width=100% border=1 bgcolor=white';
35    
36     // Localize text strings here
37     var $first = '<code>|&lt;</code>';
38     var $prev = '<code>&lt;&lt;</code>';
39     var $next = '<code>>></code>';
40     var $last = '<code>>|</code>';
41     var $moreLinks = '...';
42     var $startLinks = '...';
43     var $gridHeader = false;
44     var $htmlSpecialChars = true;
45     var $page = 'Page';
46     var $linkSelectedColor = 'red';
47     var $cache = 0; #secs to cache with CachePageExecute()
48    
49     //----------------------------------------------
50     // constructor
51     //
52     // $db adodb connection object
53     // $sql sql statement
54     // $id optional id to identify which pager,
55     // if you have multiple on 1 page.
56     // $id should be only be [a-z0-9]*
57     //
58     function ADODB_Pager(&$db,$sql,$id = 'adodb', $showPageLinks = false)
59     {
60     global $PHP_SELF;
61    
62     $curr_page = $id.'_curr_page';
63     if (empty($PHP_SELF)) $PHP_SELF = htmlspecialchars($_SERVER['PHP_SELF']); // htmlspecialchars() to prevent XSS attacks
64    
65     $this->sql = $sql;
66     $this->id = $id;
67     $this->db = $db;
68     $this->showPageLinks = $showPageLinks;
69    
70     $next_page = $id.'_next_page';
71    
72     if (isset($_GET[$next_page])) {
73     $_SESSION[$curr_page] = (integer) $_GET[$next_page];
74     }
75     if (empty($_SESSION[$curr_page])) $_SESSION[$curr_page] = 1; ## at first page
76    
77     $this->curr_page = $_SESSION[$curr_page];
78    
79     }
80    
81     //---------------------------
82     // Display link to first page
83     function Render_First($anchor=true)
84     {
85     global $PHP_SELF;
86     if ($anchor) {
87     ?>
88     <a href="<?php echo $PHP_SELF,'?',$this->id;?>_next_page=1"><?php echo $this->first;?></a> &nbsp;
89     <?php
90     } else {
91     print "$this->first &nbsp; ";
92     }
93     }
94    
95     //--------------------------
96     // Display link to next page
97     function render_next($anchor=true)
98     {
99     global $PHP_SELF;
100    
101     if ($anchor) {
102     ?>
103     <a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->AbsolutePage() + 1 ?>"><?php echo $this->next;?></a> &nbsp;
104     <?php
105     } else {
106     print "$this->next &nbsp; ";
107     }
108     }
109    
110     //------------------
111     // Link to last page
112     //
113     // for better performance with large recordsets, you can set
114     // $this->db->pageExecuteCountRows = false, which disables
115     // last page counting.
116     function render_last($anchor=true)
117     {
118     global $PHP_SELF;
119    
120     if (!$this->db->pageExecuteCountRows) return;
121    
122     if ($anchor) {
123     ?>
124     <a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->LastPageNo() ?>"><?php echo $this->last;?></a> &nbsp;
125     <?php
126     } else {
127     print "$this->last &nbsp; ";
128     }
129     }
130    
131     //---------------------------------------------------
132     // original code by "Pablo Costa" <pablo@cbsp.com.br>
133     function render_pagelinks()
134     {
135     global $PHP_SELF;
136     $pages = $this->rs->LastPageNo();
137     $linksperpage = $this->linksPerPage ? $this->linksPerPage : $pages;
138     for($i=1; $i <= $pages; $i+=$linksperpage)
139     {
140     if($this->rs->AbsolutePage() >= $i)
141     {
142     $start = $i;
143     }
144     }
145     $numbers = '';
146     $end = $start+$linksperpage-1;
147     $link = $this->id . "_next_page";
148     if($end > $pages) $end = $pages;
149    
150    
151     if ($this->startLinks && $start > 1) {
152     $pos = $start - 1;
153     $numbers .= "<a href=$PHP_SELF?$link=$pos>$this->startLinks</a> ";
154     }
155    
156     for($i=$start; $i <= $end; $i++) {
157     if ($this->rs->AbsolutePage() == $i)
158     $numbers .= "<font color=$this->linkSelectedColor><b>$i</b></font> ";
159     else
160     $numbers .= "<a href=$PHP_SELF?$link=$i>$i</a> ";
161    
162     }
163     if ($this->moreLinks && $end < $pages)
164     $numbers .= "<a href=$PHP_SELF?$link=$i>$this->moreLinks</a> ";
165     print $numbers . ' &nbsp; ';
166     }
167     // Link to previous page
168     function render_prev($anchor=true)
169     {
170     global $PHP_SELF;
171     if ($anchor) {
172     ?>
173     <a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->AbsolutePage() - 1 ?>"><?php echo $this->prev;?></a> &nbsp;
174     <?php
175     } else {
176     print "$this->prev &nbsp; ";
177     }
178     }
179    
180     //--------------------------------------------------------
181     // Simply rendering of grid. You should override this for
182     // better control over the format of the grid
183     //
184     // We use output buffering to keep code clean and readable.
185     function RenderGrid()
186     {
187     global $gSQLBlockRows; // used by rs2html to indicate how many rows to display
188     include_once(ADODB_DIR.'/tohtml.inc.php');
189     ob_start();
190     $gSQLBlockRows = $this->rows;
191     rs2html($this->rs,$this->gridAttributes,$this->gridHeader,$this->htmlSpecialChars);
192     $s = ob_get_contents();
193     ob_end_clean();
194     return $s;
195     }
196    
197     //-------------------------------------------------------
198     // Navigation bar
199     //
200     // we use output buffering to keep the code easy to read.
201     function RenderNav()
202     {
203     ob_start();
204     if (!$this->rs->AtFirstPage()) {
205     $this->Render_First();
206     $this->Render_Prev();
207     } else {
208     $this->Render_First(false);
209     $this->Render_Prev(false);
210     }
211     if ($this->showPageLinks){
212     $this->Render_PageLinks();
213     }
214     if (!$this->rs->AtLastPage()) {
215     $this->Render_Next();
216     $this->Render_Last();
217     } else {
218     $this->Render_Next(false);
219     $this->Render_Last(false);
220     }
221     $s = ob_get_contents();
222     ob_end_clean();
223     return $s;
224     }
225    
226     //-------------------
227     // This is the footer
228     function RenderPageCount()
229     {
230     if (!$this->db->pageExecuteCountRows) return '';
231     $lastPage = $this->rs->LastPageNo();
232     if ($lastPage == -1) $lastPage = 1; // check for empty rs.
233     if ($this->curr_page > $lastPage) $this->curr_page = 1;
234     return "<font size=-1>$this->page ".$this->curr_page."/".$lastPage."</font>";
235     }
236    
237     //-----------------------------------
238     // Call this class to draw everything.
239     function Render($rows=10)
240     {
241     global $ADODB_COUNTRECS;
242    
243     $this->rows = $rows;
244    
245     if ($this->db->dataProvider == 'informix') $this->db->cursorType = IFX_SCROLL;
246    
247     $savec = $ADODB_COUNTRECS;
248     if ($this->db->pageExecuteCountRows) $ADODB_COUNTRECS = true;
249     if ($this->cache)
250     $rs = &$this->db->CachePageExecute($this->cache,$this->sql,$rows,$this->curr_page);
251     else
252     $rs = &$this->db->PageExecute($this->sql,$rows,$this->curr_page);
253     $ADODB_COUNTRECS = $savec;
254    
255     $this->rs = &$rs;
256     if (!$rs) {
257     print "<h3>Query failed: $this->sql</h3>";
258     return;
259     }
260    
261     if (!$rs->EOF && (!$rs->AtFirstPage() || !$rs->AtLastPage()))
262     $header = $this->RenderNav();
263     else
264     $header = "&nbsp;";
265    
266     $grid = $this->RenderGrid();
267     $footer = $this->RenderPageCount();
268    
269     $this->RenderLayout($header,$grid,$footer);
270    
271     $rs->Close();
272     $this->rs = false;
273     }
274    
275     //------------------------------------------------------
276     // override this to control overall layout and formating
277     function RenderLayout($header,$grid,$footer,$attributes='border=1 bgcolor=beige')
278     {
279     echo "<table ".$attributes."><tr><td>",
280     $header,
281     "</td></tr><tr><td>",
282     $grid,
283     "</td></tr><tr><td>",
284     $footer,
285     "</td></tr></table>";
286     }
287     }
288    
289    
290     ?>