Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master
executable file 265 lines (248 sloc) 9.14 kb
<?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;
}
}
Jump to Line
Something went wrong with that request. Please try again.