source: trunk/contactcenter/inc/class.bo_global_ldap_catalog.inc.php @ 284

Revision 284, 34.9 KB checked in by rafaelraymundo, 16 years ago (diff)

Vide Trac - #197, #166, #198, #199

  1. Correção de problema na leitura do arquivo configuração.
  2. Permissão do click2dial também no contactcenter.
  3. Visualização de matricula, e nro celular no resultado da pesquisa(se estiverem populados)
  4. Adicionada a leitura a Catálogos Externos
  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
1<?php
2  /***************************************************************************\
3  * eGroupWare - Contacts Center                                              *
4  * http://www.egroupware.org                                                 *
5  * Written by:                                                               *
6  *  - Raphael Derosso Pereira <raphaelpereira@users.sourceforge.net>         *
7  * ------------------------------------------------------------------------- *
8  *  This program is free software; you can redistribute it and/or modify it  *
9  *  under the terms of the GNU General Public License as published by the    *
10  *  Free Software Foundation; either version 2 of the License, or (at your   *
11  *  option) any later version.                                               *
12  \***************************************************************************/
13
14        /*
15                This class is responsible for manipulating the Global LDAP Contact Manager
16        */
17        include_once('class.abo_catalog.inc.php');
18
19        class bo_global_ldap_catalog extends abo_catalog
20        {
21                var $ldap;
22
23                var $src_info;
24
25                var $trans_table;
26
27                // used to determine if a catalog is external
28                var $external;
29
30                var $fields = array(
31                        'id_contact'    => true,
32                        'status'        => true,
33                        'photo'         => true,
34                        'alias'         => true,
35                        'prefix'        => true,
36                        'given_names'   => true,
37                        'family_names'  => true,
38                        'account_type'  => true,
39                        'names_ordered' => true,
40                        'suffix'        => true,
41                        'birthdate'     => true,
42                        'sex'           => true,
43                        'pgp_key'       => true,
44                        'notes'         => true,
45                        'department'    => true,
46
47                        'empNumber'     => true,
48
49                        /* Array fields */
50                        'companies'     => true,
51                        'relations'     => true,
52                        'addresses'     => true,
53                        'connections'   => true
54                );
55
56                /*
57
58                        @function global_ldap_catalog
59                        @abstract Constructor
60                        @author Raphael Derosso Pereira
61                        @author Mário César Kolling (external catalogs)
62
63                        @param integer $id_source The ID of the LDAP source
64                        @param string $context Ldap bind DN
65                        @param integer $external 0 = internal catalog, 1 = external catalog
66
67                */
68                function bo_global_ldap_catalog ( $id_source, $context, $external = 0 )
69                {
70
71                        $this->external = $external;
72
73                        if (!function_exists('ldap_search'))
74                        {
75                                exit('PHP LDAP support Unavailable!');
76                        }
77
78                        $this->ldap = CreateObject('contactcenter.bo_ldap_manager');
79
80                        if ($this->external)
81                        {
82                                $all_src = $this->ldap->get_external_ldap_sources();
83                        }
84                        else
85                        {
86                                $all_src = $this->ldap->get_all_ldap_sources();
87                        }
88
89                        if (!$all_src[$id_source] or !$context)
90                        {
91                                exit('Unavailable LDAP source.');
92                        }
93
94                        $this->src_info = $all_src[$id_source];
95                        $this->src_info['context'] = $context;
96
97                        if ($this->external)
98                        {
99                                $this->trans_table = $this->ldap->get_external_ldap_fields_association($id_source);
100                        }
101                        else
102                        {
103                                $this->trans_table = $this->ldap->get_ldap_fields_association($id_source);
104                        }
105                }
106
107                /*
108
109                        @function find
110                        @abstract Searches the LDAP directory for the specified fields with
111                                the specified rules and retuns an array containing all the DNs
112                                that matches the rules.
113                        @author Raphael Derosso Pereira
114
115                        @param array $what The fields to be taken
116                        @param array $rules The rules to be match. See class.abo_catalog.inc.php
117                                for reference
118                        @param array $other Other parameters:
119                                $return = array(
120                                        'limit'  => (integer),
121                                        'offset' => (integer) [NOT IMPLEMENTED]
122                                )
123
124                */
125                function find($what, $rules=false, $other=false)
126                {
127                        $restric_fields = $this->get_restrictions_without_branch($rules);
128
129                        $trans_f = $this->translate_fields($what, $restric_fields);
130
131                        foreach($trans_f as $orig => $field_a)
132                        {
133                                foreach($field_a as $field)
134                                {
135                                        $fields[] = $field;
136                                }
137                        }
138
139                        $fields = array_unique($fields);
140
141                        $filter = $this->process_restrictions($rules, $trans_f);
142
143                        if(strstr($this->src_info['context'], "ldap://")) {
144                                $refer_context  = str_replace("??base","",preg_replace('!^(ldap://[^/]+)/(.*$)!', '\\2', $this->src_info['context']));
145                                $host   = preg_replace('!^(ldap://[^/]+)/.*$!', '\\1', $this->src_info['context']);
146                                $this->src_info['host'] = $host;
147                                $this->src_info['acc'] = '';
148                                $this->src_info['pw']  = '';
149                        }
150
151                        $ldap = $GLOBALS['phpgw']->common->ldapConnect($this->src_info['host'], $this->src_info['acc'], $this->src_info['pw'], true);
152
153                        if (!$ldap)
154                        {
155                                return false;
156                        }
157
158                        if (!$this->external)
159                        {
160                                $fields[]  ='phpgwAccountVisible';
161                        }
162
163                        $result_r = @ldap_search($ldap ,($refer_context  ? $refer_context  : $this->src_info['context']), $filter, $fields, 0);
164
165                        if (!$result_r)
166                        {
167                                return false;
168                        }
169
170                        if ($other['order'])
171                        {
172                                $sort_f = array($other['order']);
173                                $ldap_sort_by = $this->translate_fields($sort_f, $restric_fields);
174                        }
175
176                        if ($ldap_sort_by)
177                        {
178                                if (!ldap_sort($ldap, $result_r, $ldap_sort_by[$other['order']][0]))
179                                {
180                                        return false;
181                                }
182                        }
183
184                        $result_u = ldap_get_entries($ldap, $result_r);
185
186                        $i = 0;
187                        foreach ($result_u as $index => $result_p)
188                        {
189                                if ($index === 'count' or $index === 'dn' or (!$this->external and $result_p['phpgwaccountvisible'][0] == '-1'))
190                                {
191                                        continue;
192                                }
193
194                                foreach ($trans_f as $orig => $trans)
195                                {
196                                        $orig = substr($orig, strrpos($orig, '.')+1, strlen($orig));
197                                        foreach ($trans as $f)
198                                        {
199                                                if ($f === 'dn')
200                                                {
201                                                        $return[$i][$orig] = $result_p['dn'];
202                                                }
203                                                else if ($result_p[$f][0])
204                                                {
205                                                        $return[$i][$orig] = $result_p[$f][0];
206                                                }
207                                        }
208                                }
209                                $i++;
210                        }
211
212                        return $return;
213                }
214
215                /*
216
217                        @function translate_fields
218                        @abstract Return the LDAP objectClass fields that corresponds to the
219                                specified parameter fields
220                        @author Raphael Derosso Pereira
221
222                        @param array $fields The fields in the standard ContactCenter format
223                        @param array $rules The rules
224
225                */
226                function translate_fields ( $fields, &$restric_fields )
227                {
228                        $return = array();
229
230                        $i = 0;
231                        foreach ($fields as $field)
232                        {
233                                if (!array_key_exists($field,$this->trans_table) or !$this->trans_table[$field])
234                                {
235                                        continue;
236                                }
237
238                                if (!is_array($this->trans_table[$field]))
239                                {
240                                        $reference = $this->trans_table[$field];
241
242                                        reset($restric_fields);
243                                        while(list(,$field_r) = each($restric_fields))
244                                        {
245
246                                                if ($field_r['field'] === $reference and array_key_exists($field_r['value'], $this->trans_table[$reference]))
247                                                {
248                                                        array_push($return[$field], $this->trans_table[$reference][$field_r['value']]);
249                                                }
250                                        }
251                                }
252                                else
253                                {
254
255                                        if (!is_array($return[$field]))
256                                        {
257                                                $return[$field] = $this->trans_table[$field];
258                                        }
259                                        else
260                                        {
261                                                array_push($return[$field], $this->trans_table[$field]);
262                                        }
263                                }
264                        }
265
266                        if (count($return))
267                        {
268                                return $return;
269                        }
270
271                        return false;
272                }
273
274                /*
275
276                        @function process_restrictions
277                        @abstract Returns a LDAP filter string that corresponds to the
278                                specified restriction rules
279                        @author Raphael Derosso Pereira
280
281                        @param string $rules The restriction rules
282
283                */
284                function process_restrictions( $rules, &$trans_table, $join_type='&' )
285                {
286                        if (!is_array($rules) or !count($rules))
287                        {
288                                return null;
289                        }
290
291                        foreach($rules as $rule_i => $rule)
292                        {
293                                $t = array();
294                                switch($rule['type'])
295                                {
296                                        case 'branch':
297                                                switch(strtoupper($rule['value']))
298                                                {
299                                                        case 'OR':
300                                                                $join = '|';
301                                                                break;
302
303                                                        case 'AND':
304                                                                $join = '&';
305                                                                break;
306
307                                                        case 'NOT':
308                                                                $join = '!';
309                                                                break;
310
311                                                        default:
312                                                                $join = $join_type;
313                                                }
314                                                $return_t[] = $this->process_restrictions($rule['sub_branch'], $trans_table, $join);
315                                                break;
316
317                                        case '=':
318                                                if (array_key_exists($rule['field'], $trans_table))
319                                                {
320                                                        foreach($trans_table[$rule['field']] as $field)
321                                                        {
322                                                                $t[] = '('.$field.'='.$rule['value'].')';
323                                                        }
324                                                        $return_t[] = '(|'.implode(' ',$t).')';
325                                                }
326                                                break;
327
328                                        case '!=':
329                                                if (array_key_exists($rule['field'], $trans_table))
330                                                {
331                                                        foreach($trans_table[$rule['field']] as $field)
332                                                        {
333                                                                $t[] = '(!('.$field.'='.$rule['value'].'))';
334                                                        }
335                                                        $return_t[] = '(&'.implode(' ',$t).')';
336                                                }
337                                                break;
338
339                                        case '<=':
340                                        case '<':
341                                                if (array_key_exists($rule['field'], $trans_table))
342                                                {
343                                                        foreach($trans_table[$rule['field']] as $field)
344                                                        {
345                                                                $t[] = '('.$field.'<='.$rule['value'].')';
346                                                        }
347                                                        $return_t[] = '(|'.implode(' ',$t).')';
348                                                }
349                                                break;
350
351                                        case '>':
352                                        case '>=':
353                                                if (array_key_exists($rule['field'], $trans_table))
354                                                {
355                                                        foreach($trans_table[$rule['field']] as $field)
356                                                        {
357                                                                $t[] = '('.$field.'>='.$rule['value'].')';
358                                                        }
359                                                        $return_t[] = '(|'.implode(' ',$t).')';
360                                                }
361                                                break;
362
363                                        case 'NULL':
364                                                if (array_key_exists($rule['field'], $trans_table))
365                                                {
366                                                        foreach($trans_table[$rule['field']] as $field)
367                                                        {
368                                                                $t[] = '(!('.$field.'=*'.'))';
369                                                        }
370                                                        $return_t[] = '(&'.implode(' ',$t).')';
371                                                }
372                                                break;
373
374                                        case 'IN':
375                                                if (array_key_exists($rule['field'], $trans_table))
376                                                {
377                                                        foreach($trans_table[$rule['field']] as $field)
378                                                        {
379                                                                foreach($rule['value'] as $value)
380                                                                {
381                                                                        $t[] = '('.$field.'='.$value.')';
382                                                                }
383                                                        }
384                                                        $return_t[] = '(|'.implode(' ',$t).')';
385                                                }
386                                                break;
387
388                                        case 'iLIKE':
389/*                                              if (array_key_exists($rule['field'], $trans_table))
390                                                {
391                                                        $value_1 = strtoupper(str_replace('%', '*', $rule['value']));
392                                                        $value_2 = strtolower($value_1);
393
394                                                        foreach($trans_table[$rule['field']] as $field)
395                                                        {
396                                                                $t[] = '('.$field.'='.$value_1.')';
397                                                                $t[] = '('.$field.'='.$value_2.')';
398                                                        }
399                                                        $return_t[] = '(|'.implode(' ',$t).')';
400                                                }
401                                                break;
402
403*/                                      case 'LIKE':
404                                                if (array_key_exists($rule['field'], $trans_table))
405                                                {
406                                                        $value = str_replace('%', '*', $rule['value']);
407
408                                                        foreach($trans_table[$rule['field']] as $field)
409                                                        {
410                                                                $t[] = '('.$field.'='.$value.')';
411                                                        }
412                                                        $return_t[] = '(|'.implode(' ',$t).')';
413                                                }
414                                                break;
415
416                                        case 'NOT NULL':
417                                                if (array_key_exists($rule['field'], $trans_table))
418                                                {
419                                                        foreach($trans_table[$rule['field']] as $field)
420                                                        {
421                                                                $t[] = '('.$field.'=*'.')';
422                                                        }
423                                                        $return_t[] = '(|'.implode(' ',$t).')';
424                                                }
425                                                break;
426
427                                        case 'NOT IN':
428                                                if (array_key_exists($rule['field'], $trans_table))
429                                                {
430                                                        foreach($trans_table[$rule['field']] as $field)
431                                                        {
432                                                                foreach($rule['value'] as $value)
433                                                                {
434                                                                        $t[] = '('.$field.'='.$value.')';
435                                                                }
436                                                        }
437                                                        $return_t[] = '(!(|'.implode('',$t).'))';
438                                                }
439                                                break;
440
441                                        case 'NOT iLIKE':
442                                                if (array_key_exists($rule['field'], $trans_table))
443                                                {
444                                                        $value_1 = strtoupper(str_replace('%', '*', $rule['value']));
445                                                        $value_2 = strtolower($value_1);
446
447                                                        foreach($trans_table[$rule['field']] as $field)
448                                                        {
449                                                                $t[] = '('.$field.'='.$value_1.')';
450                                                                $t[] = '('.$field.'='.$value_2.')';
451                                                        }
452                                                        $return_t[] = '(!(|'.implode(' ',$t).'))';
453                                                }
454                                                break;
455
456                                        case 'NOT LIKE':
457                                                if (array_key_exists($rule['field'], $trans_table))
458                                                {
459                                                        $value = str_replace('%', '*', $rule['value']);
460
461                                                        foreach($trans_table[$rule['field']] as $field)
462                                                        {
463                                                                $t[] = '('.$field.'='.$value.')';
464                                                        }
465                                                        $return_t[] = '(!(|'.implode(' ',$t).'))';
466                                                }
467                                                break;
468                                }
469                        }
470
471                        if (count($return_t))
472                        {
473                                $return = '('.$join_type;
474                                foreach ($return_t as $return_p)
475                                {
476                                        $return .= $return_p;
477                                }
478                                $return .= ')';
479                        }
480                        else
481                        {
482                                $return = null;
483                        }
484                        return $return;
485                }
486
487                /*!
488
489                        @function get_restrictions_without_branch
490                        @abstract Returns an array containing the restrictions ignoring the
491                                branches
492                        @author Raphael Derosso Pereira
493
494                        @param array $restrictions The restrictions
495
496                */
497                function get_restrictions_without_branch(&$restrictions)
498                {
499                        if (!is_array($restrictions))
500                        {
501                                return null;
502                        }
503
504                        $fields = array();
505
506                        foreach ($restrictions as $restrict_data)
507                        {
508                                switch($restrict_data['type'])
509                                {
510                                        case 'branch':
511                                                $fields = array_merge($fields, $this->get_restrictions_without_branch($restrict_data['sub_branch']));
512                                                break;
513
514                                        case '=':
515                                        case '!=':
516                                        case '<=':
517                                        case '<':
518                                        case '>':
519                                        case '>=':
520                                        case 'NULL':
521                                        case 'IN':
522                                        case 'LIKE':
523                                        case 'iLIKE':
524                                        case 'NOT NULL':
525                                        case 'NOT IN':
526                                        case 'NOT LIKE':
527                                        case 'NOT iLIKE':
528                                                array_push($fields, $restrict_data);
529                                                break;
530
531                                        default:
532                                                exit('Error in '.__FILE__.' on '.__LINE__.'<br>The restriction type passed was: '.$restrict_data['type']);
533                                }
534                        }
535
536                        return $fields;
537                }
538
539
540                /*********************************************************************\
541                 *                        Methods to Get Data                        *
542                \*********************************************************************/
543
544
545                /*!
546
547                 @function get_single_entry
548                 @abstract Returns all information requested about one contact
549                 @author Raphael Derosso Pereira
550
551                 @param integer $id_contact The contact ID
552                 @param array $fields The array returned by get_fields with true
553                        on the fields to be taken.
554
555                */
556                function get_single_entry ( $id_contact, $fields )
557                {
558                        if (!is_array($fields))
559                        {
560                                if (is_object($GLOBALS['phpgw']->log))
561                                {
562                                        $GLOBALS['phpgw']->log->message(array(
563                                                'text' => 'F-BadcontactcenterParam, wrong get_single_entry parameters type.',
564                                                'line' => __LINE__,
565                                                'file' => __FILE__));
566
567                                        $GLOBALS['phpgw']->log->commit();
568                                }
569                                else
570                                {
571                                        exit('Argument Error on: <br>File:'.__FILE__.'<br>Line:'.__LINE__.'<br>');
572                                }
573                        }
574
575                        $ldap = $GLOBALS['phpgw']->common->ldapConnect($this->src_info['host'],$this->src_info['acc'],$this->src_info['pw'],true);
576
577                        if (!$ldap)
578                        {
579                                return false;
580                        }
581
582                        $resource = ldap_read($ldap, $id_contact, 'objectClass='.$this->src_info['obj']);
583                        $n_entries = ldap_count_entries($ldap, $resource);
584                        if ( $n_entries > 1 or $n_entries < 1)
585                        {
586                                return false;
587                        }
588
589                        $first_entry = ldap_first_entry($ldap, $resource);
590                        $contact = ldap_get_attributes($ldap,$first_entry);
591                        if($contact['jpegPhoto']){
592                                $contact['jpegPhoto'] = ldap_get_values_len ($ldap, $first_entry, "jpegPhoto");
593                        }
594
595//                      print_r($contact);
596
597                //      $contact_data = $this->fields;
598
599                        foreach($fields as $field => $trueness)
600                        {
601                                if (!$trueness)
602                                {
603                                        //unset($contact_data[$field]);
604                                        continue;
605                                }
606
607                                switch ($field)
608                                {
609                                        case 'companies':
610                                                unset($l_fields);
611                                                $l_fields['company_name']  = $this->trans_table['contact.company.company_name'];
612                                                $l_fields['title']         = $this->trans_table['contact.business_info.title'];
613                                                $l_fields['department']    = $this->trans_table['contact.business_info.department'];
614                                                $l_fields['company_notes'] = $this->trans_table['contact.company.company_notes'];
615
616                                                $contact_data['companies'] = array();
617                                                foreach($l_fields as $l_field => $l_value)
618                                                {
619                                                        if (!( $contact[$l_value[0]][0]))
620                                                        {
621                                                                continue;
622                                                        }
623
624                                                        $contact_data['companies']['company1'][$l_field] = utf8_decode($contact[$l_value[0]][0]);
625                                                }
626
627                                                if (!(count($contact_data['companies'])))
628                                                {
629                                                        unset($contact_data['companies']);
630                                                }
631                                                break;
632
633                                        case 'relations':
634                                                unset($l_fields);
635                                                if (!$this->trans_table['contact.contact_related.names_ordered'])
636                                                {
637                                                        unset($contact_data['relations']);
638                                                }
639
640                                                $contact_data['relations'] = array();
641                                                if (!is_array($this->trans_table['contact.contact_related.names_ordered']))
642                                                {
643                                                        if (!($trans = $this->trans_table[$this->trans_table['contact.contact_related.names_ordered']]))
644                                                        {
645                                                                continue;
646                                                        }
647
648                                                        $i = 1;
649                                                        foreach($trans as $l_type => $l_type_fields)
650                                                        {
651                                                                if (!($contact[$l_type_fields[0]][0]))
652                                                                {
653                                                                        continue;
654                                                                }
655
656                                                                $contact_data['relations']['relation'.$i]['type'] = $l_type;
657                                                                $contact_data['relations']['relation'.$i]['names_ordered'] = utf8_decode($contact[$l_type_fields[0]][0]);
658                                                                $i++;
659                                                        }
660                                                }
661
662                                                if (!(count($contact_data['relations'])))
663                                                {
664                                                        unset($contact_data['relations']);
665                                                }
666                                                break;
667
668                                        case 'addresses':
669                                                unset($l_fields);
670                                                $l_fields['address1'] = $this->trans_table['contact.address.address1'];
671                                                $l_fields['address2'] = $this->trans_table['contact.address.address2'];
672                                                $l_fields['complement'] = $this->trans_table['contact.address.complement'];
673                                                $l_fields['address_other'] = $this->trans_table['contact.address.address_other'];
674                                                $l_fields['postal_code'] = $this->trans_table['contact.address.postal_code'];
675                                                $l_fields['po_box'] = $this->trans_table['contact.address.po_box'];
676                                                $l_fields['id_city'] = $this->trans_table['contact.address.city.id_city'];
677                                                $l_fields['city_name'] = $this->trans_table['contact.address.city.city_name'];
678                                                $l_fields['city_timezone'] = $this->trans_table['contact.address.city.city_timezone'];
679                                                $l_fields['city_geo_location'] = $this->trans_table['contact.address.city.city_geo_location'];
680                                                $l_fields['id_state'] = $this->trans_table['contact.address.city.state.id_state'];
681                                                $l_fields['state_name'] = $this->trans_table['contact.address.city.state.state_name'];
682                                                $l_fields['state_symbol'] = $this->trans_table['contact.address.city.state.state_symbol'];
683                                                $l_fields['id_country'] = $this->trans_table['contact.address.city.country.id_country'];
684                                                $l_fields['country_name'] = $this->trans_table['contact.address.city.country.country_name'];
685                                                $l_fields['address_is_default'] = $this->trans_table['contact.address.address_is_default'];
686
687                                                $contact_data['addresses'] = array();
688                                                foreach($l_fields as $l_field => $l_value)
689                                                {
690                                                        if (!is_array($l_value))
691                                                        {
692                                                                if (!($trans = $this->trans_table[$l_value]))
693                                                                {
694                                                                        continue;
695                                                                }
696
697                                                                $i = 1;
698                                                                foreach($trans as $l_type => $l_type_fields)
699                                                                {
700                                                                        if (!($contact[$l_type_fields[0]][0]))
701                                                                        {
702                                                                                continue;
703                                                                        }
704
705                                                                        $contact_data['addresses']['address'.$i]['type'] = $l_type;
706                                                                        $contact_data['addresses']['address'.$i][$l_field] = utf8_decode($contact[$l_type_fields[0]][0]);
707                                                                        $i++;
708                                                                }
709                                                        }
710                                                        else
711                                                        {
712                                                                $contact_data['addresses']['address1'][$l_field] = utf8_decode($contact[$l_value[0]][0]);
713                                                        }
714                                                }
715
716                                                if (!(count($contact_data['addresses'])))
717                                                {
718                                                        unset($contact_data['addresses']);
719                                                }
720                                                break;
721
722                                        case 'connections':
723                            $preferences = ExecMethod('contactcenter.ui_preferences.get_preferences');
724                            if (!is_array($preferences))
725                            {
726                                                        $preferences['personCardEmail'] = 1;
727                                                        $preferences['personCardPhone'] = 2;
728                                                }
729                                                unset($l_fields);
730                                                $l_fields['connection_name'] = $this->trans_table['contact.connection.connection_name'];
731                                                $l_fields['connection_value'] = $this->trans_table['contact.connection.connection_value'];
732
733                                                $contact_data['connections'] = array();
734                                                foreach($l_fields as $l_field => $l_value)
735                                                {
736                                                        if (!is_array($l_value))
737                                                        {
738                                                                if (!($trans = $this->trans_table[$l_value]))
739                                                                {
740                                                                        continue;
741                                                                }
742
743                                                                $i = 1;
744                                                                foreach($trans as $l_type => $l_type_fields)
745                                                                {
746                                                                        if (!($contact[$l_type_fields[0]][0]))
747                                                                        {
748                                                                                continue;
749                                                                        }
750
751                                                                        switch ($l_type)
752                                                                        {
753                                                                                case 'email':
754                                                                                $contact_data['connections']['connection'.$i]['id_type'] = $preferences['personCardEmail'];
755                                                                                break;
756
757                                                                                default:
758                                                                                $contact_data['connections']['connection'.$i]['id_type'] = $preferences['personCardPhone'];
759                                                                        }
760                                                                        $contact_data['connections']['connection'.$i]['type'] = $l_type;
761                                                                        $contact_data['connections']['connection'.$i][$l_field] = utf8_decode($contact[$l_type_fields[0]][0]);
762                                                                        $i++;
763                                                                }
764                                                        }
765                                                        else
766                                                        {
767                                                                $contact_data['connections']['connection1'][$l_field] = utf8_decode($contact[$l_value[0]][0]);
768                                                        }
769                                                }
770
771                                                if (!(count($contact_data['connections'])))
772                                                {
773                                                        unset($contact_data['connections']);
774                                                }
775                                                break;
776
777                                        case 'prefix':
778                                                unset($l_fields);
779                                                $l_fields = $this->trans_table['contact.prefixes.prefix'];
780                                                if (!$l_fields or !$contact[$l_fields[0]][0])
781                                                {
782                                                        unset($contact_data['prefix']);
783                                                        continue;
784                                                }
785
786                                                $contact_data['prefix'] = utf8_decode($contact[$l_fields[0]][0]);
787                                                break;
788
789                                        case 'suffix':
790                                                unset($l_fields);
791                                                $l_fields = $this->trans_table['contact.suffixes.suffix'];
792                                                if (!$l_fields or !$contact[$l_fields[0]][0])
793                                                {
794                                                        unset($contact_data['suffix']);
795                                                        continue;
796                                                }
797
798                                                $contact_data['suffix'] = utf8_decode($contact[$l_fields[0]][0]);
799                                                break;
800
801                                        case 'status':
802                                                unset($l_fields);
803                                                $l_fields = $this->trans_table['contact.status.status_name'];
804                                                if (!$l_fields or !$contact[$l_fields[0]][0])
805                                                {
806                                                        unset($contact_data['status']);
807                                                        continue;
808                                                }
809
810                                                $contact_data['status'] = utf8_decode($contact[$l_fields[0]][0]);
811                                                break;
812
813                                                case 'photo':
814                                                unset($l_fields);
815                                                $l_fields = $this->trans_table['contact.photo'];
816                                                if (!$l_fields or !$contact[$l_fields[0]][0])
817                                                {
818                                                        unset($contact_data['photo']);
819                                                        continue;
820                                                }
821
822                                                $contact_data['photo'] = $contact[$l_fields[0]][0];
823                                                break;
824
825                                        default:
826                                                unset($l_fields);
827                                                $l_fields = $this->trans_table['contact.'.$field];
828                                                if (!$l_fields or !$contact[$l_fields[0]][0])
829                                                {
830                                                        unset($contact_data[$field]);
831                                                        continue;
832                                                }
833
834                                                if(count($contact[$l_fields[0]]) > 1)
835                                                {
836                                                        $tmp = array();
837                                                        foreach ($contact[$l_fields[0]] as $i => $j)
838                                                        {
839                                                                $tmp["$i"] = utf8_decode($j);
840                                                        }
841                                                        //$contact_data[$field] = $contact[$l_fields[0]];
842                                                        $contact_data[$field] = $tmp;
843                                                }
844                                                else
845                                                        $contact_data[$field] = utf8_decode($contact[$l_fields[0]][0]);
846
847                                                break;
848                                }
849                        }
850
851                        if (!is_array($contact_data))
852                        {
853                                return false;
854                        }
855
856                        return $contact_data;
857                }
858
859                /*!
860
861                 @function get_all_entries
862                 @abstract Returns all information requested about a bunch of contacts, usually a page
863                 @author Raphael Derosso Pereira
864                 @author Mário César Kolling
865
866                 @param string $filter Filter (returned by generate_filter).
867                 @param array $fields The array returned by get_fields with true
868                        on the fields to be taken.
869
870                */
871                function get_all_entries($filter, $fields)
872                {
873                        if (!is_array($fields))
874                        {
875                                if (is_object($GLOBALS['phpgw']->log))
876                                {
877                                        $GLOBALS['phpgw']->log->message(array(
878                                                'text' => 'F-BadcontactcenterParam, wrong get_single_entry parameters type.',
879                                                'line' => __LINE__,
880                                                'file' => __FILE__));
881
882                                        $GLOBALS['phpgw']->log->commit();
883                                }
884                                else
885                                {
886                                        exit('Argument Error on: <br>File:'.__FILE__.'<br>Line:'.__LINE__.'<br>');
887                                }
888                        }
889
890                        $ldap = $GLOBALS['phpgw']->common->ldapConnect($this->src_info['host'],$this->src_info['acc'],$this->src_info['pw'],true);
891
892                        if (!$ldap)
893                        {
894                                return false;
895                        }
896
897                        $resource = @ldap_search($ldap, $this->src_info['dn'], $filter);
898                        $n_entries = @ldap_count_entries($ldap, $resource);
899
900                        ldap_sort($ldap, $resource, 'cn');
901
902                        if ( $n_entries < 1)
903                        {
904                                return false;
905                        }
906
907                        $contacts = array();
908
909                        for ($entry = ldap_first_entry($ldap, $resource);
910                                 $entry != false;
911                                 $entry = ldap_next_entry($ldap, $entry))
912                        {
913                                $contact = ldap_get_attributes($ldap,$entry);
914                                if($contact['jpegPhoto']){
915                                        $contact['jpegPhoto'] = ldap_get_values_len ($ldap, $entry, "jpegPhoto");
916                                }
917
918                                foreach($fields as $field => $trueness)
919                                {
920                                        if (!$trueness)
921                                        {
922                                                //unset($contact_data[$field]);
923                                                continue;
924                                        }
925
926                                        switch ($field)
927                                        {
928                                                case 'companies':
929                                                        unset($l_fields);
930                                                        $l_fields['company_name']  = $this->trans_table['contact.company.company_name'];
931                                                        $l_fields['title']         = $this->trans_table['contact.business_info.title'];
932                                                        $l_fields['department']    = $this->trans_table['contact.business_info.department'];
933                                                        $l_fields['company_notes'] = $this->trans_table['contact.company.company_notes'];
934
935                                                        ///Relaciona o array com o atributo 'employeeNumber' do RHDS
936                                                        $l_fields['empNumber']     = $this->trans_table['contact.business_info.empNumber'];
937
938                                                        $contact_data['companies'] = array();
939                                                        foreach($l_fields as $l_field => $l_value)
940                                                        {
941                                                                if (!( $contact[$l_value[0]][0]))
942                                                                {
943                                                                        continue;
944                                                                }
945
946                                                                $contact_data['companies']['company1'][$l_field] = utf8_decode($contact[$l_value[0]][0]);
947                                                        }
948
949                                                        if (!(count($contact_data['companies'])))
950                                                        {
951                                                                unset($contact_data['companies']);
952                                                        }
953                                                        break;
954
955                                                case 'relations':
956                                                        unset($l_fields);
957                                                        if (!$this->trans_table['contact.contact_related.names_ordered'])
958                                                        {
959                                                                unset($contact_data['relations']);
960                                                        }
961
962                                                        $contact_data['relations'] = array();
963                                                        if (!is_array($this->trans_table['contact.contact_related.names_ordered']))
964                                                        {
965                                                                if (!($trans = $this->trans_table[$this->trans_table['contact.contact_related.names_ordered']]))
966                                                                {
967                                                                        continue;
968                                                                }
969
970                                                                $i = 1;
971                                                                foreach($trans as $l_type => $l_type_fields)
972                                                                {
973                                                                        if (!($contact[$l_type_fields[0]][0]))
974                                                                        {
975                                                                                continue;
976                                                                        }
977
978                                                                        $contact_data['relations']['relation'.$i]['type'] = $l_type;
979                                                                        $contact_data['relations']['relation'.$i]['names_ordered'] = utf8_decode($contact[$l_type_fields[0]][0]);
980                                                                        $i++;
981                                                                }
982                                                        }
983
984                                                        if (!(count($contact_data['relations'])))
985                                                        {
986                                                                unset($contact_data['relations']);
987                                                        }
988                                                        break;
989
990                                                case 'addresses':
991                                                        unset($l_fields);
992                                                        $l_fields['address1'] = $this->trans_table['contact.address.address1'];
993                                                        $l_fields['address2'] = $this->trans_table['contact.address.address2'];
994                                                        $l_fields['complement'] = $this->trans_table['contact.address.complement'];
995                                                        $l_fields['address_other'] = $this->trans_table['contact.address.address_other'];
996                                                        $l_fields['postal_code'] = $this->trans_table['contact.address.postal_code'];
997                                                        $l_fields['po_box'] = $this->trans_table['contact.address.po_box'];
998                                                        $l_fields['id_city'] = $this->trans_table['contact.address.city.id_city'];
999                                                        $l_fields['city_name'] = $this->trans_table['contact.address.city.city_name'];
1000                                                        $l_fields['city_timezone'] = $this->trans_table['contact.address.city.city_timezone'];
1001                                                        $l_fields['city_geo_location'] = $this->trans_table['contact.address.city.city_geo_location'];
1002                                                        $l_fields['id_state'] = $this->trans_table['contact.address.city.state.id_state'];
1003                                                        $l_fields['state_name'] = $this->trans_table['contact.address.city.state.state_name'];
1004                                                        $l_fields['state_symbol'] = $this->trans_table['contact.address.city.state.state_symbol'];
1005                                                        $l_fields['id_country'] = $this->trans_table['contact.address.city.country.id_country'];
1006                                                        $l_fields['country_name'] = $this->trans_table['contact.address.city.country.country_name'];
1007                                                        $l_fields['address_is_default'] = $this->trans_table['contact.address.address_is_default'];
1008
1009                                                        $contact_data['addresses'] = array();
1010                                                        foreach($l_fields as $l_field => $l_value)
1011                                                        {
1012                                                                if (!is_array($l_value))
1013                                                                {
1014                                                                        if (!($trans = $this->trans_table[$l_value]))
1015                                                                        {
1016                                                                                continue;
1017                                                                        }
1018
1019                                                                        $i = 1;
1020                                                                        foreach($trans as $l_type => $l_type_fields)
1021                                                                        {
1022                                                                                if (!($contact[$l_type_fields[0]][0]))
1023                                                                                {
1024                                                                                        continue;
1025                                                                                }
1026
1027                                                                                $contact_data['addresses']['address'.$i]['type'] = $l_type;
1028                                                                                $contact_data['addresses']['address'.$i][$l_field] = utf8_decode($contact[$l_type_fields[0]][0]);
1029                                                                                $i++;
1030                                                                        }
1031                                                                }
1032                                                                else
1033                                                                {
1034                                                                        $contact_data['addresses']['address1'][$l_field] = utf8_decode($contact[$l_value[0]][0]);
1035                                                                }
1036                                                        }
1037
1038                                                        if (!(count($contact_data['addresses'])))
1039                                                        {
1040                                                                unset($contact_data['addresses']);
1041                                                        }
1042                                                        break;
1043
1044                                                case 'connections':
1045                                    $preferences = ExecMethod('contactcenter.ui_preferences.get_preferences');
1046                                    if (!is_array($preferences))
1047                                    {
1048                                                                $preferences['personCardEmail'] = 1;
1049                                                                $preferences['personCardPhone'] = 2;
1050                                                        }
1051                                                        unset($l_fields);
1052                                                        $l_fields['connection_name'] = $this->trans_table['contact.connection.connection_name'];
1053                                                        $l_fields['connection_value'] = $this->trans_table['contact.connection.connection_value'];
1054
1055                                                        $contact_data['connections'] = array();
1056                                                        foreach($l_fields as $l_field => $l_value)
1057                                                        {
1058                                                                if (!is_array($l_value))
1059                                                                {
1060                                                                        if (!($trans = $this->trans_table[$l_value]))
1061                                                                        {
1062                                                                                continue;
1063                                                                        }
1064
1065                                                                        $i = 1;
1066                                                                        foreach($trans as $l_type => $l_type_fields)
1067                                                                        {
1068                                                                                if (!($contact[$l_type_fields[0]][0]))
1069                                                                                {
1070                                                                                        continue;
1071                                                                                }
1072
1073                                                                                switch ($l_type)
1074                                                                                {
1075                                                                                        case 'email':
1076                                                                                        $contact_data['connections']['connection'.$i]['id_type'] = $preferences['personCardEmail'];
1077                                                                                        break;
1078
1079                                                                                        default:
1080                                                                                        $contact_data['connections']['connection'.$i]['id_type'] = $preferences['personCardPhone'];
1081                                                                                }
1082                                                                                $contact_data['connections']['connection'.$i]['type'] = $l_type;
1083                                                                                $contact_data['connections']['connection'.$i][$l_field] = utf8_decode($contact[$l_type_fields[0]][0]);
1084                                                                                $i++;
1085                                                                        }
1086                                                                }
1087                                                                else
1088                                                                {
1089                                                                        $contact_data['connections']['connection1'][$l_field] = utf8_decode($contact[$l_value[0]][0]);
1090                                                                }
1091                                                        }
1092
1093                                                        if (!(count($contact_data['connections'])))
1094                                                        {
1095                                                                unset($contact_data['connections']);
1096                                                        }
1097                                                        break;
1098
1099                                                case 'prefix':
1100                                                        unset($l_fields);
1101                                                        $l_fields = $this->trans_table['contact.prefixes.prefix'];
1102                                                        if (!$l_fields or !$contact[$l_fields[0]][0])
1103                                                        {
1104                                                                unset($contact_data['prefix']);
1105                                                                continue;
1106                                                        }
1107
1108                                                        $contact_data['prefix'] = utf8_decode($contact[$l_fields[0]][0]);
1109                                                        break;
1110
1111                                                case 'suffix':
1112                                                        unset($l_fields);
1113                                                        $l_fields = $this->trans_table['contact.suffixes.suffix'];
1114                                                        if (!$l_fields or !$contact[$l_fields[0]][0])
1115                                                        {
1116                                                                unset($contact_data['suffix']);
1117                                                                continue;
1118                                                        }
1119
1120                                                        $contact_data['suffix'] = utf8_decode($contact[$l_fields[0]][0]);
1121                                                        break;
1122
1123                                                case 'status':
1124                                                        unset($l_fields);
1125                                                        $l_fields = $this->trans_table['contact.status.status_name'];
1126                                                        if (!$l_fields or !$contact[$l_fields[0]][0])
1127                                                        {
1128                                                                unset($contact_data['status']);
1129                                                                continue;
1130                                                        }
1131
1132                                                        $contact_data['status'] = utf8_decode($contact[$l_fields[0]][0]);
1133                                                        break;
1134
1135                                                        case 'photo':
1136                                                        unset($l_fields);
1137                                                        $l_fields = $this->trans_table['contact.photo'];
1138                                                        if (!$l_fields or !$contact[$l_fields[0]][0])
1139                                                        {
1140                                                                unset($contact_data['photo']);
1141                                                                continue;
1142                                                        }
1143
1144                                                        $contact_data['photo'] = $contact[$l_fields[0]][0];
1145                                                        break;
1146
1147                                                default:
1148                                                        unset($l_fields);
1149                                                        $l_fields = $this->trans_table['contact.'.$field];
1150                                                        if (!$l_fields or !$contact[$l_fields[0]][0])
1151                                                        {
1152                                                                unset($contact_data[$field]);
1153                                                                continue;
1154                                                        }
1155
1156                                                        if(count($contact[$l_fields[0]]) > 1)
1157                                                        {
1158                                                                $tmp = array();
1159                                                                foreach ($contact[$l_fields[0]] as $i => $j)
1160                                                                {
1161                                                                        $tmp["$i"] = utf8_decode($j);
1162                                                                }
1163                                                                //$contact_data[$field] = $contact[$l_fields[0]];
1164                                                                $contact_data[$field] = $tmp;
1165                                                        }
1166                                                        else
1167                                                                $contact_data[$field] = utf8_decode($contact[$l_fields[0]][0]);
1168
1169                                                        break;
1170
1171                                        }
1172                                }
1173
1174                                if (is_array($contact_data))
1175                                {
1176                                        $contacts[ldap_get_dn($ldap, $entry)] = $contact_data;
1177                                }
1178
1179                        }
1180
1181                        return $contacts;
1182                }
1183
1184                function get_multiple_entries ( $id_contacts, $fields, $other_data = false )
1185                {
1186                        if (!is_array($id_contacts) or !is_array($fields) or ($other_data != false and !is_array($other_data)))
1187                        {
1188                                if (is_object($GLOBALS['phpgw']->log))
1189                                {
1190                                        $GLOBALS['phpgw']->log->message(array(
1191                                                'text' => 'F-BadcontactcenterParam, wrong get_multiple_entry parameter type.',
1192                                                'line' => __LINE__,
1193                                                'file' => __FILE__));
1194
1195                                        $GLOBALS['phpgw']->log->commit();
1196                                }
1197                                else {
1198                                        exit('Argument Error on: <br>File:'.__FILE__.'<br>Line:'.__LINE__.'<br>');
1199                                }
1200                        }
1201
1202                        $contacts = array();
1203
1204                        if ($other_data)
1205                        {
1206                                //TODO
1207                        }
1208
1209                        $filter = $this->generate_filter($id_contacts);
1210
1211                        //$teste = $this->get_all_entries($filter, $fields);
1212
1213                        return $this->get_all_entries($filter, $fields);
1214                }
1215
1216                function generate_filter($id_contacts)
1217                {
1218                        if (($size = count($id_contacts)))
1219                        {
1220                                $filter = '(&(objectClass='.$this->src_info['obj'] .  ')(|';
1221                                for ($i = 0; $i < $size; $i++)
1222                                {
1223
1224                                        /*
1225                                         * Não utiliza mais a função ldap_explode, usa a expressão regular a seguir para pegar o primeiro
1226                                         * componente da dn
1227                                         */
1228                                        preg_match('/^(\w*=[^,]*),.*$/', $id_contacts[$i], $cn);
1229
1230                                /*
1231                                 * Adicionados os str_replace para adicionar caracteres de escape em frente aos caracteres '(' e ')',
1232                                 * posteriormente poderá ser necessário substituir por uma expressão regular mais genérica.
1233                                 */
1234                                        if ($cn[1])
1235                                        {
1236                                                /*
1237                                                 * Esta operação resolve o problema causado pela conversão de caracteres acentuados realizada
1238                                                 * pela função ldap_explode_dn(). Talvez seja necessário utilizar esta tradução em outros lugares,
1239                                                 * neste caso é mais apropriado colocar dentro de uma função.
1240                                                 */
1241                                                //foreach($cn as $key=>$value){
1242                                        //      $cn[$key]=preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $value);
1243                                        //}
1244
1245                                                $filter .= '(' . str_replace(')', '\)', str_replace('(','\(',$cn[1])) . ')';
1246                                        }
1247                                }
1248                                $filter .= '))';
1249                        }
1250
1251                        return $filter;
1252
1253                }
1254
1255                function get_all_entries_ids ()
1256                {
1257                        $search_fields = array('contact.id_contact', 'contact.names_ordered');
1258                        $search_rules  = array(
1259                                0 => array(
1260                                        'field' => 'contact.names_ordered',
1261                                        'type'  => 'LIKE',
1262                                        'value' => '%'
1263                                )
1264                        );
1265                        $search_other  = array('order' => 'contact.names_ordered');
1266
1267                        $result_i = $this->find($search_fields, $search_rules, $search_other);
1268
1269                        if (is_array($result_i) and count($result_i))
1270                        {
1271                                $result = array();
1272                                foreach($result_i as $result_part)
1273                                {
1274                                        $result[] = $result_part['id_contact'];
1275                                }
1276
1277                                return $result;
1278                        }
1279
1280                        return null;
1281                }
1282
1283                function get_relations ($id_contact,$extra=false)
1284                {
1285                }
1286
1287                function get_addresses ( $id_contact,$extra=false )
1288                {
1289                }
1290
1291                function get_connections ( $id_contact,$extra=false )
1292                {
1293                }
1294
1295                function get_companies ( $id_contact, $extra=false )
1296                {
1297                }
1298
1299                function get_all_prefixes (  )
1300                {
1301                }
1302
1303                function get_all_suffixes (  )
1304                {
1305                }
1306
1307                function get_all_status (  )
1308                {
1309                }
1310
1311                function get_all_relations_types (  )
1312                {
1313                }
1314
1315                function get_all_addresses_types (  )
1316                {
1317                }
1318
1319                function get_all_connections_types (  )
1320                {
1321                }
1322
1323                function get_vcard ( $id_contact )
1324                {
1325                }
1326
1327
1328
1329
1330                function get_global_tree ( $root )
1331                {
1332                }
1333
1334                function get_actual_brach (  )
1335                {
1336                }
1337
1338                function set_actual_branch ( $branch )
1339                {
1340                }
1341        }
1342?>
Note: See TracBrowser for help on using the repository browser.