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); |
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); } |
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); } |
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.