Skip to content

vCard Library revised

World Wide Web Server edited this page Jul 4, 2012 · 4 revisions

I've done a revision to a previously posted vCard library.

The vcard.zip file includes a sample controller with usage examples as well as the library itself. File:vcard.zip

Here is the library: [code] <?php if( ! defined('BASEPATH')) exit('No direct script access allowed'); /**

  • CodeIgniter vCard library
  • Extended by Jeremy Gimbel [[email protected]]
  • Based upon vCard library for Codeigniter by Carlos Alcala [[email protected]]
  • and class_vcard from Troy Wolf [[email protected]]
  • March 3, 2010
  • Usage within Codeigniter:
  • Place the Vcard.php file in your system/application/libraries directory.
  • Load the library using $this->load->library('vcard');
  • Create an associative array for the card data using keys for each field that match those below
  • Generate a vCard file using one of the generate methods (generate_string, generate_file,
  • generate_download)
  • See sample app.php controller file for an example.
  • Information at: http://dreadfullyposh.com/ */

class Vcard { // private CI instance private $ci;

// private array for data from caller
private $data;

// private string for storing the text of the finished card
private $card_string;


public function __construct()
{
    $this->ci =& get_instance();

}


/** 
 * Vcard class constructor 
 * 
 * Initializes the data array, either to blank values to values
 * provided in the parameters. An optional filename or directory
 * can be  specified to generate the vCard in one step
 * 
 * @access public 
 * @param array $data
 * @param string $filename
 *  
 */ 
public function Vcard($data = false, $filename = false)
{
    // initialize the array
    $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,
        'revision_date' => null,
        'class' => null
    );
    
    // check if an array of data was provided
    // if so, add values from the array to the 
    // class data array
    if(is_array($data))
    {
        foreach($data as $item => $value)
        {
            $this->data[$item] = $value;
        }
    }

    // check if a filename was provided
    // if so, load the generate_file&#40;&#41; method
    if(is_string($filename))
    {
        $this->generate_file&#40;$filename&#41;;

    }

}


/** 
 * Load 
 * 
 * Initializes the data array, to values provided in 
 * the parameters. 
 * 
 * @access public 
 * @param array $data
 *  
 */ 
public function load($data)
{
    // initialize the array
    $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,
        'revision_date' => null,
        'class' => null
    );
    
    // make sure data array was provided
    // if so, load the values into the class
    // data array
    if(is_array($data))
    {
        foreach($data as $item => $value)
        {
            $this->data[$item] = $value;
        }
    }

}


/** 
 * generate_file 
 * 
 * Generates a vcf file on the server. Accepts either 
 * a filename or directory. If a filename is provided
 * the method generates the vcf file with that name. If
 * a directory is provided, the filename is built from
 * the display name and the file is placed in the specified
 * directory.
 * 
 * @access public 
 * @param string $filename
 * @return string path and filename 
 */ 
public function generate_file&#40;$filename&#41;
{
    $this->_build();
    
    if(is_dir($filename))
        $filename .= $this->_build_filename();
    
    $fh = fopen&#40;$filename, 'w'&#41;;
    
    if(!$fh)
        return false;
    
    fwrite($fh, $this->card_string);
    fclose($fh);

    return $filename;
}


/** 
 * generate_string 
 * 
 * Generates a vcf formatted string. 
 * 
 * @access public 
 * @return string vcf formatted data 
 */ 
public function generate_string()
{

    $this->_build();
    return $this->card_string;

}


/** 
 * generate_download 
 * 
 * Generates a vcf file and forces a download to the
 * browser. Accepts a filename If a filename is not 
 * provided, the filename is built from the display 
 * name.
 * 
 * @access public 
 * @param string $filename
 */ 
public function generate_download($filename = null)
{
    $this->_build();
    
    if($filename == null)
    {
        $filename = $this->_build_filename();
    
    }
    $this->ci->load->helper('download');
    
    force_download($filename, $this->card_string);     


}


/** 
 * _build 
 * 
 * Generates a vcf formatted string from the data array 
 * and stores it in the private class variable
 * 
 * @access private 
 */ 
private function _build()
{
    /*
    For many of the values, if they are not passed in, we set defaults or
    build them based on other values.
    */

    if(!$this->data['class']) { $this->data['class'] = "PUBLIC"; }
    if(!$this->data['display_name']) 
    {
          $this->data['display_name'] = trim($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->data['revision_date']) { $this->data['revision_date'] = date('Y-m-d H:i:s'); }

      $this->card_string = "BEGIN:VCARD\r\n";
    $this->card_string .= "VERSION:3.0\r\n";
    $this->card_string .= "CLASS:".$this->data['class']."\r\n";
    $this->card_string .= "PRODID:-//Vcard Extended Class from [email protected]//NONSGML Version 1//EN\r\n";
    $this->card_string .= "REV:".$this->data['revision_date']."\r\n";
      $this->card_string .= "FN:".$this->data['display_name']."\r\n";
    $this->card_string .= "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_string .= "NICKNAME:".$this->data['nickname']."\r\n"; }
      if($this->data['title']) { $this->card_string .= "TITLE:".$this->data['title']."\r\n"; }
      if($this->data['company']) { $this->card_string .= "ORG:".$this->data['company']; }
      if($this->data['department']) { $this->card_string .= ";".$this->data['department']; }
      $this->card_string .= "\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_string .= "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_string .= "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_string .= "EMAIL;TYPE=internet,pref:".$this->data['email1']."\r\n"; }
    if($this->data['email2']) { $this->card_string .= "EMAIL;TYPE=internet:".$this->data['email2']."\r\n"; }
    if($this->data['office_tel']) { $this->card_string .= "TEL;TYPE=work,voice:".$this->data['office_tel']."\r\n"; }
    if($this->data['home_tel']) { $this->card_string .= "TEL;TYPE=home,voice:".$this->data['home_tel']."\r\n"; }
    if($this->data['cell_tel']) { $this->card_string .= "TEL;TYPE=cell,voice:".$this->data['cell_tel']."\r\n"; }
    if($this->data['fax_tel']) { $this->card_string .= "TEL;TYPE=work,fax:".$this->data['fax_tel']."\r\n"; }
    if($this->data['pager_tel']) { $this->card_string .= "TEL;TYPE=work,pager:".$this->data['pager_tel']."\r\n"; }
    if($this->data['url']) { $this->card_string .= "URL;TYPE=work:".$this->data['url']."\r\n"; }
      if($this->data['birthday']) { $this->card_string .= "BDAY:".$this->data['birthday']."\r\n"; }
      if($this->data['role']) { $this->card_string .= "ROLE:".$this->data['role']."\r\n"; }
      if($this->data['note']) { $this->card_string .= "NOTE:".$this->data['note']."\r\n"; }
      $this->card_string .= "TZ:".$this->data['timezone']."\r\n";
    $this->card_string .= "END:VCARD\r\n";

}

/** 
 * _build_filename 
 * 
 * Generates a filename from the display name
 * in the card data
 * 
 * @access private 
 * @return string filename 
 */ 
private function _build_filename()
{
    $filename = trim($this->data['display_name']);
    $filename = str_replace(" ", "_", $filename);
    $filename .= '.vcf';
    
    return $filename;

}

}

[/code]

And here is the sample controller: [code] <?php /**

*/ class App extends Controller {

function App()
{
    parent::Controller();    
}

function index()
{
    /*
    Initialize an array to store the various vCard data
    */
    $card_data = array();

    /*
    If you leave this blank, the current timestamp will be used.
    */
    //$card_data['revision_date'] = "";

    /*
    Possible values are PUBLIC, PRIVATE, and CONFIDENTIAL. If you leave class
    blank, it will default to PUBLIC.
    */
    //$card_data['class'] = "PUBLIC";

    /*
    Contact's name data.
    If you leave display_name blank, it will be built using the first and last name.
    */
    //$card_data['display_name'] = "";
    $card_data['first_name'] = "Test";
    $card_data['last_name'] = "Person";
    $card_data['additional_name'] = "A"; //Middle name
    $card_data['name_prefix'] = "Mr.";  //Mr. Mrs. Dr.
    $card_data['name_suffix'] = ""; //DDS, MD, III, other designations.
    $card_data['nickname'] = "TP";

    /*
    Contact's company, department, title, profession
    */
    $card_data['company'] = "Test Company";
    //$card_data['department'] = "";
    $card_data['title'] = "Senior Web Developer";
    $card_data['role'] = "Developer";

    /*
    Contact's work address
    */
    //$card_data['work_po_box'] = "";
    //$card_data['work_extended_address'] = "";
    $card_data['work_address'] = "123 Main Street";
    $card_data['work_city'] = "New York";
    $card_data['work_state'] = "NY";
    $card_data['work_postal_code'] = "10023";
    //$card_data['work_country'] = "United States of America";

    /*
    Contact's home address
    */
    //$card_data['home_po_box'] = "";
    //$card_data['home_extended_address'] = "";
    $card_data['home_address'] = "456 Broadway";
    $card_data['home_city'] = "New York";
    $card_data['home_state'] = "NY";
    $card_data['home_postal_code'] = "10001";
    //$card_data['home_country'] = "United States of America";

    /*
    Contact's telephone numbers.
    */
    $card_data['office_tel'] = "";
    //$card_data['home_tel'] = "";
    $card_data['cell_tel'] = "(123) 456-7890";
    $card_data['fax_tel'] = "";
    //$card_data['pager_tel'] = "";

    /*
    Contact's email addresses
    */
    $card_data['email1'] = "[email protected]";
    //$card_data['email2'] = "";

    /*
    Contact's website
    */
    $card_data['url'] = "http://www.yoursite.com";

    /*
    Some other contact data.
    */
    //$card_data['photo'] = "";  //Enter a URL.
    $card_data['birthday'] = "1979-01-02";
    $card_data['timezone'] = "-05:00";

    /*
    If you leave this blank, the class will default to using last_name or company.
    */
    //$card_data['sort_string'] = "";

    /*
    Notes about this contact.
    */
    $card_data['note'] = "Some notes go here.";
    
    
    /*
    Now we load up the library.
    */
    $this->load->library('vcard');
    
    /*
    Load the $card_data array into the library
    */
    $this->vcard->load($card_data);
    
    /*
    Now we can generate a vCard in a variety of ways.
    */
    
    // Generate a file on a server, providing a path and filename.
    // Path and filename are returned
    $path_and_filename = $this->vcard->generate_file&#40;'/path/to/filename.vcf'&#41;;
    
    // Generate a file on a server, providing only a path. Filename is generated.
    // Path and filename are returned
    $path_and_filename = $this->vcard->generate_file&#40;'/path/to/'&#41;;
    
    // Generate a vCard data string (to write to file yourself, etc.)
    $string = $this->vcard->generate_string();
    
    // Generate a vCard and force download to the browser, providing a filename
    $this->vcard->generate_download('filename.vcf');
    
    // Generate a vCard and force download to the browser, generate a filename automatically
    $this->vcard->generate_download();
    


} 

}

/* End of file app.php / / Location: ./system/application/controllers/app.php */

[/code]

I hope someone will find these changes to the original work useful.

Clone this wiki locally