source: branches/2.2/mobile/inc/class.ui_mobilecc.inc.php @ 3573

Revision 3573, 17.8 KB checked in by eduardoalex, 13 years ago (diff)

Ticket #1406 - primeira versão da implementação da busca

Line 
1<?php
2        class ui_mobilecc{
3               
4                var $nextmatchs;
5                var $bo;
6                var $page_info = array (
7                                'actual_catalog' => false,
8                                'is_external_catalog' => false
9                        );
10               
11                var $public_functions = array(
12                        'contacts_list' => true,
13                );
14               
15                /**
16                 * Construtor...
17                 *
18                 */
19                public function ui_mobilecc() {
20                        $this->nextmatchs       = CreateObject('phpgwapi.nextmatchs');
21                }
22               
23                /**
24                 * Inicia um BO de catálogo do módulo de contactcenter.
25                 * @return
26                 * @param $catalog String com o catálogo
27                 */
28                private function set_catalog($catalog) {
29                        if(strpos($catalog,'bo_global_ldap_catalog')===false) //Ldap?
30                                $this->bo= CreateObject("contactcenter.".$catalog);
31                        else {
32                                $exploded = explode("#",$catalog);
33                                $this->bo= CreateObject("contactcenter.bo_global_ldap_catalog",$exploded[1],$exploded[2],$exploded[3]);
34                                if($exploded[3]==1)
35                                        $this->page_info['is_external_catalog'] = true;
36                                else {
37                                        $this->page_info['is_external_catalog'] = false;
38                                }
39                                       
40                        }
41                        $this->page_info['actual_catalog'] = $catalog;
42                }
43               
44                /**
45                 * Busca um nome a partir do catálogo. Se nenhum for informado previamente,
46                 * retorna um array vazio.
47                 *
48                 * Caso o catálogo atual seja grupos, a busca será por títulos, caso seja
49                 * contatos pessoais, será por names_ordered, se for contato no ldap, será
50                 * por cn.
51                 *
52                 * @return array, com os ids relativos a busca
53                 * @param $name string com o nome à ser buscado.
54                 */
55                public function find($name) {
56                        if(!$this->page_info["actual_catalog"])
57                                return array();
58                       
59                        if($this->page_info['actual_catalog']=="bo_group_manager") { //parametros de busca para grupos
60                                $id = 'group.id_group';
61                                $what = array('group.title',$id);
62                                $search = "group.title";
63                        }
64                        else { //parametros de busca para pessoas
65                                $id = 'contact.id_contact';
66                                $search = "contact.names_ordered";
67                                $what = array('contact.names_ordered',$id);
68                        }
69                       
70                        if ((strpos($this->page_info["actual_catalog"],'bo_global_ldap_catalog')!==false) &&
71                                        (!$this->page_info['is_external_catalog'])) { //Ldap do expresso, leva em conta alguns atributos do expresso
72
73                                array_push($what,'contact.object_class',
74                                                'contact.account_visible',
75                                                'contact.account_status'
76                                                );
77                               
78                                $rules = array(
79                                                        0 => array(
80                                                                'field' => 'contact.object_class',
81                                                                'type'  => '=',
82                                                                'value' => 'phpgwAccount'
83                                                        ),
84                                                        1 => array(
85                                                                'field' => 'contact.account_status',
86                                                                'type'  => 'iLIKE',
87                                                                'value' => '%'
88                                                        ),
89                                                        2 => array(
90                                                                'field' => 'contact.account_visible',
91                                                                'type'  => '!=',
92                                                                'value' => '-1'
93                                                        ),
94                                                        3 => array(
95                                                                'field' => 'contact.object_class',
96                                                                'type'  => '=',
97                                                                'value' => 'inetOrgPerson'
98                                                        )
99                                                );
100                        }
101                        else{
102                                $rules = array();
103                        }
104
105                       
106                       
107                        if ($name != '') { //String em branco, não preciso adicionar essa regra
108                                array_push($rules,array(
109                                                                'field' => $search,
110                                                                'type'  => 'iLIKE',
111                                                                'value' => '%'.$name.'%'
112                                                        ));             
113                        }
114                                                                                                               
115                        $ids = $this->bo->find($what,$rules);
116
117                        if(is_array($ids)) foreach($ids as $id_r) { //Quero apenas os ids, como valores nas posições do array
118                                $retorno[] = $id_r[substr($id,strpos($id,".")+1)];
119                        }
120                       
121                        return $retorno;
122                }
123               
124                /**
125                 * Monta a lista de contatos na tela, de acordo com a busca. Se não foi feita
126                 * busca, mostra apenas o formulário para pesquisa.
127                 *
128                 * @return
129                 */
130               
131                function contacts_list($from_calendar=false) {
132
133                        $entries = array();
134                        $actual_page = 0;
135
136                        if(isset($_POST['name']) && strlen($_POST['name'])<4) //Busca apenas para nomes com mais de 4 palavras
137                                $ids = false;
138                        else {
139                                /////////////// Pego os ids referente a consulta, se a mesma foi feita
140                                if(isset($_POST['name'])) {
141                                        $this->set_catalog($_POST['catalog']);
142                                        $ids = $this->find($_POST['name']);
143                                        if(is_array($ids)) {
144                                                $actual_page = 1;
145                                                $_SESSION["mobile_search_ids"] = $ids;
146                                                $_SESSION["mobile_search_catalog"] = $_POST['catalog'];
147                                                $ids = array_slice($ids,0,10); //Apenas a primeira página
148                                        }
149                                }
150                                else if(isset($_GET['page'])) {
151                                        $this->set_catalog($_SESSION["mobile_search_catalog"]);
152                                        $ids = array_slice($_SESSION["mobile_search_ids"],($_GET['page']-1)*10,10); //Página solicitada
153                                        $actual_page = $_GET['page'];
154                                }
155                                else
156                                        $ids = false;
157                        }
158
159                        ///////////// Pego os dados dos ids da página em questão.
160                        if(!is_array($ids) || count($_SESSION["mobile_search_ids"])>100 || (isset($_POST["name"]) && strlen($_POST['name'])<4)) {
161                                $entries = array();
162                        }
163                        else { //Só pego os dados completos caso haja resultado na busca
164                                if($this->page_info['actual_catalog']!="bo_group_manager") { //Se não for grupo, tenho que ordenar as connections
165
166                                    $display = "none";
167                                    if(isset($GLOBALS['phpgw_info']['user']['preferences']['contactcenter']['cell']) && $GLOBALS['phpgw_info']['user']['preferences']['contactcenter']['cell'] == 1)
168                                    {
169                                        $_SESSION['phpgw_info']['user']['preferences']['contactcenter']['cellShow'] = true;
170                                        $display = "inline";
171                                        $entries = $this->bo->get_multiple_entries($ids,array("names_ordered"=>true,"uidnumber"=>true,"id_contact"=>true,"companies"=>true,"connections"=>true));
172                                    }else {
173                                        $entries = $this->bo->get_multiple_entries($ids,array("names_ordered"=>true,"uidnumber"=>true,"id_contact"=>true,"connections"=>true));
174                                    }
175                                        /**
176                                         * As entradas vindas de get_multiple_entries não vem com as connections
177                                         * ordenadas. Abaixo eu ordeno o array connections de cada entrada para ter
178                                         * sempre na frente os valores defaults, primeiro o default de email, depois
179                                         * o de telefone.
180                                         */
181                                        foreach($entries as &$valor) {
182                                                /* Sempre iniciar os arrays, pois pode interferir na
183                                                 * ordenação atual se tiverem valores antigos desnecessários
184                                                 * causando erro de tamanhos inconsistentes */
185                                                $default = array();
186                                                $type = array();
187                                               
188                                                foreach($valor['connections'] as $key => $value) {
189                                                        $default[$key] = $value['connection_is_default'];
190                                                        $type[$key] = $value['id_type'];
191                                                }
192                                                array_multisort($default, SORT_DESC, $type, SORT_ASC, $valor['connections']);
193                                        }//Fim da ordenação
194                                }
195                                else {
196                                        $entries = $this->bo->get_multiple_entries($ids,array("id_group"=>true,"title"=>true,"short_name"=>true));
197                                }
198
199                        }
200                       
201                        ///////////////// Monto os dados gerais da página no template.
202                        $p = CreateObject('phpgwapi.Template',PHPGW_APP_TPL);
203                       
204                        if(!$from_calendar)
205                                $p->set_file(Array('entries' => 'cc_main.tpl'));
206                        else if($from_calendar =='mobilecalendar')
207                                $p->set_file(Array('entries' => 'add_participants.tpl'));
208                        else   
209                                $p->set_file(Array('entries' => 'add_recipients.tpl'));
210                               
211                        $p->set_block('entries','body');
212                        $p->set_block('entries','people_header');
213                        $p->set_block('entries','group_header');
214                        $p->set_block('entries','row');
215                        $p->set_block('entries','row_group');
216                        $p->set_block('entries','row_empty');
217                        $p->set_block('entries','option');
218                        $p->set_block('entries','page');
219                        $p->set_block('entries','page_no_link');
220                        $p->set_block('entries','row_addeds');
221                       
222                       
223                        $texts = array(
224                                'lang_name' => lang("Name"),
225                                'lang_catalog' => lang("Catalog"),
226                                'lang_search' => lang("Search")
227                                );
228                        $p->set_var($texts);
229
230                        $p->set_var('lang_already_addeds:',lang('already_addeds:'));
231
232                        if($from_calendar == 'mobilecalendar')
233                                $p->set_var('lang_continue_scheduling',lang('continue scheduling'));
234                        else if($from_calendar == 'mobilemail'){
235                                $p->set_var('lang_continue',lang('continue'));
236                        }
237
238                        /////////// Preenche o combo de catálogos
239                       
240                        $bo_cc = CreateObject("contactcenter.bo_contactcenter");
241                        $branchs = $bo_cc->get_catalog_tree();
242                       
243                        if(!$from_calendar || $from_calendar == 'mobilemail') {
244                                foreach($branchs as $branch) { //Pego apenas a estrutura dos ramos vindos do banco, pois as do ldap estão confusas e com dados aparentemente inconsistentes.
245                                        if($branch['class']!="bo_global_ldap_catalog" && $branch['class']!="bo_catalog_group_catalog") {
246                                                $p->set_var(array('option_value'=>$branch['class'],'option_text'=>$branch['name']));
247       
248                                                if($this->page_info['actual_catalog']==$branch['class'])
249                                                        $p->set_var('selected','selected');
250                                                else
251                                                        $p->set_var('selected','');
252                                                $p->parse('options','option',True);
253                                        }
254                                               
255                                }
256                        }
257                       
258                        /////////// Preenche o combo, com dados do ldap
259                        $bo_ldap_manager = CreateObject("contactcenter.bo_ldap_manager");
260                        $branchs = $bo_ldap_manager->get_all_ldap_sources();
261                       
262                        foreach($branchs as $id=>$branch) { //Ldaps expresso
263                                $p->set_var(array('option_value'=>"bo_global_ldap_catalog#".
264                                                $id."#".
265                                                $branch['dn']."#".
266                                                0,
267                                                'option_text'=>$branch['name'])); //No value eu passo também o id, o contexto e se é externo, quando é um ldap
268
269                                if($this->page_info['actual_catalog']=="bo_global_ldap_catalog#".$id."#".$branch['dn']."#". 0)
270                                        $p->set_var('selected','selected');
271                                else
272                                        $p->set_var('selected','');
273                                $p->parse('options','option',True);     
274                        }
275                       
276                        if(!$from_calendar  || $from_calendar == 'mobilemail') {
277                                $branchs = $bo_ldap_manager->get_external_ldap_sources();
278                                if(is_array($branchs)) foreach($branchs as $id=>$branch) { //Ldaps externos
279                                        $p->set_var(array('option_value'=>"bo_global_ldap_catalog#".
280                                                        $id."#".
281                                                        $branch['dn']."#".
282                                                        1,
283                                                        'option_text'=>$branch['name'])); //No value eu passo também o id, o contexto e se é externo, quando é um ldap
284       
285                                        if($this->page_info['actual_catalog']=="bo_global_ldap_catalog#".$id."#".$branch['dn']."#". 1)
286                                                $p->set_var('selected','selected');
287                                        else
288                                                $p->set_var('selected','');
289                                        $p->parse('options','option',True);     
290                                }
291                        }
292
293                        /////////// Monta o resultado da pesquisa
294                        $p->set_var('th_theme',$GLOBALS['phpgw_info']['theme']['th_bg']);
295                                               
296                        if(empty($entries) && isset($_POST["name"]) && count($_SESSION["mobile_search_ids"])<=100 && strlen($_POST['name'])>=4) { //Se foi feita a busca e não teve resultados...
297                                $p->set_var('message',lang('No matches found'));
298                                $p->parse('rows','row_empty',True);
299                        }
300                        else if(count($_SESSION["mobile_search_ids"])>100) { //Muitos resultados...
301                                $p->set_var('message',lang('too many results'));
302                                $p->parse('rows','row_empty',True);                     
303                        }
304                        else if(isset($_POST["name"]) && strlen($_POST['name'])<4) { //Muitos resultados...
305                                $p->set_var('message',lang('the search argument must have at least 4 digits'));
306                                $p->parse('rows','row_empty',True);                     
307                        }
308                        else if((isset($_POST["name"])) || (isset($_GET["page"]))){ //Renderizar...
309                               
310                                /////////// Preenche o cabeçalho da consulta
311                                if($this->page_info['actual_catalog']!="bo_group_manager") {
312                                        $p->set_var(
313                                                        array('lang_people_name'        => lang("Name"),
314                                                                'lang_phone'            => lang("Phone"),
315                                                                'lang_mobile'           => "Celular", //lang("Mobile"),
316                                                                'display'               => $display,
317                                                                'lang_mail'             => lang("Email")));
318                                        $p->parse('header','people_header',True);
319                                }
320                                else {
321                                        $p->set_var(
322                                                        array('lang_group_name' => lang("Name"),
323                                                                'lang_title' => lang("Title")
324                                                                ));
325                                        $p->parse('header','group_header',True);
326                                }
327                               
328                                /////////// Preencho as linhas do resultado
329                                foreach($entries as $id => $entry) {
330                                        $this->nextmatchs->template_alternate_row_color($p);
331                                        if(($this->page_info['actual_catalog']!="bo_group_manager") &&
332                                                         (strpos($this->page_info['actual_catalog'],'bo_global_ldap_catalog')===false)){ //People
333                                                $var = array(
334                                                                'row_nome'      => $entry['names_ordered'],
335                                                                'row_mobile'    => $entry['companies']['company1']['celPhone']
336                                                        );
337                                                $conn1 = array_shift($entry['connections']);
338                                                if(($conn1==NULL)||($conn1['connection_is_default']!=1)) {
339                                                        $var['row_telefone'] = '&nbsp;';
340                                                        $var['row_email'] = '&nbsp;';
341                                                }
342                                                else if($conn1['id_type']==1) {
343                                                        $var['row_email'] = $conn1['connection_value'];
344                                                        $conn2=array_shift($entry['connections']);
345                                                        if(($conn2==NULL)||($conn2['connection_is_default']!=1))
346                                                                $var['row_telefone'] = '&nbsp';
347                                                        else
348                                                                $var['row_telefone'] = $conn2['connection_value'];
349                                                }
350                                                else if($conn1['id_type']==2) {
351                                                        $var['row_email'] = '&nbsp;';
352                                                        $var['row_telefone'] = $conn1['connection_value'];
353                                                }
354                                                $var['form_action'] = "index.php?menuaction=mobile.ui_mobilemail.new_msg";
355                                                $p->set_var($var);
356                                                $p->parse('rows','row',True);
357                                        }
358                                        else if($this->page_info['actual_catalog']=="bo_group_manager"){ //Grupos
359                                                $var = array(
360                                                                'row_group_name'=>$entry['short_name'],
361                                                                'row_title' => $entry['title']
362                                                                );
363                                               
364                                                $p->set_var($var);
365                                                $p->parse('rows','row_group',True);
366                                        }
367                                        else { //Ldap
368                                                $var = array('row_nome'=>$entry['names_ordered'][0],'row_mobile'=> $entry['companies']['company1']['celPhone']);
369                                                $conn1 = array_shift($entry['connections']);
370                                                if(($conn1==NULL)) {
371                                                        $var['row_telefone'] = '&nbsp;';
372                                                        $var['row_email'] = '&nbsp;';
373                                                }
374                                                else if($conn1['id_type']==1) {
375                                                        $var['row_email'] = $conn1['connection_value'];
376                                                        $conn2=array_shift($entry['connections']);
377                                                        if($conn2==NULL)
378                                                                $var['row_telefone'] = '&nbsp';
379                                                        else
380                                                                $var['row_telefone'] = $conn2['connection_value'];
381                                                }
382                                                else if($conn1['id_type']==2) {
383                                                        $var['row_email'] = '&nbsp;';
384                                                        $var['row_telefone'] = $conn1['connection_value'];
385                                                }
386                                                if(!$from_calendar)
387                                                        $var['form_action'] = "index.php?menuaction=mobile.ui_mobilemail.new_msg";
388                                                else if($from_calendar == 'mobilecalendar'){
389                                                        $var['id_contact'] = $entry['uidnumber'][0].'U';
390                                                        $var['form_action'] = "index.php?menuaction=mobile.ui_mobilecalendar.add_participant";
391                                                }else{
392                                                        $var['id_contact'] = $entry['uidnumber'][0].'U';
393                                                        $var['form_action'] = "index.php?menuaction=mobile.ui_mobilemail.add_recipient";
394                                                }
395                                                $var['lang_select'] = lang("select");
396                                                $p->set_var($var);
397                                                $p->parse('rows','row',True);
398                                        }
399                                }
400                        }
401                       
402                        if($from_calendar == 'mobilemail') {
403                                $p->set_var('lang_choose_the_recipients',lang("choose the recipients"));
404                                $participants = $_SESSION['mobile_mail'];
405                                reset($participants);
406                                while (($participant = current($participants))!==false) {
407                                        $p->set_var('row_contact_name',$participant);
408                                        if(next($participants)!==false)
409                                                $p->set_var('row_separate',',');
410                                        else
411                                                $p->set_var('row_separate','.');
412                                        $p->parse('rows_addeds','row_addeds',True);
413                                }
414                        }else if($from_calendar == 'mobilecalendar'){
415                                $p->set_var('lang_choose_the_participants',lang("choose the participants"));
416                                $participants = $_SESSION['mobile_calendar'];
417                                reset($participants);
418                                while (($participant = current($participants))!==false) {
419                                        $p->set_var('row_contact_name',$participant);
420                                        if(next($participants)!==false)
421                                                $p->set_var('row_separate',',');
422                                        else
423                                                $p->set_var('row_separate','.');
424                                        $p->parse('rows_addeds','row_addeds',True);
425                                }                               
426                        }
427                       
428                        ////////////////// Monto a paginação
429                        if(!empty($entries) && count($_SESSION["mobile_search_ids"])<=100) {
430                                $num_pages = count($_SESSION["mobile_search_ids"])/10;
431                               
432                                if((count($_SESSION["mobile_search_ids"])%10!=0) || ($num_pages<1))
433                                        $num_pages++;
434                                if($actual_page!=0) {
435                                        for($i=1;$i<=$num_pages;$i++) {
436                                                $p->set_var('num_page',$i);
437                                                $p->set_var('display_page',$i);
438                                                if($i!=$actual_page)
439                                                        $p->parse('pages','page',True);
440                                                else
441                                                        $p->parse('pages','page_no_link',True);
442                                        }
443                                }
444                               
445                                if($actual_page>1) {
446                                        $p->set_var('num_page',$actual_page-1);
447                                        $p->set_var('display_page','<');
448                                        $p->parse('back','page',True);
449                                }
450                               
451                                if(($actual_page!=floor($num_pages)) && (floor($num_pages)>1) && ($actual_page!=0)) {
452                                        $p->set_var('num_page',$actual_page+1);
453                                        $p->set_var('display_page','>');
454                                        $p->parse('next','page',True);
455                                }       
456                        }                       
457                       
458                        //$p->pfp('out','body');
459                        $GLOBALS['phpgw_info']['mobiletemplate']->set_content($p->fp('out','body'));
460                }
461               
462                static function print_contacts($contacts) {
463                        $functions = CreateObject('mobile.common_functions');
464                        $p = CreateObject('phpgwapi.Template', PHPGW_SERVER_ROOT . '/mobile/templates/'.$GLOBALS['phpgw_info']['server']['template_set']);
465                                        $p->set_file(
466                                                Array(
467                                                        'cc_t' => 'contacts_list.tpl'
468                                                )
469                                        );
470                        $p->set_block('cc_t', 'rows_contacts');
471                        $p->set_block('cc_t', 'row_contacts');
472                        $p->set_block('cc_t', 'no_contacts');
473                       
474                        $bg = "par";
475                        if(!empty($contacts)) {
476                                foreach($contacts as $id => $contact) {
477                                       
478                                        $p->set_var('bg',$bg=="par"?$bg="reset-dt":$bg="par");                                                 
479                                        $p->set_var('lang_tel',lang("tel"));
480                                        $p->set_var('show_tel',$contact["connections"]["connection2"]["connection_value"]!=null?"inline":"none");
481                                        $p->set_var('lang_see_details',strtoupper(lang("see details")));
482                                        $p->set_var('contact_name',$functions->strach_string(is_array($contact["names_ordered"])?
483                                                                        $contact["names_ordered"][0]:$contact["names_ordered"],20));
484                                        $p->set_var('email',
485                                                                $functions->strach_string(
486                                                                        ($contact["connections"]["connection1"]["connection_value"]!=null &&
487                                                                        $contact["connections"]["connection1"]["id_type"]==="1")?
488                                                                                $contact["connections"]["connection1"]["connection_value"]:"&nbsp;",20));
489                                        $p->set_var('tel',$functions->strach_string($contact["connections"]["connection1"]["id_type"]==="2"?
490                                                                                $contact["connections"]["connection1"]["connection_value"]:
491                                                                                $contact["connections"]["connection2"]["connection_value"],19));
492                                               
493                                        $p->fp('rows','row_contacts',True);
494                                }
495                        }
496                        else {
497                                $p->set_var("lang_no_results",lang("no results found"));
498                                $p->parse("rows","no_contacts");
499                        }
500                        return $p->fp('out','rows_contacts');
501                }
502               
503        }
504       
505       
506       
507       
508?>
Note: See TracBrowser for help on using the repository browser.