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

Revision 5909, 9.6 KB checked in by marcieli, 12 years ago (diff)

Ticket #2593 - Concluída melhoria: não permitir marcadores com mesmo nome.

RevLine 
[5533]1<?php
2include_once ROOTPATH."/../expressoMail1_2/inc/class.imap_functions.inc.php";
3
4class Helpers {   
5
6/**
[5540]7 * LABEL
[5533]8 */
[5540]9        //labeled:after.find
[5533]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         */
[5540]32        //label:before.delete
[5533]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        /**
[5540]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
[5533]50         * obter a lista de todos os labels e nem são capazes de obter os labels de uma dada mensagem
51         */
[5540]52        //labeled:before.find
[5533]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) {
[5609]72                //if(!is_array($haystack)) return false;
73               
[5533]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/**
[5540]83 * FOLLOWUPFLAG
[5533]84 */
85
[5609]86        //followupflag:before.find
87        public function addDefaultElementsFilter (&$uri , &$params , &$criteria , $original ){
[5611]88                //if (!self::in_arrayr('id', $criteria['filter'])) {
[5609]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;
[5611]95                //}
96        }
[5609]97       
[5540]98        //followupflagged:after.find
[5533]99        public function deepnessFollowupflaggeds( &$uri , &$result , &$criteria , $original ){               
[5540]100
[5533]101                if(isset($original['criteria']['deepness']))
102                {
103                        foreach ($result as $i => $v)
104                        {
105                                if(isset($v['followupflagId']))
106                                {
[5611]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)
[5697]111                                         * os followupflag defaults são inseridos no retorno, por isso é necessário procurar o objeto correto
112                                         * através do id
[5611]113                                         */
114                                        foreach ($followupflags as $followupflag) {
115                                                if ($v['followupflagId'] == $followupflag['id']) {
116                                                        $result[$i]['followupflag'] = $followupflag;
117                                                        break;
118                                                }
119                                        }
[5533]120                                }
121                               
122                                if(isset($v['messageNumber']) && isset($v['folderName']))
123                                {
[5540]124                                        $details = $original['criteria']['deepness'] == '1' ? 'headers' : 'all';
[5533]125                                       
126                                        $imapService = new imap_functions();
127                                        $message = $imapService->getMessages(array('messages' => array($v['folderName'] => array($v['messageNumber'])), 'details' => $details));
128                                        $result[$i]['message'] = $message[$v['folderName']][0];                         
129                                }     
130                        }
131                }
132
133                return $result;
134        }       
[5540]135       
136        //followupflagged:PostgreSQL.before.find
137        public function clearFilterAtFind( &$uri , &$params , &$criteria , $original ) {
[5609]138       
[5570]139                if ($criteria['filter'] &&
140                                (self::in_arrayr('messageNumber', $criteria['filter']) || self::in_arrayr('folderName', $criteria['filter'])) ) {
[5540]141                        unset($criteria['filter']);
142                }
[5708]143               
144                /**
145                 * TODO - fazer parse do $criteria['filter'] para fazer strip no id composto
146                 */
[5540]147        }
148       
149        /**
150         * 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
151         * obter a lista de todos os sinalizadores e nem são capazes de obter os sinalizadores de uma dada mensagem
152         */
153        //followupflagged:PostgreSQL.after.find
154        public function doImapFind( &$uri , &$result , &$criteria , $original ){
[5708]155                /**
156                 * TODO - ver implicações de busca com id no filtro
157                 */
[5540]158
[5570]159                if ($result) {
160                        $list = array();
161                        foreach ($result as $followupflagged)
162                                $list[] = $followupflagged['id'];
[5540]163                               
[5570]164                        $filter = array( 'IN' , 'id' , $list );
165                       
166                        if (isset($original['criteria']['filter']) && $original['criteria']['filter']!=NULL && count($original['criteria']['filter']) != 0)
167                                $criteria['filter'] = array( 'AND', $original['criteria']['filter'], $filter );
168                        else
169                                $criteria['filter'] =  $filter;
170                }
[5540]171               
172                $imap_uri = $uri;
173                $imap_uri['service'] = 'Imap';
[5625]174                $imap_result = Controller::find($imap_uri, $result, $criteria);
[5540]175               
176                /**
177                 * Mescla os dados vindos do PostgreSQL com os dados vindos do Imap
178                 */
179                $merge_result = array ();
180                foreach ($imap_result as $ir) {
181                        list($messageId, $flagId) = explode('#', $ir['id']);
182                       
183                        foreach($result as $r) {
184                                if ($r['id'] == $flagId) {
[5708]185                                        $r['id'] = $ir['id'];
[5540]186                                        $r['messageNumber'] = $ir['messageNumber'];
187                                        $r['folderName'] = $ir['folderName'];
188                                       
189                                        $merge_result[] = $r;
190                                }
191                        }
192                }
193                       
194                return $merge_result;
195        }
196
[5697]197        //followupflagged:Imap.before.create
[5533]198        public function letFollowupflaggedKeepUnique (&$uri , &$params , &$criteria , $original ){
[5697]199
[5533]200                if (isset($params['folderName']) && isset($params['messageNumber'])) {
[5609]201                        $filter = array ('AND', array('=', 'folderName', $params['folderName']), array('=', 'messageNumber', $params['messageNumber']));
202                        $toClearURI = array('concept' => 'followupflagged', 'service' => 'Imap');
203
204                        //Obtém do banco um possível sinalizador existente
205                        $imap_result = Controller::find($toClearURI, false, array('filter' => $filter));
[5697]206                       
[5609]207                        //Se existe um sinalizador nesta mensagem, deleta-o
208                        foreach ($imap_result as $r) {
[5708]209                                /**
210                                 * TODO - deletar sem id
211                                 */
212                               
[5609]213                                //deleta no Imap
214                                $toClearURI['id'] = $r['id'];
215                                Controller::delete($toClearURI, false, false);
216                               
217                                //deleta no PostgreSQL
218                                list($messageId, $toClearURI['id']) = explode('#', $r['id']);
219                                $toClearURI['service'] = 'PostgreSQL';
220                                Controller::delete($toClearURI, false, false);
221                        }
[5533]222                }
[5708]223
[5533]224        }
225
[5893]226        //Remove as dependencias de uma followupflag
[5533]227        public function clearAllFlaggedOfFollowupflag( &$uri , &$result , &$criteria , $original ){
[5893]228                //remove apenas se vier o id da Followupflag
229                if(isset($uri['id']))
230                        Controller::deleteALL(array('concept' => 'followupflagged'), null , array('filter' => array('=' , 'followupflagId' , $uri['id'])));
231
[5533]232        }
[5893]233       
[5533]234
[5540]235        //followupflagged:PostgreSQL.after.create
[5708]236        public function doImapCreate( &$uri , &$result , &$criteria , $original ) {     
237                /**
238                 * Se não consegue salvar no banco, ele retorna objeto válido, porém sem id
239                 */
240                if (!isset($result['id'])) return false;
241               
242                $imap_uri = $original['URI'];;
[5533]243                $imap_uri['service'] = 'Imap';
[5708]244
245                $imap_params = array_merge($original['properties'], $result);
[5533]246               
[5708]247                $result = array();
[5533]248                if ($imap_params['folderName'] && $imap_params['messageNumber'] && $imap_params['id']) {
249                        $imap_params['id'] = $imap_params['folderName'] . '/' . $imap_params['messageNumber'] . '#' . $imap_params['id'];
250                        $result = Controller::create($imap_uri, $imap_params);
251                }
[5708]252
253                if (!$result) {
254                        //TODO - rollback
255                }
[5533]256        }
257       
[5708]258        //followupflagged:PostgreSQL.after.read
259        public function doImapRead( &$uri , &$result , &$criteria , $original ) {
260               
261                $imap_uri = $original['URI'];
[5570]262                $imap_uri['service'] = 'Imap';
[5708]263
264                $imap_result = Controller::read($imap_uri, $params, $imap_criteria);
[5570]265               
[5708]266                if (!$imap_result)
267                        return false;           
268               
269                $result = array_merge($result, $imap_result);
270
271        }
[5533]272       
[5708]273        //followupflagged:PostgreSQL.before.<...>
274        public function stripURIAttrs( &$uri , &$params , &$criteria , $original ) {
275                list($messageId, $uri['id']) = explode('#', $uri['id']);
[5817]276                $params['id'] = $uri['id'];
[5708]277        }
278
[5540]279        //followupflagged:PostgreSQL.before.delete
[5533]280        public function doImapDelete( &$uri , &$params , &$criteria , $original ) {
[5708]281       
[5533]282                $imap_uri = $uri;
283                $imap_uri['service'] = 'Imap';
[5697]284                list($messageId, $uri['id']) = explode('#', $uri['id']);
[5533]285
[5697]286                $result = Controller::delete($imap_uri, $params, $imap_criteria);
287
288                if (!$result)
289                        return false;
[5533]290        }
291       
[5540]292        //followupflagged:PostgreSQL.before.update
[5533]293        public function doImapUpdate( &$uri , &$params , &$criteria , $original ) {
[5570]294                /**
295                 * Para os conceitos "labeled" e "followupflagged", só faz sentido o update de
296                 * atributos gravados no banco de dados e nunca no IMAP.
297                 */
[5533]298                //$imap_uri = $uri;
299                //$imap_uri['service'] = 'Imap';
300                //$result = Controller::update($imap_uri, $params, $criteria);
301        }
[5881]302       
303               
304        //label:before.create
305        public function verifyNameLabel(&$uri , &$params , &$criteria , $original){
306                $nameLabel = $params['name'];
[5890]307                $Labels = Controller::find(array('concept' => 'label'), false, array('filter' => array('i=', 'name', $nameLabel) ));
[5881]308                if($Labels){
[5909]309                        Throw new Exception('Já existe um marcador com esse nome.');
[5881]310                }
311        }
[5540]312
[5533]313}
314
315?>
Note: See TracBrowser for help on using the repository browser.