]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/WikiDB/adodb/adodb-pager.inc.php
Upgrade adodb
[SourceForge/phpwiki.git] / lib / WikiDB / adodb / adodb-pager.inc.php
1 <?php
2
3 /*
4         V5.18 3 Sep 2012   (c) 2000-2012 John Lim (jlim#natsoft.com). 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 ?>