Created
April 10, 2013 23:09
-
-
Save pamelafox-coursera/5359246 to your computer and use it in GitHub Desktop.
Generate iCal files in PHP
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class CalendarEvent { | |
/** | |
* | |
* The event ID | |
* @var string | |
*/ | |
private $uid; | |
/** | |
* The event start date | |
* @var DateTime | |
*/ | |
private $start; | |
/** | |
* The event end date | |
* @var DateTime | |
*/ | |
private $end; | |
/** | |
* | |
* The event title | |
* @var string | |
*/ | |
private $summary; | |
/** | |
* The event description | |
* @var string | |
*/ | |
private $description; | |
/** | |
* The event location | |
* @var string | |
*/ | |
private $location; | |
public function __construct($parameters) { | |
$parameters += array( | |
'summary' => 'Untitled Event', | |
'description' => '', | |
'location' => '' | |
); | |
if (isset($parameters['uid'])) { | |
$this->uid = $parameters['uid']; | |
} else { | |
$this->uid = uniqid(rand(0, getmypid())); | |
} | |
$this->start = $parameters['start']; | |
$this->end = $parameters['end']; | |
$this->summary = $parameters['summary']; | |
$this->description = $parameters['description']; | |
$this->location = $parameters['location']; | |
return $this; | |
} | |
/** | |
* Get the start time set for the even | |
* @return string | |
*/ | |
private function formatDate($date) { | |
return $date->format("Ymd\THis\Z"); | |
} | |
/* Escape commas, semi-colons, backslashes. | |
http://stackoverflow.com/questions/1590368/should-a-colon-character-be-escaped-in-text-values-in-icalendar-rfc2445 | |
*/ | |
private function formatValue($str) { | |
return addcslashes($str, ",\\;"); | |
} | |
public function generateString() { | |
$created = new DateTime(); | |
$content = ''; | |
$content = "BEGIN:VEVENT\r\n" | |
. "UID:{$this->uid}\r\n" | |
. "DTSTART:{$this->formatDate($this->start)}\r\n" | |
. "DTEND:{$this->formatDate($this->end)}\r\n" | |
. "DTSTAMP:{$this->formatDate($this->start)}\r\n" | |
. "CREATED:{$this->formatDate($created)}\r\n" | |
. "DESCRIPTION:{$this->formatValue($this->description)}\r\n" | |
. "LAST-MODIFIED:{$this->formatDate($this->start)}\r\n" | |
. "LOCATION:{$this->location}\r\n" | |
. "SUMMARY:{$this->formatValue($this->summary)}\r\n" | |
. "SEQUENCE:0\r\n" | |
. "STATUS:CONFIRMED\r\n" | |
. "TRANSP:OPAQUE\r\n" | |
. "END:VEVENT\r\n"; | |
return $content; | |
} | |
} | |
class Calendar { | |
protected $events; | |
protected $title; | |
protected $author; | |
public function __construct($parameters) { | |
$parameters += array( | |
'events' => array(), | |
'title' => 'Calendar', | |
'author' => 'Calender Generator' | |
); | |
$this->events = $parameters['events']; | |
$this->title = $parameters['title']; | |
$this->author = $parameters['author']; | |
} | |
/** | |
* | |
* Call this function to download the invite. | |
*/ | |
public function generateDownload() { | |
$generated = $this->generateString(); | |
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT' ); //date in the past | |
header('Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' ); //tell it we just updated | |
header('Cache-Control: no-store, no-cache, must-revalidate' ); //force revaidation | |
header('Cache-Control: post-check=0, pre-check=0', false ); | |
header('Pragma: no-cache' ); | |
header('Content-type: text/calendar; charset=utf-8'); | |
header('Content-Disposition: inline; filename="calendar.ics"'); | |
header("Content-Description: File Transfer"); | |
header("Content-Transfer-Encoding: binary"); | |
header("Content-Length: " . strlen($generated)); | |
print $generated; | |
} | |
/** | |
* | |
* The function generates the actual content of the ICS | |
* file and returns it. | |
* | |
* @return string|bool | |
*/ | |
public function generateString() { | |
$content = "BEGIN:VCALENDAR\r\n" | |
. "VERSION:2.0\r\n" | |
. "PRODID:-//" . $this->author . "//NONSGML//EN\r\n" | |
. "X-WR-CALNAME:" . $this->title . "\r\n" | |
. "CALSCALE:GREGORIAN\r\n"; | |
foreach($this->events as $event) { | |
$content .= $event->generateString(); | |
} | |
$content .= "END:VCALENDAR"; | |
return $content; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks this class help me a lot.