commit | author | age
|
cc97ea
|
1 |
<?php |
T |
2 |
|
|
3 |
/** |
|
4 |
* Detect VCard attachments and show a button to add them to address book |
|
5 |
* |
|
6 |
* @version 1.0 |
|
7 |
* @author Thomas Bruederli |
|
8 |
*/ |
|
9 |
class vcard_attachments extends rcube_plugin |
|
10 |
{ |
|
11 |
public $task = 'mail'; |
|
12 |
|
|
13 |
private $message; |
|
14 |
private $vcard_part; |
|
15 |
|
|
16 |
function init() |
|
17 |
{ |
|
18 |
$rcmail = rcmail::get_instance(); |
|
19 |
if ($rcmail->action == 'show' || $rcmail->action == 'preview') { |
|
20 |
$this->add_hook('message_load', array($this, 'message_load')); |
|
21 |
$this->add_hook('template_object_messagebody', array($this, 'html_output')); |
|
22 |
} |
|
23 |
|
|
24 |
$this->register_action('plugin.savevcard', array($this, 'save_vcard')); |
|
25 |
} |
|
26 |
|
|
27 |
/** |
|
28 |
* Check message attachments for vcards |
|
29 |
*/ |
|
30 |
function message_load($p) |
|
31 |
{ |
|
32 |
$this->message = $p['object']; |
|
33 |
|
|
34 |
foreach ((array)$this->message->attachments as $attachment) { |
|
35 |
if (in_array($attachment->mimetype, array('text/vcard', 'text/x-vcard'))) |
|
36 |
$this->vcard_part = $attachment->mime_id; |
|
37 |
} |
|
38 |
} |
|
39 |
|
|
40 |
/** |
|
41 |
* This callback function adds a box below the message content |
|
42 |
* if there is a vcard attachment available |
|
43 |
*/ |
|
44 |
function html_output($p) |
|
45 |
{ |
|
46 |
if ($this->vcard_part) { |
|
47 |
$vcard = new rcube_vcard($this->message->get_part_content($this->vcard_part)); |
|
48 |
|
|
49 |
// successfully parsed vcard |
|
50 |
if ($vcard->displayname) { |
|
51 |
$display = $vcard->displayname; |
|
52 |
if ($vcard->email[0]) |
|
53 |
$display .= ' <'.$vcard->email[0].'>'; |
|
54 |
|
|
55 |
// add box below messsage body |
c7a2e8
|
56 |
$p['content'] .= html::p(array('style' => "margin:1em; padding:0.5em; border:1px solid #999; border-radius:4px; -moz-border-radius:4px; -webkit-border-radius:4px; width: auto;"), |
cc97ea
|
57 |
html::a(array( |
T |
58 |
'href' => "#", |
|
59 |
'onclick' => "return plugin_vcard_save_contact('".JQ($this->vcard_part)."')", |
|
60 |
'title' => "Save contact in local address book"), // TODO: localize this title |
c7a2e8
|
61 |
html::img(array('src' => $this->url('vcard_add_contact.png'), 'align' => "middle"))) |
cc97ea
|
62 |
. ' ' . html::span(null, Q($display))); |
T |
63 |
|
|
64 |
$this->include_script('vcardattach.js'); |
|
65 |
} |
|
66 |
} |
|
67 |
|
|
68 |
return $p; |
|
69 |
} |
|
70 |
|
|
71 |
/** |
|
72 |
* Handler for request action |
|
73 |
*/ |
|
74 |
function save_vcard() |
|
75 |
{ |
|
76 |
$uid = get_input_value('_uid', RCUBE_INPUT_POST); |
|
77 |
$mbox = get_input_value('_mbox', RCUBE_INPUT_POST); |
|
78 |
$mime_id = get_input_value('_part', RCUBE_INPUT_POST); |
|
79 |
|
|
80 |
$rcmail = rcmail::get_instance(); |
|
81 |
$part = $uid && $mime_id ? $rcmail->imap->get_message_part($uid, $mime_id) : null; |
|
82 |
|
|
83 |
$error_msg = 'Failed to saved vcard'; // TODO: localize this text |
|
84 |
|
|
85 |
if ($part && ($vcard = new rcube_vcard($part)) && $vcard->displayname && $vcard->email) { |
|
86 |
$contacts = $rcmail->get_address_book(null, true); |
|
87 |
|
|
88 |
// check for existing contacts |
|
89 |
$existing = $contacts->search('email', $vcard->email[0], true, false); |
|
90 |
if ($done = $existing->count) { |
|
91 |
$rcmail->output->command('display_message', $this->gettext('contactexists'), 'warning'); |
|
92 |
} |
|
93 |
else { |
|
94 |
// add contact |
|
95 |
$success = $contacts->insert(array( |
|
96 |
'name' => $vcard->displayname, |
|
97 |
'firstname' => $vcard->firstname, |
|
98 |
'surname' => $vcard->surname, |
|
99 |
'email' => $vcard->email[0], |
|
100 |
'vcard' => $vcard->export(), |
|
101 |
)); |
|
102 |
|
|
103 |
if ($success) |
|
104 |
$rcmail->output->command('display_message', $this->gettext('addedsuccessfully'), 'confirmation'); |
|
105 |
else |
|
106 |
$rcmail->output->command('display_message', $error_msg, 'error'); |
|
107 |
} |
|
108 |
} |
|
109 |
else |
|
110 |
$rcmail->output->command('display_message', $error_msg, 'error'); |
|
111 |
|
|
112 |
$rcmail->output->send(); |
|
113 |
} |
|
114 |
|
|
115 |
} |