|
Posted by "Daevid Vincent" on 07/10/05 05:24
Okay, after much trial and error, I figured out the extremely annoying
issues... Here is a code fragment that should be very useful for anyone else
trying to make an iCalendar that works with Outlook...
I'm sure there's a better way to get the GMT time, as my way is a total
hack. I'm in PST btw, 7 hours from GMT, and I set the party events to be 6
hours long arbitrarily. Adjust as desired.
Outlook is EXTREMELY picky about the formatting and \n stuff
I found that using <?= $prow['party_name'] ?> for example didn't work. I'm
not sure if PHP puts an extra character or something, that's why I use the
echo instead and force a \n on there. The UID is required I think, didn't
seem to work without one. This part threw me off for a bit -- your
DESCRIPTION: must be ONE long line with literal \n (not the escaped
version, but a \\n if you will).
Another annoyance, is that if you split the time over multiple days, it
doesn't seem to want to play nice. It puts in two entries sorta. By sorta, I
mean, that if you look at the calendar you'll see one from 9pm-12am, then
another on the next day from 12am-3am for example. You can click either and
it brings up the same event. I would prefer one of those bars or something
that spans the days instead of the way it looks now. After much debugging
and experimenting, it seems this is a problem with Outlook. If an event
isn't longer than a certain amount of time, it doesn't warrant one of those
bars. Ugh! POS.
Anyways, to see this in action:
http://www.rollinballzcrew.com/nextparty.phtml
-------------------- snip %< snip -----------------------
if (isset($_GET['id']) && intval($_GET['id'] > 0))
{
$sql = "SELECT *,
UNIX_TIMESTAMP(party_date)
AS start,
UNIX_TIMESTAMP(DATE_ADD(party_date, INTERVAL 6 HOUR)) AS end,
UNIX_TIMESTAMP(DATE_ADD(party_date, INTERVAL 7 HOUR)) AS GMTstart,
UNIX_TIMESTAMP(DATE_ADD(DATE_ADD(party_date, INTERVAL 6 HOUR), INTERVAL 7
HOUR)) AS GMTend,
UNIX_TIMESTAMP(DATE_ADD(NOW(), INTERVAL 7 HOUR)) AS GMTnow
FROM party_table
WHERE party_id = ".intval($_GET['id'])."
LIMIT 1";
//echo $sql;
$pth = mysql_query($sql, $db);
if ($pth && mysql_num_rows($pth) == 1)
{
$prow = mysql_fetch_array($pth,MYSQL_ASSOC);
//http://www.phpbuilder.com/columns/chow20021007.php3?page=2
//http://www.sitellite.org/docs/Date/vCal.html
//http://www.scheduleworld.com/outlookInteroperability.html
//http://www.ietf.org/rfc/rfc2445.txt
//http://www.linuxjournal.com/article/8159
//$Filename = "RBC_Event" . $_GET['id'] . ".vcs";
//header("Content-Type: text/x-vCalendar");
$Filename = "RBC Event [" . $_GET['id'] . "].ics";
header("Content-Type: text/Calendar");
header("Content-Disposition: inline;
filename=".$Filename);
//$DescDump = str_replace("\r", "=0D=0A",
$prow['party_description']);
$DescDump =
str_replace(array("\r\n","\r",'<p>','<P>','<BR>','<br>'), "\\n",
$prow['party_description']);
$vCalStart = date("Ymd\THi00", $prow['GMTstart']);
$vCalEnd = date("Ymd\THi00", $prow['GMTend']);
$vCalNow = date("Ymd\THi00", $prow['GMTnow']);
?>
BEGIN:VCALENDAR
VERSION:2.0
PRODID:RBC Web Calendar
METHOD:PUBLISH
BEGIN:VEVENT
DTSTART:<?= $vCalStart ?>Z
DTEND:<?= $vCalEnd ?>Z
LOCATION:<?php echo $prow['party_location']."\n" ?>
TRANSP:OPAQUE
SEQUENCE:0
UID:1234567890<?= rand(1111111111,9999999999); ?>RBC
DTSTAMP:<?= $vCalNow ?>Z
DESCRIPTION:<?php echo $DescDump."\n"; ?>
SUMMARY:<?php echo $prow['party_name']."\n"; ?>
PRIORITY:1
X-MICROSOFT-CDO-IMPORTANCE:2
CLASS:PUBLIC
BEGIN:VALARM
TRIGGER:-PT60M
ACTION:DISPLAY
DESCRIPTION:Reminder
END:VALARM
END:VEVENT
END:VCALENDAR
<?php
exit;
}
else
if (!$pth) { echo "<FONT
COLOR=#FF0000>Calendar<P><PRE>".mysql_errno().":
".mysql_error()."<BR></PRE></FONT>\n"; exit; }
} //if vcal
-------------------- snip %< snip -----------------------
> -----Original Message-----
> From: Daevid Vincent [mailto:daevid@daevid.com]
> Sent: Wednesday, July 06, 2005 5:53 PM
> To: php-general@lists.php.net
> Cc: ceo@l-i-e.com
> Subject: RE: [PHP] iCalendar creation not working with Outlook
>
> > *IS* it a Lunar based event, rather than Gregorian?...
>
> Honestly, I don't even know what the difference is. All I
> know is I want an
> event to appear on the date/time I gave it. I believe that
> error message is
> NOT the true problem (google searches all point to "\n" being
> the culprit)
>
> > > It works fine in KOrganizer (KDE), Entorage (Mac OS-X),
> > > iCal. I couldn't figure out how to get Evolution to use it.
> >
> > What works fine?
> >
> > The event?
>
> Yes. If someone using KDE clicks on the link, it puts an
> entry in their
> KOrganizer. If someone with Entourage clicks, it goes to
> iCalendar. And
> since my post, a friend that uses Evolution, clicked, saved
> the .ics file,
> and imported it into Evolution via their import wizard
> (Evolution apparently
> isn't smart enough to directly import via the web).
>
> > Are you suggesting that Outlook might not have implemented the full
> > specification, and has some hokey hacked-up crap instead?
> > Say it's not true!
> > [that was sarcasm, in case you missed it...]
>
> Yeah. I get the sarcasm. Unfortunately, that's not helping.
> 90% of the world
> uses Outlook.
>
> > > I find tons of people complaining on Google about this
> > error message, but
> > > no
> > > real solution but to use "\n" -- which I have done I think.
> > I have even
> > > commented out the DESCRIPTION field, and that didn't help.
> > >
> > > Does anyone have a real working example, class, snippet,
> > whatever for an
> > > iCalendar generator that works in Outlook?
>
> > Dump out a working Outlook iCalendar item/entry/object thingie.
> > Get the output from your code.
> > Where are they different?
>
> Yes. I supposed that is the next step. I just thought there
> might exist a
> class or snippet out there that actually works. I mean, you'd
> think that
> this was a pretty common task, yet the PEAR site has nothing!
> And I found
> one tutorial, which obviously is outdated and therefore
> slightly broken.
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>
Navigation:
[Reply to this message]
|