2009-10-07 5 views
11

Quindi desidero sincronizzare automaticamente il calendario di lavoro con il calendario di ogni dipendente quando il gestore della pianificazione pubblica/aggiorna le pianificazioni. Gli utenti inizialmente opt-in utilizzando il token AuthSub, ma dopo ciò dovrebbe essere automatico. Per evitare conflitti con altri eventi che hanno programmato, voglio creare un nuovo calendario chiamato "Work App" o qualcos'altro piuttosto unico. Quindi, per gli aggiornamenti, eliminerebbe semplicemente tutti gli eventi da quell'intervallo prima di creare i nuovi eventi. Quindi ho alcune domande ...API calendario Google: selezione/creazione di calendari?

  1. Come selezionare il calendario specifico che desidero utilizzare l'API? (tutto questo in PHP, a proposito, usando Zend Framework). Vedo dove posso richiedere l'elenco dei calendari, ma la documentazione non mostra come aggiungere a quel calendario specifico.

  2. Posso creare calendari? Devo solo avere gli utenti che scelgono di creare un calendario del genere? In tal caso, c'è un URL che potrei generare per crearne uno simile ad aggiungere gli eventi? (Qualcosa per rendere le cose semplici e coerenti, giusto?)

  3. Non voglio che gli utenti memorizzino le loro credenziali, ovviamente, ma non voglio nemmeno richiedere l'accesso per ogni aggiornamento. Ho bisogno di un token OAuth per avere accesso permanente? So che il token URL è utilizzabile una sola volta, ma posso memorizzare il token di sessione e riutilizzarlo una settimana dopo?

  4. C'è un modo diverso dall'interrogazione per ciascun evento per evitare duplicati? Stavo testando la scorsa notte e ora ho 7 istanze degli stessi 50 eventi. Non voglio aggiungere tempo al server con il controllo prima di ogni aggiunta.

  5. Infine, c'è un modo per aggiungere diversi eventi, o anche semplicemente spingere il file ics sul calendario. In questo momento ho lo script fare una query SQL e aggiungere ogni evento mentre scorre attraverso i risultati. Sembra richiedere molto più tempo del previsto, quindi è sufficiente creare il file ics o aggiungere tutti gli eventi a un oggetto e aggiungerli tutti in una volta sarebbe meglio. Grazie!

+0

Ho rimosso il tag google-app-engine, poiché non penso che lo stiate utilizzando. –

risposta

26

Beh visto nessuno rispondeva, ho deciso di iniziare rovistando la documentazione non PHP per l'API di Google Calendar, in particolare la roba NET e solo un po 'nel protocollo crudo. E non lo sai ...

Se si va alla documentazione di .NET si parla fresco nuove caratteristiche, in particolare su come creare nuovi calendari non primarie per gli utenti autenticati e come aggiungere eventi calendari non primari.

Ovviamente, questa documentazione non compare da nessuna parte nell'area PHP e non sembra esserci una correlazione uno-a-uno. Per la creazione del nuovo calendario, ho provato prima alcune cose ovvie, poi, andando per il rotto, ho provato qualcosa di non così ovvio che ha funzionato. Pensavo di condividere il motivo per cui il silenzio radio era che nessuno sapeva la risposta, ma sicuramente avrebbe voluto.

Per creare un nuovo calendario:

Ci sono due chiavi di questo:

  1. Devi usare lo stesso metodo per aggiungere gli eventi del calendario, che è insertEvent()

  2. Hai per impostare l'URL del post nel metodo, che altrimenti va all'URL del feed predefinito.

seguente esempio vengono controllate per vedere se il calendario App esiste già e se non, lo crea:

//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); 
} 

E il gioco è fatto. Il prossimo obiettivo è inserire eventi per quel calendario, non per il calendario predefinito.

Aggiunta di eventi al calendario non primario

La parte più semplice che si può intuire è che è necessario impostare di nuovo l'URL opzionale, come ad esempio: insertEvent($newEvent, $calURL), la parte difficile è ottenere l'URL del calendario. A differenza del percorso "calendari di proprietà", i calendari specifici non solo contengono informazioni specifiche dell'utente, ma hanno anche una sorta di ID di hash-lookin.

Ecco il codice:

//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>"; 

Grazie a tutti coloro che hanno letto la mia domanda e ha fatto alcun pensiero su di esso. Se qualcuno conosce un modo per stringere il codice sopra (forse non ho bisogno di due loop?) Mi piacerebbe avere un feedback.

+1

Grazie per l'auto-ricerca e la risposta. Ti dispiacerebbe fornirci un link alla documentazione di .NET che menzioni? Grazie ancora. –

+1

Hai trovato come selezionare un calendario specifico da quelli non primari? – glaz666

1

Credo che Anthony si riferisca ai documenti v1 o ai documenti v2 sul sito delle API di Google Calendar. L'ho gestito abbastanza facilmente in Perl, seguendo lo v2 protocol guide.

La chiave è modificare l'URL a cui si sta eseguendo il POST. Invece del valore predefinito "/ calendar/feeds/default/private/full", devi prima recuperare l'elenco dei calendari disponibili, quindi ottenere il valore content/@ src dal calendario che desideri e postare su quello, ad es. /calendar/feeds/1234567890abcdefeg%40group.calendar.google.com/private/full