Browse Source

exporting vcards works now

tags/v2.0.4
Christoph Haas 3 years ago
parent
commit
eb0cb9a5ad
4 changed files with 173 additions and 6 deletions
  1. +166
    -5
      php/module.contact.php
  2. +7
    -1
      resources/css/contactimporter-main.css
  3. BIN
      resources/images/download.png
  4. BIN
      resources/images/download.xcf

+ 166
- 5
php/module.contact.php View File

@@ -28,7 +28,7 @@ use JeroenDesloovere\VCard\VCardParser;
class ContactModule extends Module {
private $DEBUG = false; // enable error_log debugging
private $DEBUG = true; // enable error_log debugging
/**
* @constructor
@@ -244,6 +244,14 @@ class ContactModule extends Module {
$GLOBALS["bus"]->addData($this->getResponseData());
}
private function getProp($props, $propname) {
$p = $this->getProperties();
if(isset($props["props"][$propname])){
return $props["props"][$propname];
}
return "";
}
private function exportContacts($actionType, $actionData)
{
// Get store id
@@ -270,13 +278,129 @@ class ContactModule extends Module {
$store = $GLOBALS["mapisession"]->openMessageStore(hex2bin($storeid));
if ($store) {
for ($index = 0, $count = count($records); $index < $count; $index++) {
// define vcard
$vcard = new VCard();
$message = mapi_msgstore_openentry($store, hex2bin($records[$index]));
// get message properties.
$messageProps = mapi_getprops($message, array(PR_DISPLAY_NAME));
file_put_contents($file, file_get_contents($file) . $messageProps[PR_DISPLAY_NAME]);
$properties = $GLOBALS['properties']->getContactProperties();
$plaintext = true;
$messageProps = $GLOBALS['operations']->getMessageProps($store, $message, $properties, $plaintext);
// define variables
$firstname = $this->getProp($messageProps, "given_name");
$lastname = $this->getProp($messageProps, "surname");
$additional = $this->getProp($messageProps, "middle_name");
$prefix = $this->getProp($messageProps, "display_name_prefix");
$suffix = '';
// add personal data
$vcard->addName($lastname, $firstname, $additional, $prefix, $suffix);
$company = $this->getProp($messageProps, "company_name");
if(!empty($company)) {
$vcard->addCompany($company);
}
$jobtitle = $this->getProp($messageProps, "title");
if(!empty($jobtitle)) {
$vcard->addJobtitle($jobtitle);
}
// MAIL
$mail = $this->getProp($messageProps, "email_address_1");
if(!empty($mail)) {
$vcard->addEmail($mail);
}
$mail = $this->getProp($messageProps, "email_address_2");
if(!empty($mail)) {
$vcard->addEmail($mail);
}
$mail = $this->getProp($messageProps, "email_address_3");
if(!empty($mail)) {
$vcard->addEmail($mail);
}
// TODO: implement vcf
// PHONE
$wphone = $this->getProp($messageProps, "business_telephone_number");
if(!empty($wphone)) {
$vcard->addPhoneNumber($wphone, 'WORK');
}
$wphone = $this->getProp($messageProps, "home_telephone_number");
if(!empty($wphone)) {
$vcard->addPhoneNumber($wphone, 'HOME');
}
$wphone = $this->getProp($messageProps, "cellular_telephone_number");
if(!empty($wphone)) {
$vcard->addPhoneNumber($wphone, 'CELL');
}
$wphone = $this->getProp($messageProps, "business_fax_number");
if(!empty($wphone)) {
$vcard->addPhoneNumber($wphone, 'FAX');
}
$wphone = $this->getProp($messageProps, "pager_telephone_number");
if(!empty($wphone)) {
$vcard->addPhoneNumber($wphone, 'PAGER');
}
$wphone = $this->getProp($messageProps, "car_telephone_number");
if(!empty($wphone)) {
$vcard->addPhoneNumber($wphone, 'CAR');
}
// ADDRESS
$addr = $this->getProp($messageProps, "business_address");
if(!empty($addr)) {
$vcard->addAddress(null, null, $this->getProp($messageProps, "business_address_street"), $this->getProp($messageProps, "business_address_city"), $this->getProp($messageProps, "business_address_state"), $this->getProp($messageProps, "business_address_postal_code"), $this->getProp($messageProps, "business_address_country"), "WORK");
}
$addr = $this->getProp($messageProps, "home_address");
if(!empty($addr)) {
$vcard->addAddress(null, null, $this->getProp($messageProps, "home_address_street"), $this->getProp($messageProps, "home_address_city"), $this->getProp($messageProps, "home_address_state"), $this->getProp($messageProps, "home_address_postal_code"), $this->getProp($messageProps, "home_address_country"), "HOME");
}
$addr = $this->getProp($messageProps, "other_address");
if(!empty($addr)) {
$vcard->addAddress(null, null, $this->getProp($messageProps, "other_address_street"), $this->getProp($messageProps, "other_address_city"), $this->getProp($messageProps, "other_address_state"), $this->getProp($messageProps, "other_address_postal_code"), $this->getProp($messageProps, "other_address_country"), "OTHER");
}
// MISC
$url = $this->getProp($messageProps, "webpage");
if(!empty($url)) {
$vcard->addURL($url);
}
$bday = $this->getProp($messageProps, "birthday");
if(!empty($bday)) {
$vcard->addBirthday(date("Y-m-d", $bday));
}
$notes = $this->getProp($messageProps, "body");
if(!empty($notes)) {
$vcard->addNote($notes);
}
$haspicture = $this->getProp($messageProps, "has_picture");
if(!empty($haspicture) && $haspicture === true) {
$attachnum = -1;
if(isset($messageProps["attachments"]) && isset($messageProps["attachments"]["item"])) {
foreach($messageProps["attachments"]["item"] as $attachment) {
if($attachment["props"]["attachment_contactphoto"] == true) {
$attachnum = $attachment["props"]["attach_num"];
break;
}
}
}
if($attachnum >= 0) {
$attachment = $this->getAttachmentByAttachNum($message, $attachnum); // get first attachment only
$phototoken = $this->randomstring(16);
$tmpphoto = PLUGIN_CONTACTIMPORTER_TMP_UPLOAD . "photo_" . $phototoken . ".jpg";
$this->storeSavedAttachment($tmpphoto, $attachment);
$vcard->addPhoto($tmpphoto, true);
unlink($tmpphoto);
}
}
// write combined vcf
file_put_contents($file, file_get_contents($file) . $vcard->getOutput());
}
} else {
return false;
@@ -284,12 +408,49 @@ class ContactModule extends Module {
$response['status'] = true;
$response['download_token'] = $token;
$response['filename'] = "test.csv";
$response['filename'] = count($records)."contacts.vcf";
$this->addActionData($actionType, $response);
$GLOBALS["bus"]->addData($this->getResponseData());
}
/**
* Returns attachment based on specified attachNum, additionally it will also get embedded message
* if we want to get the inline image attachment.
* @param $message
* @param array $attachNum
* @return MAPIAttach embedded message attachment or attachment that is requested
*/
private function getAttachmentByAttachNum($message, $attachNum)
{
// open the attachment
$attachment = mapi_message_openattach($message, $attachNum);
return $attachment;
}
/**
* Function will open passed attachment and generate response for that attachment to send it to client.
* This should only be used to download attachment that is already saved in MAPIMessage.
* @param MAPIAttach $attachment attachment which will be dumped to client side
* @return Response response to sent to client including attachment data
*/
private function storeSavedAttachment($temppath, $attachment) {
// Check if the attachment is opened
if($attachment) {
// Open a stream to get the attachment data
$stream = mapi_openproperty($attachment, PR_ATTACH_DATA_BIN, IID_IStream, 0, 0);
$stat = mapi_stream_stat($stream);
// Read the attachment content from the stream
$body = '';
for($i = 0; $i < $stat['cb']; $i += BLOCK_SIZE) {
$body .= mapi_stream_read($stream, BLOCK_SIZE);
}
file_put_contents($temppath, $body);
}
}
private function replaceStringPropertyTags($store, $properties) {
$newProperties = array();

+ 7
- 1
resources/css/contactimporter-main.css View File

@@ -3,4 +3,10 @@
background-repeat: no-repeat;
background-position: center;
background-size: 18px!important;
}
}
.icon_contactimporter_export {
background: url(../images/download.png) no-repeat;
background-repeat: no-repeat;
background-position: center;
}

BIN
resources/images/download.png View File

Before After
Width: 14  |  Height: 14  |  Size: 224B

BIN
resources/images/download.xcf View File


Loading…
Cancel
Save