Domanda

Quindi voglio il nostro calendario di lavoro per la sincronizzazione automatica con la di ogni dipendente Google Calendar quando il gestore messaggi di programmazione / aggiorna gli orari. Gli utenti sarebbero inizialmente opt-in utilizzando il token AuthSub, ma dopo che dovrebbe essere automatico. Al fine di evitare conflitti con altri eventi che hanno in programma, voglio creare un nuovo calendario chiamato "App Lavoro" o qualcos'altro abbastanza singolare. Poi per gli aggiornamenti, sarebbe sufficiente eliminare tutti gli eventi da quel range prima di creare nuovi eventi. Così ho alcune domande ...

  1. Come faccio a selezionare il calendario speciali Io voglio utilizzando l'API? (Tutto questo in PHP, tra l'altro, utilizzando Zend Framework). Vedo dove posso ricercare l'elenco dei calendari, ma la documentazione non mostra come aggiungere a quel calendario specifico.

  2. Posso creare calendari? Ho bisogno di avere solo gli utenti che scelgono di creare tale calendario? Se è così, c'è un URL ho potuto generare per loro di creare uno come c'è per l'aggiunta di eventi? (Tutto ciò per rendere le cose semplici e coerenti, giusto?)

  3. Non voglio utenti di memorizzare le proprie credenziali, ovviamente, ma anche io non voglio per richiedere l'accesso per ogni aggiornamento. Ho bisogno di un token OAuth al fine di avere accesso persistente? So che il token URL è un uso di volta, ma posso memorizzare sessione token e riutilizzarla una settimana dopo?

  4. C'è un modo diverso l'esecuzione di query per ogni evento per evitare duplicati? Stavo testando questo ieri sera e ora ho 7 istanze degli stessi 50 eventi. Non voglio aggiungere al tempo di server con il controllo prima di ogni add.

  5. Infine, c'è un modo per aggiungere una serie di eventi, o anche per spingere semplicemente il file ics al calendario. In questo momento ho il copione fare una query SQL e aggiungere ogni evento come loop attraverso i risultati. Sembra prendere molto più tempo del previsto, quindi solo la costruzione o il file ics o l'aggiunta di tutti gli eventi di un oggetto e l'aggiunta di tutti in una volta sarebbe meglio. Grazie!

È stato utile?

Soluzione

Bene poiché nessuno ha risposto, 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 nuovo le caratteristiche, in particolare su come creare nuovi calendari non primarie per gli utenti autenticati e come aggiungere eventi da non calendari -Primary.

Naturalmente, questa documentazione si presenta da nessuna parte nella zona di PHP, e non sembra esserci una correlazione uno-a-uno. Per la creazione del nuovo calendario, ho provato alcune cose ovvie, poi, il tutto per tutto, provato qualcosa di non così evidente che ha funzionato. Ho pensato di condividere nel caso in cui il motivo per il silenzio radio era che nessuno sapeva la risposta, ma certo vorrei.

Per creare un nuovo calendario:

Ci sono due chiavi per questo:

  1. Si deve utilizzare lo stesso metodo per aggiungere gli eventi del calendario, che è insertEvent()

  2. È necessario impostare l'URL posta nel metodo, che va al contrario l'URL del feed di default.

In questo esempio controlla 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 è quello di inserire gli eventi di quel calendario, non al 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 dei "calendari di proprietà" percorso, calendari specifici non solo hanno informazioni utente-specifc in esso, hanno un qualche tipo di hash-lookin' ID in là, anche.

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 sa di un modo per stringere il codice di cui sopra fino (forse non ho bisogno di due loop?) Mi piacerebbe ottenere un feedback.

Altri suggerimenti

Credo che Anthony si riferisce a entrambi i documenti V1 o la documentazione v2 sul sito API di Google Calendar. Sono riuscito abbastanza facilmente in Perl, seguendo la v2 guida protocollo .

La chiave è quello di cambiare l'URL che stai postando. Al posto del default "/ calendar / feed / default / private / pieno", in primo luogo prendere l'elenco dei calendari disponibili, quindi ottenere il valore src contenuti / @ dal calendario che si desidera, e inviare a questo, ad esempio, /calendar/feeds/1234567890abcdefeg%40group.calendar.google.com/private/full

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top