source: branches/2.2/mobile/inc/class.bo_mobilecc.inc.php @ 3574

Revision 3574, 6.0 KB checked in by eduardoalex, 13 years ago (diff)

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

Line 
1<?php
2   class bo_mobilecc {
3                var $bo = null;
4                var $page_info = array (
5                                'actual_catalog' => false,
6                                'is_external_catalog' => false
7                        );
8               
9                function set_catalog($catalog) {
10                        if(strpos($catalog,'bo_global_ldap_catalog')===false) //Ldap?
11                                $this->bo= CreateObject("contactcenter.".$catalog);
12                        else {
13                                $exploded = explode("#",$catalog);
14                                $this->bo= CreateObject("contactcenter.bo_global_ldap_catalog",$exploded[1],$exploded[2],$exploded[3]);
15                                if($exploded[3]==1)
16                                        $this->page_info['is_external_catalog'] = true;
17                                else {
18                                        $this->page_info['is_external_catalog'] = false;
19                                }
20
21                        }
22                        $this->page_info['actual_catalog'] = $catalog;
23                }
24               
25               
26                /**
27                 * Busca um nome a partir do catálogo. Se nenhum for setado utilizando a função set_catalog
28                 * ou se não houverem resultados, retorna um array vazio.
29                 *
30                 * Caso o catálogo seja grupos, a busca será por títulos, caso seja
31                 * contatos pessoais, será por names_ordered, se for contato no ldap, será
32                 * por cn.
33                 *
34                 * @return array, com os ids relativos a busca
35                 * @param $name string com o nome à ser buscado.
36                 */
37                public function find($name) {
38                        if(!$this->page_info["actual_catalog"]) //Essa função
39                                return array();
40                       
41                        if($this->page_info['actual_catalog']=="bo_group_manager") { //parametros de busca para grupos
42                                $id = 'group.id_group';
43                                $what = array('group.title',$id);
44                                $search = "group.title";
45                        }
46                        else { //parametros de busca para pessoas
47                                $id = 'contact.id_contact';
48                                $search = "contact.names_ordered";
49                                $what = array('contact.names_ordered',$id);
50                        }
51                       
52                        if ((strpos($catalog,'bo_global_ldap_catalog')!==false) &&
53                                        (!$this->page_info['is_external_catalog'])) { //Ldap do expresso, leva em conta alguns atributos do expresso
54
55                                array_push($what,'contact.object_class',
56                                                'contact.account_visible',
57                                                'contact.account_status'
58                                                );
59                               
60                                $rules = array(
61                                                        0 => array(
62                                                                'field' => 'contact.object_class',
63                                                                'type'  => '=',
64                                                                'value' => 'phpgwAccount'
65                                                        ),
66                                                        1 => array(
67                                                                'field' => 'contact.account_status',
68                                                                'type'  => 'iLIKE',
69                                                                'value' => '%'
70                                                        ),
71                                                        2 => array(
72                                                                'field' => 'contact.account_visible',
73                                                                'type'  => '!=',
74                                                                'value' => '-1'
75                                                        ),
76                                                        3 => array(
77                                                                'field' => 'contact.object_class',
78                                                                'type'  => '=',
79                                                                'value' => 'inetOrgPerson'
80                                                        )
81                                                );
82                        }
83                        else{
84                                $rules = array();
85                        }
86
87                       
88                       
89                        if ($name != '') { //String em branco, não preciso adicionar essa regra
90                                array_push($rules,array(
91                                                                'field' => $search,
92                                                                'type'  => 'iLIKE',
93                                                                'value' => '%'.$name.'%'
94                                                        ));             
95                        }
96                                                                                                       
97                        $ids = $this->bo->find($what,$rules);
98
99                        if(is_array($ids)) {
100                                foreach($ids as $id_r) { //Quero apenas os ids, como valores nas posições do array
101                                        $retorno[] = $id_r[substr($id,strpos($id,".")+1)];
102                                }
103                        }
104                        else
105                                $retorno = array();
106                        return $retorno;
107                }
108               
109                function search($name,$max_results) {
110                        if(!$this->page_info["actual_catalog"])
111                                return array();
112                       
113                        $entries = array();
114                        $ids = $this->find($name);
115                        if(empty($ids))
116                                return array();
117                        $total_count_search = count($ids);
118                        $ids = array_slice($ids,0,$max_results,true);
119                       
120                        if($this->page_info['actual_catalog']!="bo_group_manager") { //Se não for grupo, tenho que ordenar as connections
121                                $entries = $this->bo->get_multiple_entries($ids,array("names_ordered"=>true,"uidnumber"=>true,"id_contact"=>true,"connections"=>true));                 
122                                /**
123                                 * As entradas vindas de get_multiple_entries não vem com as connections
124                                 * ordenadas. Abaixo eu ordeno o array connections de cada entrada para ter
125                                 * sempre na frente os valores defaults, primeiro o default de email, depois
126                                 * o de telefone.
127                                 */
128                                foreach($entries as &$valor) {
129                                        /* Sempre iniciar os arrays, pois pode interferir na
130                                         * ordenação atual se tiverem valores antigos desnecessários
131                                         * causando erro de tamanhos inconsistentes */
132                                        $default = array();
133                                        $type = array();
134                                       
135                                        foreach($valor['connections'] as $key => $value) {
136                                                $default[$key] = $value['connection_is_default'];
137                                                $type[$key] = $value['id_type'];
138                                        }
139                                        array_multisort($default, SORT_DESC, $type, SORT_ASC, $valor['connections']);
140                                }//Fim da ordenação
141                        }
142                        if($total_count_search>count($ids))
143                                $entries["has_more"] = true;
144                        return $entries;
145                }
146
147                /**
148                 * Lista todos os catalogos do contact center. Seu retorno é um array no seguinte formato:
149                 *
150                 * [pos] - posição do array, incremental
151                 *      [catalog] - catalogo
152                 *      [label] - nome do catálogo
153                 *
154                 * A posição catalog para catálogos ldap, possuem o seguinte padrão:
155                 *      catalogo#dn_base#is_external
156                 *
157                 * @return
158                 */
159                function get_all_catalogs() {
160                        $retorno = array();
161                        $bo_cc = CreateObject("contactcenter.bo_contactcenter");
162                        $branchs = $bo_cc->get_catalog_tree();
163                       
164                        foreach($branchs as $branch) { //Catalogos pessoais
165                                if($branch['class']!="bo_global_ldap_catalog" && $branch['class']!="bo_catalog_group_catalog") {//Pego apenas a estrutura dos ramos vindos do banco, pois as do ldap estão confusas e com dados aparentemente inconsistentes.
166                                       
167                                        $catalog = array("catalog"=>$branch['class'],"label"=>$branch['name']);
168                                        $retorno[] = $catalog;
169                                }
170                        }
171                       
172                        $bo_ldap_manager = CreateObject("contactcenter.bo_ldap_manager");
173
174                        $branches = $bo_ldap_manager->get_all_ldap_sources();   //Ldaps expresso       
175                        if(is_array($branches)) {
176                                foreach($branches as $id=>$branch) {
177                                        $catalog = array('catalog'=>"bo_global_ldap_catalog#".
178                                                        $id."#".
179                                                        $branch['dn']."#".
180                                                        0,
181                                                        'label'=>$branch['name']);
182                                        $retorno[] = $catalog;
183                                }
184                        }
185                       
186                        $branches = $bo_ldap_manager->get_external_ldap_sources();//Ldaps externos
187                        if(is_array($branches)) {
188                                foreach($branches as $id=>$branch) {
189                                        $catalog =array('catalog'=>"bo_global_ldap_catalog#".
190                                                        $id."#".
191                                                        $branch['dn']."#".
192                                                        1,
193                                                        'label'=>$branch['name']);
194                                }
195                                $retorno[] = $catalog;
196                        }
197                        return $retorno;
198                }
199
200          }
201?>
Note: See TracBrowser for help on using the repository browser.