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

Revision 5540, 7.3 KB checked in by adriano, 12 years ago (diff)

Ticket #2486 - correcoes de erros nas funcionalidades de marcadores e de sinalizadores de mensagens

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                foreach ($haystack as $v) {
73                                if ($needle == $v) return true;
74                                elseif (is_array($v)) return self::in_arrayr($needle, $v);
75                }
76                return false;
77        }
78               
79       
80/**
81 * FOLLOWUPFLAG
82 */
83
84        //followupflagged:after.find
85        public function deepnessFollowupflaggeds( &$uri , &$result , &$criteria , $original ){               
86
87                if(isset($original['criteria']['deepness']))
88                {
89                        foreach ($result as $i => $v)
90                        {
91                                if(isset($v['followupflagId']))
92                                {
93                                        $followupflag = Controller::find(array('concept' => 'followupflag'), false, array('filter' => array('=', 'id', $v['followupflagId']) ));     
94                                        $result[$i]['followupflag'] = $followupflag[0];
95                                }
96                               
97                                if(isset($v['messageNumber']) && isset($v['folderName']))
98                                {
99                                        $details = $original['criteria']['deepness'] == '1' ? 'headers' : 'all';
100                                       
101                                        $imapService = new imap_functions();
102                                        $message = $imapService->getMessages(array('messages' => array($v['folderName'] => array($v['messageNumber'])), 'details' => $details));
103                                        $result[$i]['message'] = $message[$v['folderName']][0];                         
104                                }     
105                        }
106                }
107
108                return $result;
109        }       
110       
111        //followupflagged:PostgreSQL.before.find
112        public function clearFilterAtFind( &$uri , &$params , &$criteria , $original ) {
113
114                if ($criteria['filter'] && !self::in_arrayr('id', $criteria['filter'])) {
115                        unset($criteria['filter']);
116                }
117        }
118       
119        /**
120         * 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
121         * obter a lista de todos os sinalizadores e nem são capazes de obter os sinalizadores de uma dada mensagem
122         */
123        //followupflagged:PostgreSQL.after.find
124        public function doImapFind( &$uri , &$result , &$criteria , $original ){
125
126                if (!self::in_arrayr('id', $original['criteria']['filter'])) {
127                        if ($result) {
128                                $list = array();
129                                foreach ($result as $followupflagged)
130                                        $list[] = $followupflagged['id'];
131                                       
132                                $filter = array( 'IN' , 'id' , $list );
133                               
134                                if (isset($original['criteria']['filter']) && $original['criteria']['filter']!=NULL && count($original['criteria']['filter']) != 0)
135                                        $criteria['filter'] = array( 'AND', $original['criteria']['filter'], $filter );
136                                else
137                                        $criteria['filter'] =  $filter;
138                        }
139                }       
140               
141                $imap_uri = $uri;
142                $imap_uri['service'] = 'Imap';
143                $imap_result = Controller::find($imap_uri, $params, $criteria);
144               
145                /**
146                 * Mescla os dados vindos do PostgreSQL com os dados vindos do Imap
147                 */
148                $merge_result = array ();
149                foreach ($imap_result as $ir) {
150                        list($messageId, $flagId) = explode('#', $ir['id']);
151                       
152                        foreach($result as $r) {
153                                if ($r['id'] == $flagId) {
154                                        $r['messageNumber'] = $ir['messageNumber'];
155                                        $r['folderName'] = $ir['folderName'];
156                                       
157                                        $merge_result[] = $r;
158                                }
159                        }
160                }
161                       
162                return $merge_result;
163        }
164
165        //followupflagged:PostgreSQL.before.create
166        public function letFollowupflaggedKeepUnique (&$uri , &$params , &$criteria , $original ){
167       
168                if (isset($params['folderName']) && isset($params['messageNumber'])) {
169                        $filter = array ( 'AND', array('=', 'folderName', $params['folderName']), array('=', 'messageNumber', $params['messageNumber']) );
170                        Controller::delete( array( 'concept' => 'followupflagged' ), false, array( 'filter' => $filter));
171                }
172        }
173
174/*     
175        public function clearAllFlaggedOfFollowupflag( &$uri , &$result , &$criteria , $original ){
176                //TODO - filter
177                return $result;
178        }
179*/     
180
181        //followupflagged:PostgreSQL.after.create
182        public function doImapCreate( &$uri , &$params , &$criteria , $original ) {
183       
184                $imap_uri = $uri;
185                $imap_uri['service'] = 'Imap';
186               
187                $imap_params = $params + $original['properties'];
188                if ($imap_params['folderName'] && $imap_params['messageNumber'] && $imap_params['id']) {
189                        $imap_uri['id'] = $imap_params['folderName'] . '/' . $imap_params['messageNumber'] . '#' . $imap_params['id'];
190                        $imap_params['id'] = $imap_params['folderName'] . '/' . $imap_params['messageNumber'] . '#' . $imap_params['id'];
191                        $result = Controller::create($imap_uri, $imap_params);
192                }
193               
194        }
195       
196        //followupflagged:PostgreSQL.before.read
197        public function doImapRead( &$uri , &$params , &$criteria , $original ) {
198                //TODO - read
199                //$imap_uri = $uri;
200                //$imap_uri['service'] = 'Imap';
201                //$result = Controller::read($imap_uri, $params, $criteria);
202        }       
203       
204        //followupflagged:PostgreSQL.before.delete
205        public function doImapDelete( &$uri , &$params , &$criteria , $original ) {
206                $toGetURI = $uri;
207                $flagged = Controller::read($toGetURI);
208
209                //assumindo que $criteria['filter'] venha sempre vazio no delete
210                $imap_criteria['filter'] = array();
211                foreach ($flagged as $key => $value) {
212                        $imap_criteria['filter'][] = array('=', $key, $value);
213                }
214                if($imap_criteria['filter']) array_unshift($imap_criteria['filter'], 'AND');
215               
216                $imap_uri = $uri;
217                $imap_uri['service'] = 'Imap';
218                if ($flagged && $flagged['id']) {
219                        $flagged['id']  = $flagged['folderName'] . '/' . $flagged['messageNumber'] . '#' . $flagged['id'];
220                        $imap_uri['id'] = $flagged['id'];
221                }
222
223                $result = Controller::delete($imap_uri, $params, $imap_criteria);               
224        }
225       
226        //followupflagged:PostgreSQL.before.update
227        public function doImapUpdate( &$uri , &$params , &$criteria , $original ) {
228                //TODO - update
229                //$imap_uri = $uri;
230                //$imap_uri['service'] = 'Imap';
231                //$result = Controller::update($imap_uri, $params, $criteria);
232        }
233
234}
235
236?>
Note: See TracBrowser for help on using the repository browser.