iCalendar / vCard parser for PHP
Updated
I've just finished an iCalendar vCard parser for PHP. It's done almost completely with a 'natural' simplexml-like interface, so it should (hopefully) be just as easy to parse, and also modify iCalendar / vCard objects (ics/vcf files).
To install using pear, run the following:
pear channel-discover pear.sabredav.org
pear install sabredav/Sabre_VObject-alpha
Or download from pear.sabredav.org.
For testing, I used this iCalendar file: icalendartest.ics.
To load in an object, you use the Reader class:
<?php
// Link to the correct path if you manually dowloaded the package
include 'Sabre/VObject/includes.php';
// Reading an object
$calendar = Sabre_VObject_Reader::read(file_get_contents('icalendartest.ics'));
?>
iCalendar objects consist of components (VEVENT, VTODO, VTIMEZONE, etc), properties (SUMMARY, DESCRIPTION, DTSTART, etc) and parameters, which are to properties what attributes are to elements in XML. To show a listing of all events in a calendar, this snippet would work:
<?php
echo "There are ", count($calendar->vevent), " events in this calendar\n";
// Looping through events
foreach($calendar->vevent as $event) {
echo (string)$event->dtstart, ": ", $event->summary, "\n";
}
?>
You can easily modify properties:
<?php
$calendar->vevent[0]->description = "It's a birthday party";
?>
Creating new objects uses the following syntax:
<?php
$todo = Sabre_VObject_Component::create('vtodo');
$todo->summary = 'Take out the dog';
$calendar->add($todo);
?>
And to turn your newly modified calendar back into an ics file:
<?php
file_put_contents('output.ics', $calendar->serialize());
?>
Lastly, parameters are accessible through array-syntax:
<?php
echo (string)$calendar->vevent[0]->dtstart['tzid'], "\n";
?>
I had fun building this, I hope it's useful to you as well. It's 100% unittested, but bugs might still appear due to the complex nature of API. Use at your own risk :). This library will be part of the SabreDAV project, which is also where you can go for the source, report bugs or make suggestions.
Update 31-05-2012
I added the following below as a response to some of the questions
Creating new calendars
Creating a new calendar works similar to creating a new component. Simply:
<?php
$vcal = Sabre_VObject_Component::create('VCALENDAR');
$vcal->VERSION = '2.0';
$vcal->PRODID = '-//SabreDAV//SabreDAV//EN';
$vcal->CALSCALE = 'GREGORIAN';
?>
After that, you can use the 'add' function on the calendar to add additional components and properties.
Creating a new DTSTART (or other date element)
You can just use the following syntax:
<?php
$vevent = Sabre_VObject_Component::create('VEVENT');
$vevent->DTSTART = '20120101T000000Z';
?>
But it's also possible to pass in PHP DateTime objects. However, the syntax for this is not that great:
<?php
$dateTime = new DateTime('now', new DateTimeZone('Europe/London'));
$vevent = Sabre_VObject_Component::create('VEVENT');
$dtstart = Sabre_VObject_Property::create('DTSTART');
$dtstart->setDateTime($dateTime, Sabre_VObject_Property_DateTime::LOCALTZ);
?>
The last constant represents how you want the date and time to be represented. In this case it will be represented as a local time with a timezone identifier, but it's also possible to specify it as a date-only string, local (floating time) with now tz information, or a UTC time. Check the source of that class for more info.
Comments
Danilo •
Of great help! Thanks.