source: sandbox/2.2.0.2/contactcenter/inc/class.bo_global_ldap_catalog.inc.php @ 4352

Revision 4352, 38.1 KB checked in by airton, 13 years ago (diff)

Ticket #1820 - Modificado implementacao que lista Referrals, sem ldap_next_reference() - r4326

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