Nun, da niemand antwortete, beschloss ich, in der Nicht-PHP-Dokumentation für die Google Kalender-API herumzustöbern, insbesondere in den .NET-Sachen und nur ein bisschen im Rohprotokoll. Und würdest du es nicht wissen...
Wenn Sie zur .NET-Dokumentation gehen, wird cool neu erwähnt Funktionen, insbesondere zum Erstellen neuer nicht primärer Kalender für authentifizierte Benutzer und zum Hinzufügen von Ereignissen zu nicht primären Kalendern.
Natürlich taucht diese Dokumentation nirgendwo im PHP-Bereich auf, und es scheint keine Eins-zu-eins-Korrelation zu geben. Für die Erstellung des neuen Kalenders habe ich zuerst einige offensichtliche Dinge ausprobiert, dann habe ich etwas nicht so Offensichtliches ausprobiert, das funktioniert hat. Ich dachte, ich würde es teilen, falls der Grund für die Funkstille darin bestand, dass niemand die Antwort kannte, es aber gerne wissen würde.
So erstellen Sie einen neuen Kalender:
Dafür gibt es zwei Schlüssel:
-
Sie müssen dieselbe Methode zum Hinzufügen von Kalenderereignissen verwenden, nämlich
insertEvent()
-
Sie müssen die Beitrags-URL in der Methode festlegen, die sonst auf die Standard-Feed-URL geht.
In diesem Beispiel wird überprüft, ob der App-Kalender bereits vorhanden ist, und wenn nicht, wird er erstellt:
//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);
}
Und da haben Sie es. Das nächste Ziel besteht darin, Ereignisse in diesen Kalender einzufügen, nicht in den Standardkalender.
Hinzufügen von Ereignissen zum nicht primären Kalender
Der einfache Teil, den Sie wahrscheinlich erraten können, ist, dass Sie diese optionale URL erneut festlegen müssen, etwa so:insertEvent($newEvent, $calURL)
, der knifflige Teil besteht darin, die URL des Kalenders abzurufen. Im Gegensatz zum Pfad „Eigene Kalender“ enthalten bestimmte Kalender nicht nur benutzerspezifische Informationen, sondern auch eine Art Hash-Lookin-ID.
Hier ist der 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>";
Vielen Dank an alle, die meine Frage gelesen und darüber nachgedacht haben. Wenn jemand eine Möglichkeit kennt, den obigen Code zu straffen (vielleicht brauche ich keine zwei Schleifen?), würde ich mich über Feedback freuen.