Omdat niemand antwoordde, besloot ik te gaan rondneuzen in de niet-PHP-documentatie voor de Google Agenda-API, met name bij de .NET-dingen en een beetje in het onbewerkte protocol. En zou je het niet weten...
Als je naar de .NET-documentatie gaat, staat daar cool new functies, met name hoe u nieuwe niet-primaire agenda's kunt maken voor geverifieerde gebruikers en hoe u afspraken kunt toevoegen aan niet-primaire agenda's.
Natuurlijk verschijnt deze documentatie nergens in het PHP-gebied, en er lijkt geen één-op-één correlatie te zijn. Voor het maken van de nieuwe kalender heb ik eerst een aantal voor de hand liggende dingen geprobeerd, en toen ging ik failliet en probeerde iets niet zo voor de hand liggend dat werkte. Ik dacht dat ik het zou delen voor het geval de reden voor de radiostilte was dat niemand het antwoord wist, maar het zeker zou willen.
Een nieuwe agenda maken:
Hiervoor zijn twee sleutels:
-
U moet dezelfde methode gebruiken om agenda-afspraken toe te voegen, namelijk
insertEvent()
-
Je moet de post-URL instellen in de methode, die anders naar de standaard feed-URL gaat.
In dit voorbeeld wordt gecontroleerd of de app-agenda al bestaat en zo niet, wordt deze gemaakt:
//Standard creation of the HTTP client
$gdataCal = new Zend_Gdata_Calendar($client);
//Get list of existing calendars
$calFeed = $gdataCal->getCalendarListFeed();
//Set this to true by default, only gets set to false if calendar is found
$noAppCal = true;
//Loop through calendars and check name which is ->title->text
foreach ($calFeed as $calendar) {
if($calendar -> title -> text == "App Calendar") {
$noAppCal = false;
}
}
//If name not found, create the calendar
if($noAppCal) {
// I actually had to guess this method based on Google API's "magic" factory
$appCal = $gdataCal -> newListEntry();
// I only set the title, other options like color are available.
$appCal -> title = $gdataCal-> newTitle("App Calendar");
//This is the right URL to post to for new calendars...
//Notice that the user's info is nowhere in there
$own_cal = "http://www.google.com/calendar/feeds/default/owncalendars/full";
//And here's the payoff.
//Use the insertEvent method, set the second optional var to the right URL
$gdataCal->insertEvent($appCal, $own_cal);
}
En daar heb je het. Het volgende doel is om evenementen in die agenda in te voegen, niet in de standaardagenda.
Afspraken toevoegen aan niet-primaire agenda
Het makkelijke dat je waarschijnlijk wel kunt raden, is dat je die optionele URL opnieuw moet instellen, zoals:insertEvent($newEvent, $calURL)
, het lastige is om de URL van de kalender te krijgen. In tegenstelling tot het pad 'agenda's in eigendom', bevatten specifieke agenda's niet alleen gebruikersspecifieke informatie, maar ook een soort hash-look-in'-ID.
Hier is de code:
//Set up that loop again to find the new calendar:
$calFeed = $gdataCal->getCalendarListFeed();
foreach ($calFeed as $calendar) {
if($calendar->title->text == "App Calendar")
//This is the money, you need to use '->content-src'
//Anything else and you have to manipulate it to get it right.
$appCalUrl = $calendar->content->src;
}
//.......... Some Assumed MySQL query and results .............
while ($event = $result->fetch_assoc()) {
$title = $event['description'];
//Quick heads up
//This is a handy way of getting the date/time in one expression.
$eventStart = date('Y-m-d\TH:i:sP', strtotime($event['start']));
$eventEnd = date('Y-m-d\TH:i:sP', strtotime($event['end']));
$newEvent = $gdataCal->newEventEntry();
$newEvent->title = $gdataCal->newTitle($title);
$when = $gdataCal->newWhen();
$when->startTime = $eventStart;
$when->endTime = $eventEnd;
$newEvent->when = array($when);
//And at last, the insert is set to the calendar URL found above
$createdEvent = $gdataCal->insertEvent($newEvent, $appCalUrl);
}
echo "<p>".$result->num_rows." added to your Google calendar.</p>";
Bedankt aan iedereen die mijn vraag heeft gelezen en erover heeft nagedacht. Als iemand een manier weet om de bovenstaande code strakker te maken (misschien heb ik geen twee lussen nodig?) Ik zou graag feedback krijgen.