source: sandbox/2.5.1-evolucao/phpgwapi/inc/adodb/adodb-pager.inc.php @ 8222

Revision 8222, 7.9 KB checked in by angelo, 11 years ago (diff)

Ticket #3491 - Compatibilizar Expresso com novas versoes do PHP

  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
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*/
24class 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?>
Note: See TracBrowser for help on using the repository browser.