source: trunk/workflow/inc/local/classes/class.wf_paging.php @ 7655

Revision 7655, 5.6 KB checked in by douglasz, 11 years ago (diff)

Ticket #3236 - Melhorias de performance no codigo do Expresso.

  • Property svn:executable set to *
Line 
1<?php
2require_once(PHPGW_SERVER_ROOT.SEP.'workflow'.SEP.'inc'.SEP.'class.Paging.inc.php');
3/**
4* Class for generating paging links
5* @author Sidnei Augusto Drovetto Junior
6* @license http://www.gnu.org/copyleft/gpl.html GPL
7* @package Workflow
8* @subpackage local 
9*/
10class wf_paging extends Paging
11{
12       
13        /**
14         * @var boolean $flagUseDatabase Indica se a base de dados será utilizada
15         * @access public
16         */
17        var $flagUseDatabase;
18        /**
19         * @var boolean $flagEnableSorting Habilita o sort
20         * @access public
21         */
22        var $flagEnableSorting;
23        /**
24         * @var array $storage Armazena os dados da consulta
25         * @access public
26         */
27        var $storage;
28        /**
29         * @var array $titles Armazena o titulo dos links
30         * @access public
31         */
32        var $titles;
33        /**
34         * @var array $generatedTitles Armazena os titulos dos links gerados
35         * @access public
36         */
37        var $generatedTitles ;
38        /**
39         * Inicializa os atributos da classe com valores padrões
40         * @return void
41         * @access private
42         */
43        function initialize()
44        {
45                parent::initialize();
46
47                $this->storage = array();
48                $this->titles = null;
49                $this->generatedTitles = null;
50        }
51        /**
52         * Utilizado para configurar a paginação
53         * @param int $pItemsPerPage Numero de Itens por página
54         * @param array $request requisição
55         * @return void
56         * @access public
57         */
58        function configure($pItemsPerPage, $request = null)
59        {
60                $this->itemsPerPage = $pItemsPerPage;
61                $this->originalRequest = $request;
62
63                $this->initialize();
64        }
65        /**
66         * Construtor da classe wf_paging
67         * @return object
68         * @access public
69         */
70        function wf_paging()
71        {
72        }
73        /**
74         * Utilizado para habilitar o flag que indica para fazer o sort
75         * @param boolean $value (true ou false)
76         * @access public
77         */
78        function enableSorting($value)
79        {
80                $this->flagEnableSorting = $value;
81        }
82        /**
83         * Utilizado para habilitar o flag que indica o uso de uma database
84         * @param boolean $value (true ou false)
85         * @access public
86         */
87        function useDatabase($value)
88        {
89                $this->flagUseDatabase = $value;
90        }
91        /**
92         * Realiza a paginação do resultado de uma consulta.
93         * @param object $db  banco de dados da pesquisa
94         * @param string $sql consulta em sql
95         * @param array $values Valores que serão associados à query através de bind (opcional)
96         * @return mixed (array ou boolean)
97         * @access public
98         */
99        function restrictDBItems($db, $sql, $values = false)
100        {
101                if (!$this->flagUseDatabase)
102                        return false;
103
104                /* adiciona ordenação (se requisitado) */
105                if ($this->flagEnableSorting)
106                        if (isset($this->storage['s_co']))
107                                $sql .= " ORDER BY " . $this->storage['s_co'] . " " . (($this->storage['s_so'] == 0) ? "DESC" : "ASC");
108
109                /* utilliza diretamente o objeto ADOdb */
110                $adoDB = &$db->Link_ID;
111
112                /* executa a consulta (com possibilidade de passar variáveis por bind */
113                $resultSet = $adoDB->query($sql, $values);
114
115                /* faz a contagem de registros e extrai a quantidade desejada */
116                $this->itemsCount = $resultSet->RecordCount();
117                $this->items = $adoDB->_rs2rs($resultSet, $this->itemsPerPage, $this->nextItem, true)->GetArray();
118
119                return parent::restrictItems($this->items, $this->itemsCount);
120        }
121
122        /**
123         * Utilizado para fazer o parse numa requisição
124         * @param array $request requisição
125         * @return void
126         * @access public
127         */
128        function parseRequest($request)
129        {
130                parent::parseRequest($request);
131                $this->newRequest = $this->_cleanRequest(array("p_page", "s_co", "s_so"), $request);
132        }
133
134        /**
135         * Utilizado para determinar os parametros (links) para o sort 
136         * @param array $ptitles
137         * @return void
138         * @access public
139         */
140        function setSortingTitles($pTitles)
141        {
142                $this->titles = $pTitles;
143                $this->generateSortingTitles();
144        }
145    /**
146         * Utilizado para buscar os links possíves para o sort 
147         * @return void
148         * @access public
149         */
150        function getSortingTitles()
151        {
152                return $this->generatedTitles;
153        }
154       
155        /**
156         * Utilizado para gerar os parametros (links) possíves para o sort 
157         * @return boolean
158         * @access public
159         */
160        function generateSortingTitles()
161        {
162                if (is_null($this->titles))
163                        return false;
164
165                if (!empty($this->newRequest))
166                        $charSeparator = "&amp;";
167                else
168                        $charSeparator = "";
169               
170                $requestSco = (isset($this->originalRequest['s_co'])) ? $this->originalRequest['s_co'] : 0;
171                $requestSco = (is_numeric($requestSco)) ? (int) $requestSco : 0;
172                $requestSso = (isset($this->originalRequest['s_so'])) ? $this->originalRequest['s_so'] : 0;
173                $requestSso = (is_numeric($requestSso)) ? (int) $requestSso : 0;
174                if ($requestSso != 1)
175                        $requestSso = 0;
176
177                $allowedIds = array();
178                $this->generatedTitles = array();
179                foreach ($this->titles as $title)
180                {
181                        $sco = $title['id'];
182                        $allowedIds[] = $sco;
183                        $sso = 0;
184                        $arrow = "";
185                        if ($sco == $requestSco)
186                        {
187                                if ($requestSso == 0)
188                                {
189                                        $sso = 1;
190                                        $arrow = "&nbsp;&nbsp;&uarr;";
191                                }
192                                else
193                                {
194                                        $sso = 0;
195                                        $arrow = "&nbsp;&nbsp;&darr;";
196                                }
197                        }
198                        $title['link'] = $this->baseLink . "?" . $this->newRequest . $charSeparator . "s_co=$sco&amp;s_so=$sso";
199                        $title['original_name'] = $title['name'];
200                        $title['name'] .= $arrow;
201                        $this->generatedTitles[] = $title;
202                }
203               
204                $allowedIds = array_values(array_unique($allowedIds));
205                $this->storage['s_co'] = (in_array($requestSco, $allowedIds)) ? $requestSco : $allowedIds[0];
206                $this->storage['s_so'] = $requestSso;
207        }
208
209/**
210 * Retorna o resultado da paginação
211 * @return array
212 * @access public
213 *  */
214        function paginationResult()
215        {
216                $output = parent::paginationResult();
217                if (isset($this->originalRequest['s_co']) && isset($this->originalRequest['s_so'])){
218            $output_count = count($output);
219                        for ($i = 0; $i < $output_count; ++$i)
220                                $output[$i]['link'] .= "&amp;s_co=" . $this->storage['s_co'] . "&amp;s_so=" . $this->storage['s_so'];
221        }
222                return $output;
223        }
224}
225?>
Note: See TracBrowser for help on using the repository browser.