Protože mi nikdo neodpověděl, rozhodl jsem se začít šťourat v dokumentaci k Google Calendar API, která není v PHP, konkrétně v .NET a jen trochu v raw protokolu. A nevěděli byste to...
Pokud přejdete do dokumentace .NET, je v ní zmíněno skvělé nové funkce, konkrétně jak vytvářet nové neprimární kalendáře pro ověřené uživatele a jak přidávat události do neprimárních kalendářů.
Tato dokumentace se samozřejmě nikde v oblasti PHP nezobrazuje a nezdá se, že by existovala vzájemná korelace. Při vytváření nového kalendáře jsem nejprve vyzkoušel několik samozřejmých věcí, pak jsem se dostal na mizinu a zkusil jsem něco nepříliš zřejmého, co fungovalo. Myslel jsem, že se podělím pro případ, že důvodem ticha rádia bylo to, že nikdo neznal odpověď, ale určitě bych rád.
Vytvoření nového kalendáře:
K tomu jsou dva klíče:
-
Pro přidávání událostí kalendáře musíte použít stejnou metodu, a to
insertEvent()
-
V metodě musíte nastavit adresu URL příspěvku, která jinak přejde na výchozí adresu URL zdroje.
Tento příklad zkontroluje, zda kalendář aplikací již existuje, a pokud ne, vytvoří jej:
//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);
}
A tady to máte. Dalším cílem je vložit události do tohoto kalendáře, nikoli do výchozího kalendáře.
Přidávání událostí do jiného než primárního kalendáře
Nejsnazší část, kterou pravděpodobně uhodnete, je, že tuto nepovinnou adresu URL musíte znovu nastavit, například:insertEvent($newEvent, $calURL)
, složitější je získat adresu URL kalendáře. Na rozdíl od cesty „vlastněné kalendáře“ mají konkrétní kalendáře nejen informace specifické pro uživatele, ale také nějaké ID vypadající jako hash.
Zde je kód:
//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>";
Děkuji každému, kdo si přečetl můj dotaz a přemýšlel o něm. Pokud někdo ví o způsobu, jak zpřísnit výše uvedený kód (možná nepotřebuji dvě smyčky?), rád bych dostal zpětnou vazbu.