I’m using zend framework’s GData library to work with google calendar api v2 and I’d implemented a solution to add and delete events. The adding of events works well, but deleting them did not. According to zend, the way to delete an event is like this
// Option 1: Events can be deleted directly
$event->delete();
// Option 2: Events can be deleted supplying the edit URL of the event
// to the calendar service, if known
$service->delete($event->getEditLink()->href); |
// Option 1: Events can be deleted directly
$event->delete();
// Option 2: Events can be deleted supplying the edit URL of the event
// to the calendar service, if known
$service->delete($event->getEditLink()->href);
Deleting via option #1
So after adding the event via the api, an object of Zend_Gdata_Calendar_EventEntry is returned and I should be able to simply do $event->delete(); to delete the event, but this does not work and returns the following error: “Expected response code 200, got 405. Http method DELETE is not supported by this URL”. It’s what the documentation says to do and it doesn’t work.
Deleting via option #2
So, let’s try the other way by storing the “edit link”. First we add the calendar entry successfully, then take the instance of Zend_Gdata_Calendar_EventEntry that is returned and call the delete as below
$event = $cal->addEvent(/* my own method that adds the event and returns instance of Zend_Gdata_Calendar_EventEntry */);
$link = $event->getEditLink()->href;
function deleteEventByEditLink($link) {
$client = getClient();
$service = new Zend_Gdata_Calendar($client);
try {
$response = $service->delete($link);
} catch(Exception $e) {
//event most likely didn't exist on the calendar.
return false;
}
return true;
}
function getClient() {
return Zend_Gdata_ClientLogin::getHttpClient(GOOGLE_CALENDAR_USERNAME, GOOGLE_CALENDAR_PASSWORD, Zend_Gdata_Calendar::AUTH_SERVICE_NAME);
} |
$event = $cal->addEvent(/* my own method that adds the event and returns instance of Zend_Gdata_Calendar_EventEntry */);
$link = $event->getEditLink()->href;
function deleteEventByEditLink($link) {
$client = getClient();
$service = new Zend_Gdata_Calendar($client);
try {
$response = $service->delete($link);
} catch(Exception $e) {
//event most likely didn't exist on the calendar.
return false;
}
return true;
}
function getClient() {
return Zend_Gdata_ClientLogin::getHttpClient(GOOGLE_CALENDAR_USERNAME, GOOGLE_CALENDAR_PASSWORD, Zend_Gdata_Calendar::AUTH_SERVICE_NAME);
}
The $response variable above results in a NULL value and the entry does not delete.
What does work – Yes, how to actually delete events!
I was able to find a working solution by storing the event id rather than the edit link, then loading the event by id through the api and then calling the delete method as below.
/* after adding, extract and save the event id */
$event = $cal->addEvent();
$eventId = $event->id->text;
/* deleting */
$result = deleteEventById($eventId);
function deleteEventById($eventId) {
$event = getEventById($eventId);
try {
$response = $event->delete();
} catch(Exception $e) {
//event most likely didn't exist on the calendar.
return false;
}
return true;
}
function getEventById($eventId) {
// Create an authenticated HTTP client
$client = getClient();
$service = new Zend_Gdata_Calendar($client);
try {
return $service->getCalendarEventEntry($eventId);
} catch (Zend_Gdata_App_Exception $e) {
echo "Error: " . $e->getMessage();
}
}
function getClient() {
return Zend_Gdata_ClientLogin::getHttpClient(GOOGLE_CALENDAR_USERNAME, GOOGLE_CALENDAR_PASSWORD, Zend_Gdata_Calendar::AUTH_SERVICE_NAME);
} |
/* after adding, extract and save the event id */
$event = $cal->addEvent();
$eventId = $event->id->text;
/* deleting */
$result = deleteEventById($eventId);
function deleteEventById($eventId) {
$event = getEventById($eventId);
try {
$response = $event->delete();
} catch(Exception $e) {
//event most likely didn't exist on the calendar.
return false;
}
return true;
}
function getEventById($eventId) {
// Create an authenticated HTTP client
$client = getClient();
$service = new Zend_Gdata_Calendar($client);
try {
return $service->getCalendarEventEntry($eventId);
} catch (Zend_Gdata_App_Exception $e) {
echo "Error: " . $e->getMessage();
}
}
function getClient() {
return Zend_Gdata_ClientLogin::getHttpClient(GOOGLE_CALENDAR_USERNAME, GOOGLE_CALENDAR_PASSWORD, Zend_Gdata_Calendar::AUTH_SERVICE_NAME);
}
Hope this saves somebody six hours of pain. Google calendar has API V3 out that seems to work pretty well, except for the oauth authentication bit… have fun with that.