source: trunk/prototype/modules/mail/interceptors/Helpers.php @ 5970

Revision 5970, 7.2 KB checked in by adriano, 12 years ago (diff)

Ticket #2633 - correcao nos interceptors de consistencia para a funcionalidade de sinalizadores

Line 
1<?php
2include_once ROOTPATH."/../expressoMail1_2/inc/class.imap_functions.inc.php";
3
4class Helpers {   
5
6/**
7 * LABEL
8 */
9        //labeled:after.find
10        public function deepnessLabeleds( &$uri , &$result , &$criteria , $original ){               
11
12                if(isset($original['criteria']['deepness']))
13                {
14                        foreach ($result as $i => $v)
15                        {
16                                if(isset($v['labelId']))
17                                {
18                                        $labels = Controller::find( array( 'concept' => 'label' ) , false, array( 'filter' => array('=', 'id'  ,  $v['labelId']) ));     
19                                        $result[$i]['label'] = $labels[0];
20                                }             
21
22                        }
23                }
24
25                return $result;
26        }
27       
28        /**
29         * Método a ser chamado na exclusão de um label, procedendo com a
30         * desvinculação deste label com todas as mensagens a que estava vinculado
31         */
32        //label:before.delete
33        public function clearAllLabeledsOfLabel( &$uri , &$result , &$criteria , $original ){
34               
35                $labeleds = Controller::find( array( 'concept' => 'labeled' ) , false, array( 'filter' => array('=', 'labelId'  ,  $uri['id']) ));
36                if (empty($labeleds))
37                        return;
38               
39                $labeledsIds = array();
40                foreach ($labeleds as $e) {
41                                $labeledsIds[] = $e['id'];
42                }
43               
44                Controller::delete( array( 'concept' => 'labeled' ), false, array( 'filter' => array( 'IN', 'id', $labeledsIds )) );
45
46                //return $result;
47        }
48        /**
49         * Método a ser chamado ao listar os labeleds, uma vez que as funções de IMAP do PHP não são capazes de
50         * obter a lista de todos os labels e nem são capazes de obter os labels de uma dada mensagem
51         */
52        //labeled:before.find
53        public function makeLabelListFilter( &$uri , &$result , &$criteria , $original ){
54
55                if (!isset($criteria['filter']) || !self::in_arrayr('labelId', $criteria['filter'])) {
56                        $labels = Controller::find( array( 'concept' => 'label' ) );
57
58                        $list = array();
59                        foreach ($labels as $label)
60                                $list[] = $label['id'];
61                               
62                        $filter = array( 'IN' , 'labelId' , $list );
63                       
64                        if (isset($criteria['filter']) && $criteria['filter']!=NULL && count($criteria['filter']) != 0)
65                                $criteria['filter'] = array( 'AND', $criteria['filter'], $filter );
66                        else
67                                $criteria['filter'] =  $filter;
68                }
69        }
70       
71        //label:before.create
72        public function verifyNameLabel(&$uri , &$params , &$criteria , $original){
73                $nameLabel = $params['name'];
74                $Labels = Controller::find(array('concept' => 'label'), false, array('filter' => array('i=', 'name', $nameLabel) ));
75                if($Labels){
76                        Throw new Exception('Já existe um marcador com esse nome.');
77                }
78        }
79               
80        public static function in_arrayr($needle, $haystack) {
81                //if(!is_array($haystack)) return false;
82               
83                foreach ($haystack as $v) {
84                                if ($needle == $v) return true;
85                                elseif (is_array($v)) return self::in_arrayr($needle, $v);
86                }
87                return false;
88        }
89       
90/**
91 * FOLLOWUPFLAG
92 */
93 
94        //followupflag:before.find
95        public function addDefaultElementsFilter (&$uri , &$params , &$criteria , $original ){
96                //if (!self::in_arrayr('id', $criteria['filter'])) {
97                        $defaultsFilter = array( 'IN' , 'id' , array('1','2','3','4','5','6') );
98
99                        if (isset($criteria['filter']) && $criteria['filter']!=NULL && count($criteria['filter']) != 0)
100                                $criteria['filter'] = array( 'OR', $criteria['filter'], $defaultsFilter );
101                        else
102                                $criteria['filter'] =  $defaultsFilter;
103                //}
104        }
105
106        //Remove as dependencias de uma followupflag
107        public function clearAllFlaggedOfFollowupflag( &$uri , &$result , &$criteria , $original ){
108                //remove apenas se vier o id da Followupflag
109                if(isset($uri['id'])) {
110                        Controller::deleteALL(array('concept' => 'followupflagged'), null , array('filter' => array('=' , 'followupflagId' , $uri['id'])));
111               
112                }
113        }
114
115        //followupflagged:PostgreSQL.before.delete
116        public function doImapDelete( &$uri , &$params , &$criteria , $original ) {
117       
118                $imap_uri = $uri;
119                $imap_uri['service'] = 'Imap';
120                list($messageId, $uri['id']) = explode('#', $uri['id']);
121
122                $result = Controller::delete($imap_uri, $params, $imap_criteria);
123
124                if (!$result)
125                        return false;
126        }
127               
128        //followupflagged:PostgreSQL.before.create
129        public function doImapCreate( &$uri , &$params , &$criteria , $original ) {     
130               
131                $imap_uri = $uri;
132                $imap_uri['service'] = 'Imap';
133
134                $params = Controller::create($imap_uri, $params);
135               
136                if (!$params)
137                        return false;   
138        }
139       
140        //followupflagged:PostgreSQL.after.read
141        public function doImapRead( &$uri , &$result , &$criteria , $original ) {
142
143                if ($result) {
144                        $imap_result = Controller::read(
145                                array('concept' => 'followupflagged', 'service' => 'Imap'),
146                                false,
147                                array('filter' => array('=', 'messageId', $result['messageId']))
148                        );
149                }
150
151                /**
152                 * Faz a consistência do banco com o imap
153                 */
154                if (!$imap_result) {
155                        $r = Controller::deleteALL(array('concept' => 'followupflagged'), null , $criteria);
156                        return false;
157                }
158               
159                /**
160                 * Faz a consistência do banco com o imap
161                 */
162                if ($imap_result['messageId'] !== $imap_result['messageId']) {
163                        $n = $imap_result;
164                        $n['followupflagId']  = 1;
165                        $n['backgroundColor'] = '#FF2016';
166                        $n['id'] = Controller::create(array('concept' => 'followupflagged'), $n);
167                        $result = $imap_result + $n;
168                }
169               
170                $result = $result + $imap_result;
171               
172                return $result;
173        }
174       
175       
176        /**
177         * Método a ser chamado ao listar os sinalizadores, uma vez que as funções de IMAP do PHP não são capazes de
178         * obter a lista de todos os sinalizadores e nem são capazes de obter os sinalizadores de uma dada mensagem
179         */
180        //followupflagged:PostgreSQL.after.find
181        public function doImapFind( &$uri , &$result , &$criteria , $original ){
182
183                $imap_uri = $uri;
184                $imap_uri['service'] = 'Imap';
185                $imap_result = Controller::find($imap_uri, false, $original['criteria']);
186
187                /**
188                 * Mescla os dados vindos do PostgreSQL com os dados vindos do Imap
189                 */
190                $merge_result = array ();
191                foreach ($imap_result as $j => $ir) {
192               
193                        foreach($result as $k => $r) {
194                                if ($r['messageId'] == $ir['messageId']) {
195                                        $merge_result[] = $r + $ir;
196                                        unset($result[$k]);
197                                        break;
198                                }
199                        }
200                       
201                        unset($imap_result[$j]);
202                }
203               
204                /**
205                 * Faz a consistência do banco com o imap
206                 */
207                if ($result) {
208                        $idList = array();
209                        foreach ($result as $ir ) {
210                                $idList = $ir['messageId'];
211                        }
212                        $filter = array('IN','messageId',$idList);
213                        Controller::delete(array('concept' => 'followupflagged'), null , array('filter' => $filter));
214                }
215               
216                /**
217                 * Faz a consistência do banco com o imap
218                 */
219                if ($imap_result) {
220                        foreach ($imap_result as $ir ) {
221                                $n = $ir;
222                                $n['followupflagId']  = 1;
223                                $n['backgroundColor'] = '#FF2016';
224                                $n['id'] = Controller::create(array('concept' => 'followupflagged'), $n);
225                                $merge_result[] = $ir + $n;
226                        }
227                }
228                       
229                return $merge_result;
230        }
231
232        //followupflagged:PostgreSQL.before.find
233        public function reFilterFind (&$uri , &$params , &$criteria , $original ){
234                /**
235                 * Se p filtor incluir atributos da mensagem que o banco de dados não conhece, 
236                 * deve-se obter os messageId dos itens do resultado e passálos num novo filtro
237                 * que o banco conheça
238                 */
239                if (self::in_arrayr('messageNumber', $criteria) || self::in_arrayr('folderName', $criteria)) {
240                        $result = Controller::find(array('concept' => 'message'), array('messageId'), array('filter' => $criteria['filter']));
241                        $idList = array();
242                        foreach ($result as $message)
243                                $idList[] = $message['messageId'];
244                               
245                        $filter = array( 'IN' , 'messageId' , $idList );
246
247                        $criteria['filter'] =  $filter;
248                }       
249        }       
250
251}
252
253?>
Note: See TracBrowser for help on using the repository browser.