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

Revision 5625, 8.7 KB checked in by marcieli, 12 years ago (diff)

Ticket #2486 - Implementada opção de criar novo marcador ao clicar na msg e marca-la.

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        public static function in_arrayr($needle, $haystack) {
72                //if(!is_array($haystack)) return false;
73               
74                foreach ($haystack as $v) {
75                                if ($needle == $v) return true;
76                                elseif (is_array($v)) return self::in_arrayr($needle, $v);
77                }
78                return false;
79        }
80               
81       
82/**
83 * FOLLOWUPFLAG
84 */
85
86        //followupflag:before.find
87        public function addDefaultElementsFilter (&$uri , &$params , &$criteria , $original ){
88                //if (!self::in_arrayr('id', $criteria['filter'])) {
89                        $defaultsFilter = array( 'IN' , 'id' , array('1','2','3','4','5','6') );
90                       
91                        if (isset($criteria['filter']) && $criteria['filter']!=NULL && count($criteria['filter']) != 0)
92                                $criteria['filter'] = array( 'OR', $criteria['filter'], $defaultsFilter );
93                        else
94                                $criteria['filter'] =  $defaultsFilter;
95                //}
96        }
97       
98        //followupflagged:after.find
99        public function deepnessFollowupflaggeds( &$uri , &$result , &$criteria , $original ){               
100
101                if(isset($original['criteria']['deepness']))
102                {
103                        foreach ($result as $i => $v)
104                        {
105                                if(isset($v['followupflagId']))
106                                {
107                                        $followupflags = Controller::find(array('concept' => 'followupflag'), false, array('filter' => array('=', 'id', $v['followupflagId']) ));
108                                       
109                                        /**
110                                         * Devido há inconsistencias na chamada do interceptor addDefaultElementsFilter (followupflag:before.find)
111                                         * os followupflag defaults
112                                         */
113                                        foreach ($followupflags as $followupflag) {
114                                                if ($v['followupflagId'] == $followupflag['id']) {
115                                                        $result[$i]['followupflag'] = $followupflag;
116                                                        break;
117                                                }
118                                        }
119                                }
120                               
121                                if(isset($v['messageNumber']) && isset($v['folderName']))
122                                {
123                                        $details = $original['criteria']['deepness'] == '1' ? 'headers' : 'all';
124                                       
125                                        $imapService = new imap_functions();
126                                        $message = $imapService->getMessages(array('messages' => array($v['folderName'] => array($v['messageNumber'])), 'details' => $details));
127                                        $result[$i]['message'] = $message[$v['folderName']][0];                         
128                                }     
129                        }
130                }
131
132                return $result;
133        }       
134       
135        //followupflagged:PostgreSQL.before.find
136        public function clearFilterAtFind( &$uri , &$params , &$criteria , $original ) {
137       
138                if ($criteria['filter'] &&
139                                (self::in_arrayr('messageNumber', $criteria['filter']) || self::in_arrayr('folderName', $criteria['filter'])) ) {
140                        unset($criteria['filter']);
141                }
142        }
143       
144        /**
145         * 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
146         * obter a lista de todos os sinalizadores e nem são capazes de obter os sinalizadores de uma dada mensagem
147         */
148        //followupflagged:PostgreSQL.after.find
149        public function doImapFind( &$uri , &$result , &$criteria , $original ){
150
151                if ($result) {
152                        $list = array();
153                        foreach ($result as $followupflagged)
154                                $list[] = $followupflagged['id'];
155                               
156                        $filter = array( 'IN' , 'id' , $list );
157                       
158                        if (isset($original['criteria']['filter']) && $original['criteria']['filter']!=NULL && count($original['criteria']['filter']) != 0)
159                                $criteria['filter'] = array( 'AND', $original['criteria']['filter'], $filter );
160                        else
161                                $criteria['filter'] =  $filter;
162                }
163               
164                $imap_uri = $uri;
165                $imap_uri['service'] = 'Imap';
166                $imap_result = Controller::find($imap_uri, $result, $criteria);
167               
168                /**
169                 * Mescla os dados vindos do PostgreSQL com os dados vindos do Imap
170                 */
171                $merge_result = array ();
172                foreach ($imap_result as $ir) {
173                        list($messageId, $flagId) = explode('#', $ir['id']);
174                       
175                        foreach($result as $r) {
176                                if ($r['id'] == $flagId) {
177                                        $r['messageNumber'] = $ir['messageNumber'];
178                                        $r['folderName'] = $ir['folderName'];
179                                       
180                                        $merge_result[] = $r;
181                                }
182                        }
183                }
184                       
185                return $merge_result;
186        }
187
188        //followupflagged:before.create
189        public function letFollowupflaggedKeepUnique (&$uri , &$params , &$criteria , $original ){
190       
191                if (isset($params['folderName']) && isset($params['messageNumber'])) {
192                        $filter = array ('AND', array('=', 'folderName', $params['folderName']), array('=', 'messageNumber', $params['messageNumber']));
193                        $toClearURI = array('concept' => 'followupflagged', 'service' => 'Imap');
194
195                        //Obtém do banco um possível sinalizador existente
196                        $imap_result = Controller::find($toClearURI, false, array('filter' => $filter));
197
198                        //Se existe um sinalizador nesta mensagem, deleta-o
199                        foreach ($imap_result as $r) {
200                                //deleta no Imap
201                                $toClearURI['id'] = $r['id'];
202                                Controller::delete($toClearURI, false, false);
203                               
204                                //deleta no PostgreSQL
205                                list($messageId, $toClearURI['id']) = explode('#', $r['id']);
206                                $toClearURI['service'] = 'PostgreSQL';
207                                Controller::delete($toClearURI, false, false);
208                        }
209                }
210        }
211
212/*     
213        public function clearAllFlaggedOfFollowupflag( &$uri , &$result , &$criteria , $original ){
214                //TODO - filter
215                return $result;
216        }
217*/     
218
219        //followupflagged:PostgreSQL.after.create
220        public function doImapCreate( &$uri , &$result , &$criteria , $original ) {
221       
222                $imap_uri = $uri;
223                $imap_uri['service'] = 'Imap';
224               
225                $imap_params = $result + $original['properties'];
226                if ($imap_params['folderName'] && $imap_params['messageNumber'] && $imap_params['id']) {
227                        $imap_uri['id'] = $imap_params['folderName'] . '/' . $imap_params['messageNumber'] . '#' . $imap_params['id'];
228                        $imap_params['id'] = $imap_params['folderName'] . '/' . $imap_params['messageNumber'] . '#' . $imap_params['id'];
229                        $result = Controller::create($imap_uri, $imap_params);
230                }
231               
232        }
233       
234        //followupflagged:PostgreSQL.before.read
235        public function doImapRead( &$uri , &$params , &$criteria , $original ) {
236                $imap_uri = $uri;
237                $imap_uri['service'] = 'Imap';
238                $result = Controller::read($imap_uri, $params, $criteria);
239               
240                return $result;
241        }       
242       
243        //followupflagged:PostgreSQL.before.delete
244        public function doImapDelete( &$uri , &$params , &$criteria , $original ) {
245                $toGetURI = $uri;
246                $flagged = Controller::read($toGetURI);
247
248                //assumindo que $criteria['filter'] venha sempre vazio no delete
249                $imap_criteria['filter'] = array();
250                foreach ($flagged as $key => $value) {
251                        $imap_criteria['filter'][] = array('=', $key, $value);
252                }
253                if($imap_criteria['filter']) array_unshift($imap_criteria['filter'], 'AND');
254               
255                $imap_uri = $uri;
256                $imap_uri['service'] = 'Imap';
257                if ($flagged && $flagged['id']) {
258                        $flagged['id']  = $flagged['folderName'] . '/' . $flagged['messageNumber'] . '#' . $flagged['id'];
259                        $imap_uri['id'] = $flagged['id'];
260                }
261
262                $result = Controller::delete($imap_uri, $params, $imap_criteria);               
263        }
264       
265        //followupflagged:PostgreSQL.before.update
266        public function doImapUpdate( &$uri , &$params , &$criteria , $original ) {
267                /**
268                 * Para os conceitos "labeled" e "followupflagged", só faz sentido o update de
269                 * atributos gravados no banco de dados e nunca no IMAP.
270                 */
271                //$imap_uri = $uri;
272                //$imap_uri['service'] = 'Imap';
273                //$result = Controller::update($imap_uri, $params, $criteria);
274        }
275
276}
277
278?>
Note: See TracBrowser for help on using the repository browser.