<?php | |
/** | |
* @file | |
* A class to generate vCards for contact data. | |
*/ | |
class vCard | |
{ | |
// An array of this vCard's contact data. | |
protected $data; | |
// Filename for download file naming. | |
protected $filename; | |
// vCard class: PUBLIC, PRIVATE, CONFIDENTIAL. | |
protected $class; | |
// vCard revision date. | |
protected $revisionDate; | |
// The vCard generated. | |
protected $card; | |
/** | |
* The constructor. | |
*/ | |
public function __construct() | |
{ | |
$this->data = array( | |
'display_name' => null, | |
'first_name' => null, | |
'last_name' => null, | |
'additional_name' => null, | |
'name_prefix' => null, | |
'name_suffix' => null, | |
'nickname' => null, | |
'title' => null, | |
'role' => null, | |
'department' => null, | |
'company' => null, | |
'work_po_box' => null, | |
'work_extended_address' => null, | |
'work_address' => null, | |
'work_city' => null, | |
'work_state' => null, | |
'work_postal_code' => null, | |
'work_country' => null, | |
'home_po_box' => null, | |
'home_extended_address' => null, | |
'home_address' => null, | |
'home_city' => null, | |
'home_state' => null, | |
'home_postal_code' => null, | |
'home_country' => null, | |
'office_tel' => null, | |
'home_tel' => null, | |
'cell_tel' => null, | |
'fax_tel' => null, | |
'pager_tel' => null, | |
'email1' => null, | |
'email2' => null, | |
'url' => null, | |
'photo' => null, | |
'birthday' => null, | |
'timezone' => null, | |
'sort_string' => null, | |
'note' => null, | |
); | |
return true; | |
} | |
/** | |
* Global setter. | |
* | |
* @param string $key | |
* Name of the property. | |
* @param mixed $value | |
* Value to set. | |
* | |
* @return vCard | |
* Return itself. | |
*/ | |
public function set($key, $value) | |
{ | |
// Check if the specified property is defined. | |
if (property_exists($this, $key) && $key != 'data') { | |
$this->{$key} = trim($value); | |
return $this; | |
} elseif (property_exists($this, $key) && $key == 'data') { | |
foreach ($value as $v_key => $v_value) { | |
$this->{$key}[$v_key] = trim($v_value); | |
} | |
return $this; | |
} else { | |
return false; | |
} | |
} | |
/** | |
* Checks all the values, builds appropriate defaults for | |
* missing values and generates the vcard data string. | |
*/ | |
function build() | |
{ | |
if (!$this->class) { | |
$this->class = 'PUBLIC'; | |
} | |
if (!$this->data['display_name']) { | |
$this->data['display_name'] = $this->data['first_name'] . ' ' . $this->data['last_name']; | |
} | |
if (!$this->data['sort_string']) { | |
$this->data['sort_string'] = $this->data['last_name']; | |
} | |
if (!$this->data['sort_string']) { | |
$this->data['sort_string'] = $this->data['company']; | |
} | |
if (!$this->data['timezone']) { | |
$this->data['timezone'] = date("O"); | |
} | |
if (!$this->revisionDate) { | |
$this->revisionDate = date('Y-m-d H:i:s'); | |
} | |
$this->card = "BEGIN:VCARD\r\n"; | |
$this->card .= "VERSION:3.0\r\n"; | |
$this->card .= "CLASS:" . $this->class . "\r\n"; | |
$this->card .= "PRODID:-//class_vCard from WhatsAPI//NONSGML Version 1//EN\r\n"; | |
$this->card .= "REV:" . $this->revisionDate . "\r\n"; | |
$this->card .= "FN:" . $this->data['display_name'] . "\r\n"; | |
$this->card .= "N:" | |
. $this->data['last_name'] . ";" | |
. $this->data['first_name'] . ";" | |
. $this->data['additional_name'] . ";" | |
. $this->data['name_prefix'] . ";" | |
. $this->data['name_suffix'] . "\r\n"; | |
if ($this->data['nickname']) { | |
$this->card .= "NICKNAME:" . $this->data['nickname'] . "\r\n"; | |
} | |
if ($this->data['title']) { | |
$this->card .= "TITLE:" . $this->data['title'] . "\r\n"; | |
} | |
if ($this->data['company']) { | |
$this->card .= "ORG:" . $this->data['company']; | |
} | |
if ($this->data['department']) { | |
$this->card .= ";" . $this->data['department']; | |
} | |
$this->card .= "\r\n"; | |
if ($this->data['work_po_box'] || $this->data['work_extended_address'] || $this->data['work_address'] || $this->data['work_city'] || $this->data['work_state'] || $this->data['work_postal_code'] || $this->data['work_country']) { | |
$this->card .= "ADR;type=WORK:" | |
. $this->data['work_po_box'] . ";" | |
. $this->data['work_extended_address'] . ";" | |
. $this->data['work_address'] . ";" | |
. $this->data['work_city'] . ";" | |
. $this->data['work_state'] . ";" | |
. $this->data['work_postal_code'] . ";" | |
. $this->data['work_country'] . "\r\n"; | |
} | |
if ($this->data['home_po_box'] || $this->data['home_extended_address'] || $this->data['home_address'] || $this->data['home_city'] || $this->data['home_state'] || $this->data['home_postal_code'] || $this->data['home_country']) { | |
$this->card .= "ADR;type=HOME:" | |
. $this->data['home_po_box'] . ";" | |
. $this->data['home_extended_address'] . ";" | |
. $this->data['home_address'] . ";" | |
. $this->data['home_city'] . ";" | |
. $this->data['home_state'] . ";" | |
. $this->data['home_postal_code'] . ";" | |
. $this->data['home_country'] . "\r\n"; | |
} | |
if ($this->data['email1']) { | |
$this->card .= "EMAIL;type=INTERNET,pref:" . $this->data['email1'] . "\r\n"; | |
} | |
if ($this->data['email2']) { | |
$this->card .= "EMAIL;type=INTERNET:" . $this->data['email2'] . "\r\n"; | |
} | |
if ($this->data['office_tel']) { | |
$this->card .= "TEL;type=WORK,voice:" . $this->data['office_tel'] . "\r\n"; | |
} | |
if ($this->data['home_tel']) { | |
$this->card .= "TEL;type=HOME,voice:" . $this->data['home_tel'] . "\r\n"; | |
} | |
if ($this->data['cell_tel']) { | |
$this->card .= "TEL;type=CELL,voice:" . $this->data['cell_tel'] . "\r\n"; | |
} | |
if ($this->data['fax_tel']) { | |
$this->card .= "TEL;type=WORK,fax:" . $this->data['fax_tel'] . "\r\n"; | |
} | |
if ($this->data['pager_tel']) { | |
$this->card .= "TEL;type=WORK,pager:" . $this->data['pager_tel'] . "\r\n"; | |
} | |
if ($this->data['url']) { | |
$this->card .= "URL;type=WORK:" . $this->data['url'] . "\r\n"; | |
} | |
if ($this->data['birthday']) { | |
$this->card .= "BDAY:" . $this->data['birthday'] . "\r\n"; | |
} | |
if ($this->data['role']) { | |
$this->card .= "ROLE:" . $this->data['role'] . "\r\n"; | |
} | |
if ($this->data['note']) { | |
$this->card .= "NOTE:" . $this->data['note'] . "\r\n"; | |
} | |
if ($this->data['photo']) { | |
$this->card .= $this->generatePhotoData(); | |
} | |
$this->card .= "TZ:" . $this->data['timezone'] . "\r\n"; | |
$this->card .= "END:VCARD\r\n"; | |
} | |
protected function generatePhotoData() | |
{ | |
$photo = $this->data['photo']; | |
$data = "PHOTO;"; | |
//detect type | |
if (substr($photo, 0, 4) == 'http') { | |
//url | |
$data .= 'URL:' . $photo; | |
} else { | |
//path | |
$bindata = file_get_contents($photo); | |
$bindata = base64_encode($bindata); | |
$data .= 'BASE64:' . $bindata; | |
} | |
$data .= "\r\n"; | |
return $data; | |
} | |
/** | |
* Streams the vcard to the browser client. | |
* | |
* @return bool | |
*/ | |
function download() | |
{ | |
if (!$this->card) { | |
$this->build(); | |
} | |
if (!$this->filename) { | |
$this->filename = $this->data['display_name']; | |
} | |
$this->filename = str_replace(' ', '_', $this->filename); | |
header("Content-type: text/directory"); | |
header("Content-Disposition: attachment; filename=" . $this->filename . ".vcf"); | |
header("Pragma: public"); | |
echo $this->card; | |
return true; | |
} | |
/** | |
* Show the vCard. | |
* | |
* @return object vCard | |
*/ | |
function show() | |
{ | |
if (!$this->card) { | |
$this->build(); | |
} | |
return $this->card; | |
} | |
} |