Tja, eftersom ingen svarade, bestämde jag mig för att börja leta runt i icke-PHP-dokumentationen för Google Calendar API, specifikt på .NET-grejer och bara lite i råprotokollet. Och skulle du inte veta det...
Om du går till .NET-dokumentationen nämner den coola nya funktioner, särskilt hur man skapar nya icke-primära kalendrar för autentiserade användare och hur man lägger till händelser i icke-primära kalendrar.
Naturligtvis dyker den här dokumentationen upp ingenstans i PHP-området, och det verkar inte finnas en en-till-en korrelation. För att skapa den nya kalendern provade jag några uppenbara saker först, och sedan gick jag på fel och provade något inte så uppenbart som fungerade. Jag tänkte dela med mig ifall orsaken till radiotystnaden var att ingen visste svaret men säkert skulle vilja det.
Så här skapar du en ny kalender:
Det finns två nycklar till detta:
-
Du måste använda samma metod för att lägga till kalenderhändelser, vilket är
insertEvent()
-
Du måste ställa in inläggets URL i metoden, som annars går till standardflödesadressen.
Det här exemplet kontrollerar om appkalendern redan finns och om inte, skapar den:
//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);
}
Och där har du det. Nästa mål är att infoga händelser i den kalendern, inte i standardkalendern.
Lägga till händelser i icke-primär kalender
Den enkla delen som du förmodligen kan gissa är att du måste ställa in den valfria webbadressen igen, som t.ex.:insertEvent($newEvent, $calURL)
, den svåra delen är att få kalenderns URL. Till skillnad från sökvägen för "ägda kalendrar" har specifika kalendrar inte bara användarspecifik information, de har också något slags hash-lookin'-ID.
Här är koden:
//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>";
Tack till alla som läst min fråga och funderat på den. Om någon vet om ett sätt att skärpa koden ovan (kanske jag inte behöver två slingor?) skulle jag gärna få feedback.