Cóż, ponieważ nikt nie odpowiedział, postanowiłem zacząć grzebać w dokumentacji innej niż PHP dla API Kalendarza Google, w szczególności w sprawie .NET i tylko trochę w surowym protokole. I czy nie wiesz o tym...
Jeśli przejdziesz do dokumentacji .NET, jest tam mowa o fajnych nowych funkcje, w szczególności jak tworzyć nowe kalendarze inne niż podstawowe dla uwierzytelnionych użytkowników i jak dodawać wydarzenia do kalendarzy innych niż podstawowe.
Oczywiście ta dokumentacja nie pojawia się nigdzie w obszarze PHP i nie wydaje się, aby istniała korelacja jeden do jednego. Podczas tworzenia nowego kalendarza najpierw spróbowałem kilku oczywistych rzeczy, a następnie spróbowałem czegoś nie tak oczywistego, co zadziałało. Pomyślałem, że podzielę się na wypadek, gdyby przyczyną ciszy radiowej było to, że nikt nie znał odpowiedzi, ale na pewno by chciał.
Aby utworzyć nowy kalendarz:
Są do tego dwa klucze:
-
Musisz użyć tej samej metody dodawania wydarzeń do kalendarza, czyli
insertEvent()
-
Musisz ustawić adres URL posta w metodzie, który w przeciwnym razie przejdzie do domyślnego adresu URL kanału.
Ten przykład sprawdza, czy kalendarz aplikacji już istnieje, a jeśli nie, tworzy go:
//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);
}
I masz to. Następnym celem jest wstawianie wydarzeń do tego kalendarza, a nie do kalendarza domyślnego.
Dodawanie wydarzeń do kalendarza innego niż podstawowy
Najłatwiejszą częścią, którą prawdopodobnie możesz się domyślić, jest to, że musisz ponownie ustawić ten opcjonalny adres URL, na przykład:insertEvent($newEvent, $calURL)
, trudną częścią jest uzyskanie adresu URL kalendarza. W przeciwieństwie do ścieżki „własnych kalendarzy”, określone kalendarze nie tylko zawierają informacje specyficzne dla użytkownika, ale także mają w sobie coś w rodzaju identyfikatora haszującego.
Oto kod:
//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>";
Dziękuję każdemu, kto przeczytał moje pytanie i pomyślał o nim. Jeśli ktoś zna sposób na zaostrzenie powyższego kodu (może nie potrzebuję dwóch pętli?), chciałbym otrzymać informację zwrotną.