Google Calendar
So, I’ve been working on creating a php script that pulls Google Calendar data. I couldn’t find many examples of how to do it on the web. So, after much trial and error here is what I’ve come up with. Use as you wish.
<?php /**********************************************************/ /* The username/password used to login to Google Calendar */ /* */ /* This is the only part you should have to edit in this */ /* script. */ /**********************************************************/ $google_username = '???'; $google_password = '???'; /**************************************************************************/ /* Include Zend framework and load libraries, used to interact with Gdata */ /* Get the Zend framework at http://framework.zend.com/download */ /**************************************************************************/ require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Gdata'); Zend_Loader::loadClass('Zend_Gdata_AuthSub'); Zend_Loader::loadClass('Zend_Gdata_ClientLogin'); Zend_Loader::loadClass('Zend_Gdata_Calendar'); /******************/ /* Login to Gdata */ /******************/ $authService = Zend_Gdata_Calendar::AUTH_SERVICE_NAME; $httpClient = Zend_Gdata_ClientLogin::getHttpClient($google_username, $google_password, $authService); /***********************************************************************/ /* Replaces [link:url]Text[/link] with a properly formatted anchor tag */ /* The url must have the http:// or https:// at the front */ /* */ /* Params: */ /* $text - String of text */ /***********************************************************************/ function createLink($text) { $pattern1 = '/\[\/link\]/'; $pattern2 = '/(\[link:)([^\]]*)(\])/'; $replacement1 = '</a>'; $replacement2 = '<a href="$2" target="_blank" rel="noopener">'; $text = preg_replace($pattern1 , $replacement1, $text); $text = preg_replace($pattern2 , $replacement2, $text); return $text; } /*****************************************************************************************/ /* Replaces [email:email address]Text[/email] with a properly formatted email anchor tag */ /* */ /* Params: */ /* $text - String of text */ /*****************************************************************************************/ function createEmail($text) { $pattern1 = '/\[\/email\]/'; $pattern2 = '/(\[email:)([^\]]*)(\])/'; $replacement1 = '</a>'; $replacement2 = '<a href="mailto:$2">'; $text = preg_replace($pattern1 , $replacement1, $text); $text = preg_replace($pattern2 , $replacement2, $text); return $text; } /*****************************************************/ /* Replaces line breaks in the text with <br /> tags */ /* */ /* Params: */ /* $text - String of text */ /*****************************************************/ function createLineBreaks($text) { $text = str_replace("\n", "<br />", $text); return $text; } /*****************************************************************/ /* This function applies the formatting functions defined above. */ /* */ /* Params: */ /* $text - String of text */ /*****************************************************************/ function formatText($text) { $text = createLink($text); $text = createEmail($text); $text = createLineBreaks($text); return $text; } /*****************************************************************/ /* This function formats the date/time shown to the user. */ /* */ /* Params: */ /* $start - Starting date/time */ /* $end - Ending date/time */ /*****************************************************************/ function formatDate($start, $end) { if (date("H:i:s", $start) == "00:00:00" && date("H:i:s", $end) == "00:00:00") //All day event { $end = $end - 1; //For all day events the end day is one greater than it really is if(date("M j, Y", $start) == date("M j, Y", $end)) //Single day all day event { $date = date("M j, Y", $start); } else //All day event spanning multiple days { if (date("Y", $start) == date("Y", $end)) { if (date("M", $start) == date("M", $end)) //All day event spanning multiple days in same month { $date = date("M j", $start) . " - " . date("j, Y", $end); } else //All day event spanning multiple months { $date = date("M j", $start) . " - " . date("M j, Y", $end); } } else // All day event spanning multiple years { $date = date("M j, Y", $start) . " - " . date("M j, Y", $end); } } } else //Time range event { if(date("M j, Y", $start) == date("M j, Y", $end)) //Single day range event { $date = date("M j, Y (g:i a", $start) . " - " . date("g:i a)", $end); } else //Range event spanning multiple days { if (date("Y", $start) == date("Y", $end)) { if (date("M", $start) == date("M", $end)) //Range event spanning multiple days in same month { $date = date("M j (g:i a)", $start) . " - " . date("M j (g:i a), Y", $end); } else //Range event spanning multiple months { $date = date("M j (g:i a)", $start) . " - " . date("M j (g:i a), Y", $end); } } else //Range event spanning multiple years { $date = date("M j, Y (g:i a)", $start) . " - " . date("M j, Y (g:i a)", $end); } } } return $date; } /******************************************************************/ /* Create a definition list of the events in human-readable form. */ /* You can use CSS to style the list. */ /* */ /* Params: */ /* $client - GData $httpClient created above */ /* $feed - The GData feed to read */ /******************************************************************/ function listEvents($client, $feed) { $gdataCal = new Zend_Gdata_Calendar($client); $eventFeed = $gdataCal->getCalendarEventFeed($feed); $html = $html . "<dl>\n"; foreach ($eventFeed as $event) { foreach ($event->when as $when) { $start = strtotime($when->startTime); $end = strtotime($when->endTime); } $date = formatDate($start, $end); foreach ($event->where as $where) { $location = $where->valueString; } $title = $event->title->text; if ($location != "") { $title = "<a href=\"" . $location . "\" target=\"_blank\">" . $title . "</a>"; } $content = formatText($event->content->text); $html = $html . " <dt><span class=\"eventdate\">" . $date . "</span><span class=\"eventtitle\"> - " . $title . "</span></dd>\n"; $html = $html . " <dd><span class=\"eventcontent\">" . $content . quot;</span></dd>\n"; } $html = $html . "</dl>\n"; return $html; } ?> <html> <body> <?php Echo listEvents($httpClient, "http://www.google.com/calendar/feeds/yourfeedhere"); ?> </body> </html>