Е, тъй като никой не отговори, реших да започна да се ровя в не-PHP документацията за API на Google Календар, по-специално в .NET нещата и само малко в необработения протокол. И не знаеш ли...
Ако отидете в документацията на .NET, тя споменава страхотно ново функции, по-специално как да създавате нови неосновни календари за удостоверени потребители и как да добавяте събития към неосновни календари.
Разбира се, тази документация не се показва никъде в областта на PHP и изглежда няма корелация едно към едно. За създаването на новия календар първо опитах някои очевидни неща, след което, като се развалих, опитах нещо не толкова очевидно, което проработи. Реших да споделя, в случай че причината за радиомълчанието е, че никой не знаеше отговора, но със сигурност би искал.
За да създадете нов календар:
Има два ключа за това:
-
Трябва да използвате същия метод за добавяне на събития в календара, който е
insertEvent()
-
Трябва да зададете URL адреса на публикацията в метода, който иначе отива към URL адреса на канала по подразбиране.
Този пример проверява дали App Calendar вече съществува и ако не, го създава:
//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);
}
И ето го. Следващата цел е да вмъкнете събития в този календар, а не в календара по подразбиране.
Добавяне на събития към неосновния календар
Лесната част, която вероятно можете да предположите, е, че трябва да зададете този незадължителен URL адрес, като например:insertEvent($newEvent, $calURL)
, трудната част е получаването на URL адреса на календара. За разлика от пътя „притежавани календари“, конкретните календари не само съдържат специфична за потребителя информация, но имат и някакъв вид идентификатор, който изглежда като хеш.
Ето кода:
//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>";
Благодаря на всеки, който прочете въпроса ми и се замисли. Ако някой знае начин за затягане на горния код (може би нямам нужда от два цикъла?), ще се радвам да получа обратна връзка.