842 lines
29 KiB
PHP
842 lines
29 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Zend Framework
|
||
|
*
|
||
|
* LICENSE
|
||
|
*
|
||
|
* This source file is subject to the new BSD license that is bundled
|
||
|
* with this package in the file LICENSE.txt.
|
||
|
* It is also available through the world-wide-web at this URL:
|
||
|
* http://framework.zend.com/license/new-bsd
|
||
|
* If you did not receive a copy of the license and are unable to
|
||
|
* obtain it through the world-wide-web, please send an email
|
||
|
* to license@zend.com so we can send you a copy immediately.
|
||
|
*
|
||
|
* @category Zend
|
||
|
* @package Zend_Gdata
|
||
|
* @subpackage Demos
|
||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* PHP sample code for the Google Calendar data API. Utilizes the
|
||
|
* Zend Framework Gdata components to communicate with the Google API.
|
||
|
*
|
||
|
* Requires the Zend Framework Gdata components and PHP >= 5.1.4
|
||
|
*
|
||
|
* You can run this sample both from the command line (CLI) and also
|
||
|
* from a web browser. When running through a web browser, only
|
||
|
* AuthSub and outputting a list of calendars is demonstrated. When
|
||
|
* running via CLI, all functionality except AuthSub is available and dependent
|
||
|
* upon the command line options passed. Run this script without any
|
||
|
* command line options to see usage, eg:
|
||
|
* /usr/local/bin/php -f Calendar.php
|
||
|
*
|
||
|
* More information on the Command Line Interface is available at:
|
||
|
* http://www.php.net/features.commandline
|
||
|
*
|
||
|
* NOTE: You must ensure that the Zend Framework is in your PHP include
|
||
|
* path. You can do this via php.ini settings, or by modifying the
|
||
|
* argument to set_include_path in the code below.
|
||
|
*
|
||
|
* NOTE: As this is sample code, not all of the functions do full error
|
||
|
* handling. Please see getEvent for an example of how errors could
|
||
|
* be handled and the online code samples for additional information.
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @see Zend_Loader
|
||
|
*/
|
||
|
require_once 'Zend/Loader.php';
|
||
|
|
||
|
/**
|
||
|
* @see Zend_Gdata
|
||
|
*/
|
||
|
Zend_Loader::loadClass('Zend_Gdata');
|
||
|
|
||
|
/**
|
||
|
* @see Zend_Gdata_AuthSub
|
||
|
*/
|
||
|
Zend_Loader::loadClass('Zend_Gdata_AuthSub');
|
||
|
|
||
|
/**
|
||
|
* @see Zend_Gdata_ClientLogin
|
||
|
*/
|
||
|
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
|
||
|
|
||
|
/**
|
||
|
* @see Zend_Gdata_HttpClient
|
||
|
*/
|
||
|
Zend_Loader::loadClass('Zend_Gdata_HttpClient');
|
||
|
|
||
|
/**
|
||
|
* @see Zend_Gdata_Calendar
|
||
|
*/
|
||
|
Zend_Loader::loadClass('Zend_Gdata_Calendar');
|
||
|
|
||
|
/**
|
||
|
* @var string Location of AuthSub key file. include_path is used to find this
|
||
|
*/
|
||
|
$_authSubKeyFile = null; // Example value for secure use: 'mykey.pem'
|
||
|
|
||
|
/**
|
||
|
* @var string Passphrase for AuthSub key file.
|
||
|
*/
|
||
|
$_authSubKeyFilePassphrase = null;
|
||
|
|
||
|
/**
|
||
|
* Returns the full URL of the current page, based upon env variables
|
||
|
*
|
||
|
* Env variables used:
|
||
|
* $_SERVER['HTTPS'] = (on|off|)
|
||
|
* $_SERVER['HTTP_HOST'] = value of the Host: header
|
||
|
* $_SERVER['SERVER_PORT'] = port number (only used if not http/80,https/443)
|
||
|
* $_SERVER['REQUEST_URI'] = the URI after the method of the HTTP request
|
||
|
*
|
||
|
* @return string Current URL
|
||
|
*/
|
||
|
function getCurrentUrl()
|
||
|
{
|
||
|
global $_SERVER;
|
||
|
|
||
|
/**
|
||
|
* Filter php_self to avoid a security vulnerability.
|
||
|
*/
|
||
|
$php_request_uri = htmlentities(substr($_SERVER['REQUEST_URI'], 0, strcspn($_SERVER['REQUEST_URI'], "\n\r")), ENT_QUOTES);
|
||
|
|
||
|
if (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') {
|
||
|
$protocol = 'https://';
|
||
|
} else {
|
||
|
$protocol = 'http://';
|
||
|
}
|
||
|
$host = $_SERVER['HTTP_HOST'];
|
||
|
if ($_SERVER['SERVER_PORT'] != '' &&
|
||
|
(($protocol == 'http://' && $_SERVER['SERVER_PORT'] != '80') ||
|
||
|
($protocol == 'https://' && $_SERVER['SERVER_PORT'] != '443'))) {
|
||
|
$port = ':' . $_SERVER['SERVER_PORT'];
|
||
|
} else {
|
||
|
$port = '';
|
||
|
}
|
||
|
return $protocol . $host . $port . $php_request_uri;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the AuthSub URL which the user must visit to authenticate requests
|
||
|
* from this application.
|
||
|
*
|
||
|
* Uses getCurrentUrl() to get the next URL which the user will be redirected
|
||
|
* to after successfully authenticating with the Google service.
|
||
|
*
|
||
|
* @return string AuthSub URL
|
||
|
*/
|
||
|
function getAuthSubUrl()
|
||
|
{
|
||
|
global $_authSubKeyFile;
|
||
|
$next = getCurrentUrl();
|
||
|
$scope = 'http://www.google.com/calendar/feeds/';
|
||
|
$session = true;
|
||
|
if ($_authSubKeyFile != null) {
|
||
|
$secure = true;
|
||
|
} else {
|
||
|
$secure = false;
|
||
|
}
|
||
|
return Zend_Gdata_AuthSub::getAuthSubTokenUri($next, $scope, $secure,
|
||
|
$session);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Outputs a request to the user to login to their Google account, including
|
||
|
* a link to the AuthSub URL.
|
||
|
*
|
||
|
* Uses getAuthSubUrl() to get the URL which the user must visit to authenticate
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
function requestUserLogin($linkText)
|
||
|
{
|
||
|
$authSubUrl = getAuthSubUrl();
|
||
|
echo "<a href=\"{$authSubUrl}\">{$linkText}</a>";
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns a HTTP client object with the appropriate headers for communicating
|
||
|
* with Google using AuthSub authentication.
|
||
|
*
|
||
|
* Uses the $_SESSION['sessionToken'] to store the AuthSub session token after
|
||
|
* it is obtained. The single use token supplied in the URL when redirected
|
||
|
* after the user succesfully authenticated to Google is retrieved from the
|
||
|
* $_GET['token'] variable.
|
||
|
*
|
||
|
* @return Zend_Http_Client
|
||
|
*/
|
||
|
function getAuthSubHttpClient()
|
||
|
{
|
||
|
global $_SESSION, $_GET, $_authSubKeyFile, $_authSubKeyFilePassphrase;
|
||
|
$client = new Zend_Gdata_HttpClient();
|
||
|
if ($_authSubKeyFile != null) {
|
||
|
// set the AuthSub key
|
||
|
$client->setAuthSubPrivateKeyFile($_authSubKeyFile, $_authSubKeyFilePassphrase, true);
|
||
|
}
|
||
|
if (!isset($_SESSION['sessionToken']) && isset($_GET['token'])) {
|
||
|
$_SESSION['sessionToken'] =
|
||
|
Zend_Gdata_AuthSub::getAuthSubSessionToken($_GET['token'], $client);
|
||
|
}
|
||
|
$client->setAuthSubToken($_SESSION['sessionToken']);
|
||
|
return $client;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Processes loading of this sample code through a web browser. Uses AuthSub
|
||
|
* authentication and outputs a list of a user's calendars if succesfully
|
||
|
* authenticated.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
function processPageLoad()
|
||
|
{
|
||
|
global $_SESSION, $_GET;
|
||
|
if (!isset($_SESSION['sessionToken']) && !isset($_GET['token'])) {
|
||
|
requestUserLogin('Please login to your Google Account.');
|
||
|
} else {
|
||
|
$client = getAuthSubHttpClient();
|
||
|
outputCalendarList($client);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns a HTTP client object with the appropriate headers for communicating
|
||
|
* with Google using the ClientLogin credentials supplied.
|
||
|
*
|
||
|
* @param string $user The username, in e-mail address format, to authenticate
|
||
|
* @param string $pass The password for the user specified
|
||
|
* @return Zend_Http_Client
|
||
|
*/
|
||
|
function getClientLoginHttpClient($user, $pass)
|
||
|
{
|
||
|
$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
|
||
|
|
||
|
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
|
||
|
return $client;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Outputs an HTML unordered list (ul), with each list item representing an event
|
||
|
* in the user's calendar. The calendar is retrieved using the magic cookie
|
||
|
* which allows read-only access to private calendar data using a special token
|
||
|
* available from within the Calendar UI.
|
||
|
*
|
||
|
* @param string $user The username or address of the calendar to be retrieved.
|
||
|
* @param string $magicCookie The magic cookie token
|
||
|
* @return void
|
||
|
*/
|
||
|
function outputCalendarMagicCookie($user, $magicCookie)
|
||
|
{
|
||
|
$gdataCal = new Zend_Gdata_Calendar();
|
||
|
$query = $gdataCal->newEventQuery();
|
||
|
$query->setUser($user);
|
||
|
$query->setVisibility('private-' . $magicCookie);
|
||
|
$query->setProjection('full');
|
||
|
$eventFeed = $gdataCal->getCalendarEventFeed($query);
|
||
|
echo "<ul>\n";
|
||
|
foreach ($eventFeed as $event) {
|
||
|
echo "\t<li>" . $event->title->text . "</li>\n";
|
||
|
$sl = $event->getLink('self')->href;
|
||
|
}
|
||
|
echo "</ul>\n";
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Outputs an HTML unordered list (ul), with each list item representing a
|
||
|
* calendar in the authenticated user's calendar list.
|
||
|
*
|
||
|
* @param Zend_Http_Client $client The authenticated client object
|
||
|
* @return void
|
||
|
*/
|
||
|
function outputCalendarList($client)
|
||
|
{
|
||
|
$gdataCal = new Zend_Gdata_Calendar($client);
|
||
|
$calFeed = $gdataCal->getCalendarListFeed();
|
||
|
echo "<h1>" . $calFeed->title->text . "</h1>\n";
|
||
|
echo "<ul>\n";
|
||
|
foreach ($calFeed as $calendar) {
|
||
|
echo "\t<li>" . $calendar->title->text . "</li>\n";
|
||
|
}
|
||
|
echo "</ul>\n";
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Outputs an HTML unordered list (ul), with each list item representing an
|
||
|
* event on the authenticated user's calendar. Includes the start time and
|
||
|
* event ID in the output. Events are ordered by starttime and include only
|
||
|
* events occurring in the future.
|
||
|
*
|
||
|
* @param Zend_Http_Client $client The authenticated client object
|
||
|
* @return void
|
||
|
*/
|
||
|
function outputCalendar($client)
|
||
|
{
|
||
|
$gdataCal = new Zend_Gdata_Calendar($client);
|
||
|
$query = $gdataCal->newEventQuery();
|
||
|
$query->setUser('default');
|
||
|
$query->setVisibility('private');
|
||
|
$query->setProjection('full');
|
||
|
$query->setOrderby('starttime');
|
||
|
$query->setFutureevents(true);
|
||
|
$eventFeed = $gdataCal->getCalendarEventFeed($query);
|
||
|
// option 2
|
||
|
// $eventFeed = $gdataCal->getCalendarEventFeed($query->getQueryUrl());
|
||
|
echo "<ul>\n";
|
||
|
foreach ($eventFeed as $event) {
|
||
|
echo "\t<li>" . $event->title->text . " (" . $event->id->text . ")\n";
|
||
|
// Zend_Gdata_App_Extensions_Title->__toString() is defined, so the
|
||
|
// following will also work on PHP >= 5.2.0
|
||
|
//echo "\t<li>" . $event->title . " (" . $event->id . ")\n";
|
||
|
echo "\t\t<ul>\n";
|
||
|
foreach ($event->when as $when) {
|
||
|
echo "\t\t\t<li>Starts: " . $when->startTime . "</li>\n";
|
||
|
}
|
||
|
echo "\t\t</ul>\n";
|
||
|
echo "\t</li>\n";
|
||
|
}
|
||
|
echo "</ul>\n";
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Outputs an HTML unordered list (ul), with each list item representing an
|
||
|
* event on the authenticated user's calendar which occurs during the
|
||
|
* specified date range.
|
||
|
*
|
||
|
* To query for all events occurring on 2006-12-24, you would query for
|
||
|
* a startDate of '2006-12-24' and an endDate of '2006-12-25' as the upper
|
||
|
* bound for date queries is exclusive. See the 'query parameters reference':
|
||
|
* http://code.google.com/apis/gdata/calendar.html#Parameters
|
||
|
*
|
||
|
* @param Zend_Http_Client $client The authenticated client object
|
||
|
* @param string $startDate The start date in YYYY-MM-DD format
|
||
|
* @param string $endDate The end date in YYYY-MM-DD format
|
||
|
* @return void
|
||
|
*/
|
||
|
function outputCalendarByDateRange($client, $startDate='2007-05-01',
|
||
|
$endDate='2007-08-01')
|
||
|
{
|
||
|
$gdataCal = new Zend_Gdata_Calendar($client);
|
||
|
$query = $gdataCal->newEventQuery();
|
||
|
$query->setUser('default');
|
||
|
$query->setVisibility('private');
|
||
|
$query->setProjection('full');
|
||
|
$query->setOrderby('starttime');
|
||
|
$query->setStartMin($startDate);
|
||
|
$query->setStartMax($endDate);
|
||
|
$eventFeed = $gdataCal->getCalendarEventFeed($query);
|
||
|
echo "<ul>\n";
|
||
|
foreach ($eventFeed as $event) {
|
||
|
echo "\t<li>" . $event->title->text . " (" . $event->id->text . ")\n";
|
||
|
echo "\t\t<ul>\n";
|
||
|
foreach ($event->when as $when) {
|
||
|
echo "\t\t\t<li>Starts: " . $when->startTime . "</li>\n";
|
||
|
}
|
||
|
echo "\t\t</ul>\n";
|
||
|
echo "\t</li>\n";
|
||
|
}
|
||
|
echo "</ul>\n";
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Outputs an HTML unordered list (ul), with each list item representing an
|
||
|
* event on the authenticated user's calendar which matches the search string
|
||
|
* specified as the $fullTextQuery parameter
|
||
|
*
|
||
|
* @param Zend_Http_Client $client The authenticated client object
|
||
|
* @param string $fullTextQuery The string for which you are searching
|
||
|
* @return void
|
||
|
*/
|
||
|
function outputCalendarByFullTextQuery($client, $fullTextQuery='tennis')
|
||
|
{
|
||
|
$gdataCal = new Zend_Gdata_Calendar($client);
|
||
|
$query = $gdataCal->newEventQuery();
|
||
|
$query->setUser('default');
|
||
|
$query->setVisibility('private');
|
||
|
$query->setProjection('full');
|
||
|
$query->setQuery($fullTextQuery);
|
||
|
$eventFeed = $gdataCal->getCalendarEventFeed($query);
|
||
|
echo "<ul>\n";
|
||
|
foreach ($eventFeed as $event) {
|
||
|
echo "\t<li>" . $event->title->text . " (" . $event->id->text . ")\n";
|
||
|
echo "\t\t<ul>\n";
|
||
|
foreach ($event->when as $when) {
|
||
|
echo "\t\t\t<li>Starts: " . $when->startTime . "</li>\n";
|
||
|
echo "\t\t</ul>\n";
|
||
|
echo "\t</li>\n";
|
||
|
}
|
||
|
}
|
||
|
echo "</ul>\n";
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates an event on the authenticated user's default calendar with the
|
||
|
* specified event details.
|
||
|
*
|
||
|
* @param Zend_Http_Client $client The authenticated client object
|
||
|
* @param string $title The event title
|
||
|
* @param string $desc The detailed description of the event
|
||
|
* @param string $where
|
||
|
* @param string $startDate The start date of the event in YYYY-MM-DD format
|
||
|
* @param string $startTime The start time of the event in HH:MM 24hr format
|
||
|
* @param string $endDate The end date of the event in YYYY-MM-DD format
|
||
|
* @param string $endTime The end time of the event in HH:MM 24hr format
|
||
|
* @param string $tzOffset The offset from GMT/UTC in [+-]DD format (eg -08)
|
||
|
* @return string The ID URL for the event.
|
||
|
*/
|
||
|
function createEvent ($client, $title = 'Tennis with Beth',
|
||
|
$desc='Meet for a quick lesson', $where = 'On the courts',
|
||
|
$startDate = '2008-01-20', $startTime = '10:00',
|
||
|
$endDate = '2008-01-20', $endTime = '11:00', $tzOffset = '-08')
|
||
|
{
|
||
|
$gc = new Zend_Gdata_Calendar($client);
|
||
|
$newEntry = $gc->newEventEntry();
|
||
|
$newEntry->title = $gc->newTitle(trim($title));
|
||
|
$newEntry->where = array($gc->newWhere($where));
|
||
|
|
||
|
$newEntry->content = $gc->newContent($desc);
|
||
|
$newEntry->content->type = 'text';
|
||
|
|
||
|
$when = $gc->newWhen();
|
||
|
$when->startTime = "{$startDate}T{$startTime}:00.000{$tzOffset}:00";
|
||
|
$when->endTime = "{$endDate}T{$endTime}:00.000{$tzOffset}:00";
|
||
|
$newEntry->when = array($when);
|
||
|
|
||
|
$createdEntry = $gc->insertEvent($newEntry);
|
||
|
return $createdEntry->id->text;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates an event on the authenticated user's default calendar using
|
||
|
* the specified QuickAdd string.
|
||
|
*
|
||
|
* @param Zend_Http_Client $client The authenticated client object
|
||
|
* @param string $quickAddText The QuickAdd text for the event
|
||
|
* @return string The ID URL for the event
|
||
|
*/
|
||
|
function createQuickAddEvent ($client, $quickAddText) {
|
||
|
$gdataCal = new Zend_Gdata_Calendar($client);
|
||
|
$event = $gdataCal->newEventEntry();
|
||
|
$event->content = $gdataCal->newContent($quickAddText);
|
||
|
$event->quickAdd = $gdataCal->newQuickAdd(true);
|
||
|
|
||
|
$newEvent = $gdataCal->insertEvent($event);
|
||
|
return $newEvent->id->text;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates a new web content event on the authenticated user's default
|
||
|
* calendar with the specified event details. For simplicity, the event
|
||
|
* is created as an all day event and does not include a description.
|
||
|
*
|
||
|
* @param Zend_Http_Client $client The authenticated client object
|
||
|
* @param string $title The event title
|
||
|
* @param string $startDate The start date of the event in YYYY-MM-DD format
|
||
|
* @param string $endDate The end time of the event in HH:MM 24hr format
|
||
|
* @param string $icon URL pointing to a 16x16 px icon representing the event.
|
||
|
* @param string $url The URL containing the web content for the event.
|
||
|
* @param string $height The desired height of the web content pane.
|
||
|
* @param string $width The desired width of the web content pane.
|
||
|
* @param string $type The MIME type of the web content.
|
||
|
* @return string The ID URL for the event.
|
||
|
*/
|
||
|
function createWebContentEvent ($client, $title = 'World Cup 2006',
|
||
|
$startDate = '2006-06-09', $endDate = '2006-06-09',
|
||
|
$icon = 'http://www.google.com/calendar/images/google-holiday.gif',
|
||
|
$url = 'http://www.google.com/logos/worldcup06.gif',
|
||
|
$height = '120', $width = '276', $type = 'image/gif'
|
||
|
)
|
||
|
{
|
||
|
$gc = new Zend_Gdata_Calendar($client);
|
||
|
$newEntry = $gc->newEventEntry();
|
||
|
$newEntry->title = $gc->newTitle(trim($title));
|
||
|
|
||
|
$when = $gc->newWhen();
|
||
|
$when->startTime = $startDate;
|
||
|
$when->endTime = $endDate;
|
||
|
$newEntry->when = array($when);
|
||
|
|
||
|
$wc = $gc->newWebContent();
|
||
|
$wc->url = $url;
|
||
|
$wc->height = $height;
|
||
|
$wc->width = $width;
|
||
|
|
||
|
$wcLink = $gc->newLink();
|
||
|
$wcLink->rel = "http://schemas.google.com/gCal/2005/webContent";
|
||
|
$wcLink->title = $title;
|
||
|
$wcLink->type = $type;
|
||
|
$wcLink->href = $icon;
|
||
|
|
||
|
$wcLink->webContent = $wc;
|
||
|
$newEntry->link = array($wcLink);
|
||
|
|
||
|
$createdEntry = $gc->insertEvent($newEntry);
|
||
|
return $createdEntry->id->text;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates a recurring event on the authenticated user's default calendar with
|
||
|
* the specified event details.
|
||
|
*
|
||
|
* @param Zend_Http_Client $client The authenticated client object
|
||
|
* @param string $title The event title
|
||
|
* @param string $desc The detailed description of the event
|
||
|
* @param string $where
|
||
|
* @param string $recurData The iCalendar recurring event syntax (RFC2445)
|
||
|
* @return void
|
||
|
*/
|
||
|
function createRecurringEvent ($client, $title = 'Tennis with Beth',
|
||
|
$desc='Meet for a quick lesson', $where = 'On the courts',
|
||
|
$recurData = null)
|
||
|
{
|
||
|
$gc = new Zend_Gdata_Calendar($client);
|
||
|
$newEntry = $gc->newEventEntry();
|
||
|
$newEntry->title = $gc->newTitle(trim($title));
|
||
|
$newEntry->where = array($gc->newWhere($where));
|
||
|
|
||
|
$newEntry->content = $gc->newContent($desc);
|
||
|
$newEntry->content->type = 'text';
|
||
|
|
||
|
/**
|
||
|
* Due to the length of this recurrence syntax, we did not specify
|
||
|
* it as a default parameter value directly
|
||
|
*/
|
||
|
if ($recurData == null) {
|
||
|
$recurData =
|
||
|
"DTSTART;VALUE=DATE:20070501\r\n" .
|
||
|
"DTEND;VALUE=DATE:20070502\r\n" .
|
||
|
"RRULE:FREQ=WEEKLY;BYDAY=Tu;UNTIL=20070904\r\n";
|
||
|
}
|
||
|
|
||
|
$newEntry->recurrence = $gc->newRecurrence($recurData);
|
||
|
|
||
|
$gc->post($newEntry->saveXML());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns an entry object representing the event with the specified ID.
|
||
|
*
|
||
|
* @param Zend_Http_Client $client The authenticated client object
|
||
|
* @param string $eventId The event ID string
|
||
|
* @return Zend_Gdata_Calendar_EventEntry|null if the event is found, null if it's not
|
||
|
*/
|
||
|
function getEvent($client, $eventId)
|
||
|
{
|
||
|
$gdataCal = new Zend_Gdata_Calendar($client);
|
||
|
$query = $gdataCal->newEventQuery();
|
||
|
$query->setUser('default');
|
||
|
$query->setVisibility('private');
|
||
|
$query->setProjection('full');
|
||
|
$query->setEvent($eventId);
|
||
|
|
||
|
try {
|
||
|
$eventEntry = $gdataCal->getCalendarEventEntry($query);
|
||
|
return $eventEntry;
|
||
|
} catch (Zend_Gdata_App_Exception $e) {
|
||
|
var_dump($e);
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Updates the title of the event with the specified ID to be
|
||
|
* the title specified. Also outputs the new and old title
|
||
|
* with HTML br elements separating the lines
|
||
|
*
|
||
|
* @param Zend_Http_Client $client The authenticated client object
|
||
|
* @param string $eventId The event ID string
|
||
|
* @param string $newTitle The new title to set on this event
|
||
|
* @return Zend_Gdata_Calendar_EventEntry|null The updated entry
|
||
|
*/
|
||
|
function updateEvent ($client, $eventId, $newTitle)
|
||
|
{
|
||
|
$gdataCal = new Zend_Gdata_Calendar($client);
|
||
|
if ($eventOld = getEvent($client, $eventId)) {
|
||
|
echo "Old title: " . $eventOld->title->text . "<br />\n";
|
||
|
$eventOld->title = $gdataCal->newTitle($newTitle);
|
||
|
try {
|
||
|
$eventOld->save();
|
||
|
} catch (Zend_Gdata_App_Exception $e) {
|
||
|
var_dump($e);
|
||
|
return null;
|
||
|
}
|
||
|
$eventNew = getEvent($client, $eventId);
|
||
|
echo "New title: " . $eventNew->title->text . "<br />\n";
|
||
|
return $eventNew;
|
||
|
} else {
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds an extended property to the event specified as a parameter.
|
||
|
* An extended property is an arbitrary name/value pair that can be added
|
||
|
* to an event and retrieved via the API. It is not accessible from the
|
||
|
* calendar web interface.
|
||
|
*
|
||
|
* @param Zend_Http_Client $client The authenticated client object
|
||
|
* @param string $eventId The event ID string
|
||
|
* @param string $name The name of the extended property
|
||
|
* @param string $value The value of the extended property
|
||
|
* @return Zend_Gdata_Calendar_EventEntry|null The updated entry
|
||
|
*/
|
||
|
function addExtendedProperty ($client, $eventId,
|
||
|
$name='http://www.example.com/schemas/2005#mycal.id', $value='1234')
|
||
|
{
|
||
|
$gc = new Zend_Gdata_Calendar($client);
|
||
|
if ($event = getEvent($client, $eventId)) {
|
||
|
$extProp = $gc->newExtendedProperty($name, $value);
|
||
|
$extProps = array_merge($event->extendedProperty, array($extProp));
|
||
|
$event->extendedProperty = $extProps;
|
||
|
$eventNew = $event->save();
|
||
|
return $eventNew;
|
||
|
} else {
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Adds a reminder to the event specified as a parameter.
|
||
|
*
|
||
|
* @param Zend_Http_Client $client The authenticated client object
|
||
|
* @param string $eventId The event ID string
|
||
|
* @param integer $minutes Minutes before event to set reminder
|
||
|
* @return Zend_Gdata_Calendar_EventEntry|null The updated entry
|
||
|
*/
|
||
|
function setReminder($client, $eventId, $minutes=15)
|
||
|
{
|
||
|
$gc = new Zend_Gdata_Calendar($client);
|
||
|
$method = "alert";
|
||
|
if ($event = getEvent($client, $eventId)) {
|
||
|
$times = $event->when;
|
||
|
foreach ($times as $when) {
|
||
|
$reminder = $gc->newReminder();
|
||
|
$reminder->setMinutes($minutes);
|
||
|
$reminder->setMethod($method);
|
||
|
$when->reminder = array($reminder);
|
||
|
}
|
||
|
$eventNew = $event->save();
|
||
|
return $eventNew;
|
||
|
} else {
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Deletes the event specified by retrieving the atom entry object
|
||
|
* and calling Zend_Feed_EntryAtom::delete() method. This is for
|
||
|
* example purposes only, as it is inefficient to retrieve the entire
|
||
|
* atom entry only for the purposes of deleting it.
|
||
|
*
|
||
|
* @param Zend_Http_Client $client The authenticated client object
|
||
|
* @param string $eventId The event ID string
|
||
|
* @return void
|
||
|
*/
|
||
|
function deleteEventById ($client, $eventId)
|
||
|
{
|
||
|
$event = getEvent($client, $eventId);
|
||
|
$event->delete();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Deletes the event specified by calling the Zend_Gdata::delete()
|
||
|
* method. The URL is typically in the format of:
|
||
|
* http://www.google.com/calendar/feeds/default/private/full/<eventId>
|
||
|
*
|
||
|
* @param Zend_Http_Client $client The authenticated client object
|
||
|
* @param string $url The url for the event to be deleted
|
||
|
* @return void
|
||
|
*/
|
||
|
function deleteEventByUrl ($client, $url)
|
||
|
{
|
||
|
$gdataCal = new Zend_Gdata_Calendar($client);
|
||
|
$gdataCal->delete($url);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Main logic for running this sample code via the command line or,
|
||
|
* for AuthSub functionality only, via a web browser. The output of
|
||
|
* many of the functions is in HTML format for demonstration purposes,
|
||
|
* so you may wish to pipe the output to Tidy when running from the
|
||
|
* command-line for clearer results.
|
||
|
*
|
||
|
* Run without any arguments to get usage information
|
||
|
*/
|
||
|
if (isset($argc) && $argc >= 2) {
|
||
|
switch ($argv[1]) {
|
||
|
case 'outputCalendar':
|
||
|
if ($argc == 4) {
|
||
|
$client = getClientLoginHttpClient($argv[2], $argv[3]);
|
||
|
outputCalendar($client);
|
||
|
} else {
|
||
|
echo "Usage: php {$argv[0]} {$argv[1]} " .
|
||
|
"<username> <password>\n";
|
||
|
}
|
||
|
break;
|
||
|
case 'outputCalendarMagicCookie':
|
||
|
if ($argc == 4) {
|
||
|
outputCalendarMagicCookie($argv[2], $argv[3]);
|
||
|
} else {
|
||
|
echo "Usage: php {$argv[0]} {$argv[1]} " .
|
||
|
"<username> <magicCookie>\n";
|
||
|
}
|
||
|
break;
|
||
|
case 'outputCalendarByDateRange':
|
||
|
if ($argc == 6) {
|
||
|
$client = getClientLoginHttpClient($argv[2], $argv[3]);
|
||
|
outputCalendarByDateRange($client, $argv[4], $argv[5]);
|
||
|
} else {
|
||
|
echo "Usage: php {$argv[0]} {$argv[1]} " .
|
||
|
"<username> <password> <startDate> <endDate>\n";
|
||
|
}
|
||
|
break;
|
||
|
case 'outputCalendarByFullTextQuery':
|
||
|
if ($argc == 5) {
|
||
|
$client = getClientLoginHttpClient($argv[2], $argv[3]);
|
||
|
outputCalendarByFullTextQuery($client, $argv[4]);
|
||
|
} else {
|
||
|
echo "Usage: php {$argv[0]} {$argv[1]} " .
|
||
|
"<username> <password> <fullTextQuery>\n";
|
||
|
}
|
||
|
break;
|
||
|
case 'outputCalendarList':
|
||
|
if ($argc == 4) {
|
||
|
$client = getClientLoginHttpClient($argv[2], $argv[3]);
|
||
|
outputCalendarList($client);
|
||
|
} else {
|
||
|
echo "Usage: php {$argv[0]} {$argv[1]} " .
|
||
|
"<username> <password>\n";
|
||
|
}
|
||
|
break;
|
||
|
case 'updateEvent':
|
||
|
if ($argc == 6) {
|
||
|
$client = getClientLoginHttpClient($argv[2], $argv[3]);
|
||
|
updateEvent($client, $argv[4], $argv[5]);
|
||
|
} else {
|
||
|
echo "Usage: php {$argv[0]} {$argv[1]} <username> <password> " .
|
||
|
"<eventId> <newTitle>\n";
|
||
|
}
|
||
|
break;
|
||
|
case 'setReminder':
|
||
|
if ($argc == 6) {
|
||
|
$client = getClientLoginHttpClient($argv[2], $argv[3]);
|
||
|
setReminder($client, $argv[4], $argv[5]);
|
||
|
} else {
|
||
|
echo "Usage: php {$argv[0]} {$argv[1]} <username> <password> " .
|
||
|
"<eventId> <minutes>\n";
|
||
|
}
|
||
|
break;
|
||
|
case 'addExtendedProperty':
|
||
|
if ($argc == 7) {
|
||
|
$client = getClientLoginHttpClient($argv[2], $argv[3]);
|
||
|
addExtendedProperty($client, $argv[4], $argv[5], $argv[6]);
|
||
|
} else {
|
||
|
echo "Usage: php {$argv[0]} {$argv[1]} <username> <password> " .
|
||
|
"<eventId> <name> <value>\n";
|
||
|
}
|
||
|
break;
|
||
|
case 'deleteEventById':
|
||
|
if ($argc == 5) {
|
||
|
$client = getClientLoginHttpClient($argv[2], $argv[3]);
|
||
|
deleteEventById($client, $argv[4]);
|
||
|
} else {
|
||
|
echo "Usage: php {$argv[0]} {$argv[1]} <username> <password> " .
|
||
|
"<eventId>\n";
|
||
|
}
|
||
|
break;
|
||
|
case 'deleteEventByUrl':
|
||
|
if ($argc == 5) {
|
||
|
$client = getClientLoginHttpClient($argv[2], $argv[3]);
|
||
|
deleteEventByUrl($client, $argv[4]);
|
||
|
} else {
|
||
|
echo "Usage: php {$argv[0]} {$argv[1]} <username> <password> " .
|
||
|
"<eventUrl>\n";
|
||
|
}
|
||
|
break;
|
||
|
case 'createEvent':
|
||
|
if ($argc == 12) {
|
||
|
$client = getClientLoginHttpClient($argv[2], $argv[3]);
|
||
|
$id = createEvent($client, $argv[4], $argv[5], $argv[6], $argv[7],
|
||
|
$argv[8], $argv[9], $argv[10], $argv[11]);
|
||
|
print "Event created with ID: $id\n";
|
||
|
} else {
|
||
|
echo "Usage: php {$argv[0]} {$argv[1]} <username> <password> " .
|
||
|
"<title> <description> <where> " .
|
||
|
"<startDate> <startTime> <endDate> <endTime> <tzOffset>\n";
|
||
|
echo "EXAMPLE: php {$argv[0]} {$argv[1]} <username> <password> " .
|
||
|
"'Tennis with Beth' 'Meet for a quick lesson' 'On the courts' " .
|
||
|
"'2008-01-01' '10:00' '2008-01-01' '11:00' '-08'\n";
|
||
|
}
|
||
|
break;
|
||
|
case 'createQuickAddEvent':
|
||
|
if ($argc == 5) {
|
||
|
$client = getClientLoginHttpClient($argv[2], $argv[3]);
|
||
|
$id = createQuickAddEvent($client, $argv[4]);
|
||
|
print "Event created with ID: $id\n";
|
||
|
} else {
|
||
|
echo "Usage: php {$argv[0]} {$argv[1]} <username> <password> " .
|
||
|
"<quickAddText>\n";
|
||
|
echo "EXAMPLE: php {$argv[0]} {$argv[1]} <username> <password> " .
|
||
|
"'Dinner at the beach on Thursday 8 PM'\n";
|
||
|
}
|
||
|
break;
|
||
|
case 'createWebContentEvent':
|
||
|
if ($argc == 12) {
|
||
|
$client = getClientLoginHttpClient($argv[2], $argv[3]);
|
||
|
$id = createWebContentEvent($client, $argv[4], $argv[5], $argv[6],
|
||
|
$argv[7], $argv[8], $argv[9], $argv[10], $argv[11]);
|
||
|
print "Event created with ID: $id\n";
|
||
|
} else {
|
||
|
echo "Usage: php {$argv[0]} {$argv[1]} <username> <password> " .
|
||
|
"<title> <startDate> <endDate> <icon> <url> <height> <width> <type>\n\n";
|
||
|
echo "This creates a web content event on 2007/06/09.\n";
|
||
|
echo "EXAMPLE: php {$argv[0]} {$argv[1]} <username> <password> " .
|
||
|
"'World Cup 2006' '2007-06-09' '2007-06-10' " .
|
||
|
"'http://www.google.com/calendar/images/google-holiday.gif' " .
|
||
|
"'http://www.google.com/logos/worldcup06.gif' " .
|
||
|
"'120' '276' 'image/gif'\n";
|
||
|
}
|
||
|
break;
|
||
|
case 'createRecurringEvent':
|
||
|
if ($argc == 7) {
|
||
|
$client = getClientLoginHttpClient($argv[2], $argv[3]);
|
||
|
createRecurringEvent($client, $argv[4], $argv[5], $argv[6]);
|
||
|
} else {
|
||
|
echo "Usage: php {$argv[0]} {$argv[1]} <username> <password> " .
|
||
|
"<title> <description> <where>\n\n";
|
||
|
echo "This creates an all-day event which occurs first on 2007/05/01" .
|
||
|
"and repeats weekly on Tuesdays until 2007/09/04\n";
|
||
|
echo "EXAMPLE: php {$argv[0]} {$argv[1]} <username> <password> " .
|
||
|
"'Tennis with Beth' 'Meet for a quick lesson' 'On the courts'\n";
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
} else if (!isset($_SERVER["HTTP_HOST"])) {
|
||
|
// running from command line, but action left unspecified
|
||
|
echo "Usage: php {$argv[0]} <action> [<username>] [<password>] " .
|
||
|
"[<arg1> <arg2> ...]\n\n";
|
||
|
echo "Possible action values include:\n" .
|
||
|
"outputCalendar\n" .
|
||
|
"outputCalendarMagicCookie\n" .
|
||
|
"outputCalendarByDateRange\n" .
|
||
|
"outputCalendarByFullTextQuery\n" .
|
||
|
"outputCalendarList\n" .
|
||
|
"updateEvent\n" .
|
||
|
"deleteEventById\n" .
|
||
|
"deleteEventByUrl\n" .
|
||
|
"createEvent\n" .
|
||
|
"createQuickAddEvent\n" .
|
||
|
"createWebContentEvent\n" .
|
||
|
"createRecurringEvent\n" .
|
||
|
"setReminder\n" .
|
||
|
"addExtendedProperty\n";
|
||
|
} else {
|
||
|
// running through web server - demonstrate AuthSub
|
||
|
processPageLoad();
|
||
|
}
|