Nå, da ingen svarede, besluttede jeg at begynde at kigge rundt i ikke-PHP-dokumentationen til Google Calendar API, specifikt på .NET-tingene og bare lidt i den rå protokol. Og ville du ikke vide det...
Hvis du går til .NET-dokumentationen nævner den cool ny funktioner, specifikt hvordan man opretter nye ikke-primære kalendere til godkendte brugere, og hvordan man tilføjer begivenheder til ikke-primære kalendere.
Selvfølgelig dukker denne dokumentation ingen steder op i PHP-området, og der ser ikke ud til at være en en-til-en sammenhæng. Til oprettelsen af den nye kalender prøvede jeg først nogle indlysende ting, og derefter prøvede jeg noget knap så indlysende, der virkede. Jeg tænkte, at jeg ville dele det, hvis årsagen til radiotavsheden var, at ingen kendte svaret, men sikkert gerne ville.
Sådan opretter du en ny kalender:
Der er to nøgler til dette:
-
Du skal bruge den samme metode til at tilføje kalenderbegivenheder, som er
insertEvent()
-
Du skal indstille post-URL'en i metoden, som ellers går til standard feed-URL.
Dette eksempel kontrollerer, om app-kalenderen allerede eksisterer, og hvis ikke, opretter 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);
}
Og der har du det. Det næste mål er at indsætte begivenheder i denne kalender, ikke til standardkalenderen.
Tilføjelse af begivenheder til ikke-primær kalender
Den nemme del, som du sikkert kan gætte, er, at du skal indstille den valgfri URL igen, som sådan:insertEvent($newEvent, $calURL)
, den vanskelige del er at få kalenderens URL. I modsætning til stien til "ejede kalendere" har specifikke kalendere ikke kun brugerspecifikke oplysninger, de har også en slags hash-lookin' ID derinde.
Her er 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>";
Tak til alle, der læste mit spørgsmål og gjorde sig nogle tanker om det. Hvis nogen kender til en måde at stramme ovenstående kode op (måske har jeg ikke brug for to sløjfer?) vil jeg meget gerne have feedback.