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

Revision 1419, 35.6 KB checked in by eduardoalex, 15 years ago (diff)

Ticket #421 - Ajuste no tratamento do referral para catalogo externo

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