summaryrefslogtreecommitdiff
path: root/plugins/kolab_addressbook/kolab_addressbook.php
blob: 68179c3870999c7e0b0b14791b1428cfd42805a3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<?php

require_once(dirname(__FILE__) . '/rcube_kolab_contacts.php');

/**
 * Kolab address book
 * 
 * Sample plugin to add a new address book source with data from Kolab storage
 * This is work-in-progress for the Roundcube+Kolab integration.
 *
 * @author Thomas Bruederli <roundcube@gmail.com>
 * 
 */
class kolab_addressbook extends rcube_plugin
{
    private $folders;
    private $sources;

    /**
     * Required startup method of a Roundcube plugin
     */
    public function init()
    {
        // load required plugin
        $this->require_plugin('kolab_core');
        
        $this->add_texts('localization');
        
        // register hooks
        $this->add_hook('addressbooks_list', array($this, 'address_sources'));
        $this->add_hook('addressbook_get', array($this, 'get_address_book'));
        $this->add_hook('contact_form', array($this, 'contact_form'));
        
        // extend list of address sources to be used for autocompletion
        $rcmail = rcmail::get_instance();
        if ($rcmail->action == 'autocomplete' || $rcmail->action == 'group-expand') {
            $sources = (array) $rcmail->config->get('autocomplete_addressbooks', array());
            foreach ($this->_list_sources() as $abook_id => $abook) {
                if (!in_array($abook_id, $sources))
                    $sources[] = $abook_id;
            }
            $rcmail->config->set('autocomplete_addressbooks', $sources);
        }
    }

    /**
     * Handler for the addressbooks_list hook.
     *
     * This will add all instances of available Kolab-based address books
     * to the list of address sources of Roundcube.
     *
     * @param array Hash array with hook parameters
     * @return array Hash array with modified hook parameters
     */
    public function address_sources($p)
    {
        foreach ($this->_list_sources() as $abook_id => $abook) {
            // register this address source
            $p['sources'][$abook_id] = array(
                'id' => $abook_id,
                'name' => $abook->get_name(),
                'readonly' => $abook->readonly,
                'groups' => $abook->groups,
            );
        }

        return $p;
    }


    /**
     * Getter for the rcube_addressbook instance
     */
    public function get_address_book($p)
    {
        if ($this->sources[$p['id']]) {
            $p['instance'] = $this->sources[$p['id']];
        }
        
        return $p;
    }
    
    
    private function _list_sources()
    {
        // already read sources
        if (isset($this->sources))
            return $this->sources;

        // get all folders that have "contact" type
        $this->folders = rcube_kolab::get_folders('contact');
        $this->sources = array();

        if (PEAR::isError($this->folders)) {
            raise_error(array(
              'code' => 600, 'type' => 'php',
              'file' => __FILE__, 'line' => __LINE__,
              'message' => "Failed to list contact folders from Kolab server:" . $this->folders->getMessage()),
            true, false);
        }
        else {
            foreach ($this->folders as $c_folder) {
                // create instance of rcube_contacts
                $abook_id = strtolower(asciiwords(strtr($c_folder->name, '/.', '--')));
                $abook = new rcube_kolab_contacts($c_folder->name);
                $this->sources[$abook_id] = $abook;
            }
        }
        
        return $this->sources;
    }
    
    
    /**
     * Plugin hook called before rendering the contact form or detail view
     */
    public function contact_form($p)
    {
        // none of our business
        if (!is_a($GLOBALS['CONTACTS'], 'rcube_kolab_contacts'))
            return $p;
          
        // extend the list of contact fields to be displayed in the 'info' section
        if (is_array($p['form']['info'])) {
            $p['form']['info']['content']['initials'] = array('size' => 6);
            $p['form']['info']['content']['officelocation'] = array('size' => 40);
            $p['form']['info']['content']['profession'] = array('size' => 40);
            $p['form']['info']['content']['children'] = array('size' => 40);
            
            // re-order fields according to the coltypes list
            $block = array();
            $contacts = reset($this->sources);
            foreach ($contacts->coltypes as $col => $prop) {
                if (isset($p['form']['info']['content'][$col]))
                    $block[$col] = $p['form']['info']['content'][$col];
            }
            
            $p['form']['info']['content'] = $block;
            
            // define a separate section 'settings'
            $p['form']['settings'] = array(
                'name'    => rcube_label('kolab_addressbook.settings'),
                'content' => array(
                    'pgppublickey' => array('size' => 40, 'visible' => true),
                    'freebusyurl'  => array('size' => 40, 'visible' => true),
                )
            );
        }
        
        return $p;
    }

}