2009-10-07 1 views
11

Ich möchte, dass unser Arbeitskalender automatisch mit dem Google-Kalender jedes Mitarbeiters synchronisiert wird, wenn der Terminplaner die Zeitpläne posten/aktualisieren soll. Benutzer würden sich zunächst mit dem AuthSub-Token anmelden, danach sollte es automatisch sein. Um Konflikte mit anderen geplanten Ereignissen zu vermeiden, möchte ich einen neuen Kalender erstellen, der "Work App" oder etwas anderes genannt wird. Bei Aktualisierungen werden dann einfach alle Ereignisse aus diesem Bereich gelöscht, bevor die neuen Ereignisse erstellt werden. So habe ich einige Fragen ...Google Kalender-API: Auswählen/Erstellen von Kalendern?

  1. Wie wähle ich den bestimmten Kalender, den ich mit der API möchte? (Dies alles übrigens in PHP mit dem Zend Framework). Ich sehe, wo ich nach der Liste der Kalender fragen kann, aber die Dokumentation zeigt nicht, wie man zu diesem bestimmten Kalender hinzufügt.

  2. Kann ich Kalender erstellen? Müssen die Benutzer, die sich anmelden, einfach einen solchen Kalender erstellen? Wenn ja, gibt es eine URL, die ich erzeugen könnte, um eine zu erstellen, wie es für das Hinzufügen von Ereignissen ist? (Alles, um Dinge einfach und konsistent zu machen, oder?)

  3. Ich möchte nicht, dass Benutzer ihre Anmeldeinformationen speichern, natürlich, aber ich möchte auch keinen Zugriff für jedes Update anfordern. Benötige ich ein OAuth-Token, um dauerhaften Zugriff zu haben? Ich weiß, dass das URL-Token einmal verwendet wird, aber kann ich das Sitzungstoken speichern und es eine Woche später wiederverwenden?

  4. Gibt es eine andere Möglichkeit, als jedes Ereignis abzufragen, um Duplikate zu vermeiden? Ich habe diese letzte Nacht getestet und ich habe jetzt 7 Instanzen der gleichen 50 Ereignisse. Ich möchte die Serverzeit nicht durch Überprüfung vor jedem Hinzufügen erhöhen.

  5. Schließlich gibt es eine Möglichkeit, mehrere Ereignisse hinzuzufügen, oder einfach die ics-Datei in den Kalender zu schieben. Im Moment habe ich das Skript eine SQL-Abfrage durchführen und jedes Ereignis hinzufügen, während es die Ergebnisse durchläuft. Es scheint viel länger als erwartet zu dauern, also wäre es einfacher, entweder die ics-Datei zu erstellen oder alle Ereignisse zu einem Objekt hinzuzufügen und sie alle auf einmal hinzuzufügen. Danke!

+0

Ich habe das Google-App-Engine-Tag entfernt, da ich glaube, dass Sie es überhaupt nicht verwenden. –

Antwort

26

Nun, da niemand antwortete, habe ich beschlossen, an der nicht-PHP-Dokumentation für den Google Kalender-API, die speziell auf den .NET-Sachen und nur ein bisschen im rohen Protokoll Stochern zu starten. Und würden Sie nicht wissen, dass es ...

Wenn Sie die .NET-Dokumentation gehen es cool neue Features erwähnt, wie speziell neue nicht-primäre Kalender für authentifizierte Benutzer erstellen und wie Ereignisse in der Nicht-primäre Kalender.

Natürlich zeigt sich diese Dokumentation nirgendwo im PHP-Bereich, und es scheint keine Eins-zu-eins-Korrelation zu geben. Für die Erstellung des neuen Kalenders habe ich zuerst ein paar offensichtliche Dinge ausprobiert, dann ging ich auf Pleite, versuchte etwas nicht so Offensichtliches, das funktionierte. Ich dachte, ich würde teilen, für den Fall, dass der Grund für die Funkstille war, dass niemand die Antwort wusste, aber sicher möchte.

Um einen neuen Kalender zu erstellen:

Es gibt zwei Schlüssel dazu:

  1. Sie haben die gleiche Methode zu verwenden, Kalenderereignisse für das Hinzufügen, das ist insertEvent()

  2. Sie haben Legen Sie die Post-URL in der Methode fest, die andernfalls auf die Standard-Feed-URL verweist.

Dieses Beispiel überprüft, ob die App Kalender bereits zu sehen, existiert und wenn nicht, es schafft:

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

Und dort haben Sie es. Das nächste Ziel besteht darin, Ereignisse in diesen Kalender einzufügen, nicht in den Standardkalender.

Hinzufügen von Ereignissen zu nicht-primären Kalender

Der einfache Teil, die Sie wahrscheinlich erraten kann, ist, dass Sie noch einmal, dass die optionale URL festlegen müssen, wie solche: insertEvent($newEvent, $calURL), der schwierige Teil ist die URL der Kalender zu bekommen. Im Gegensatz zum Pfad "Eigene Kalender" haben bestimmte Kalender nicht nur benutzerspezifische Informationen, sondern auch eine Art Hash-ID.

Hier ist der Code:

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

Dank an alle, die meine Frage gelesen und habe auf sie jedes Denken. Wenn jemand einen Weg kennt, den obigen Code zu verschärfen (vielleicht brauche ich nicht zwei Schleifen?), Würde ich gerne Feedback bekommen.

+1

Danke für die Selbsterforschung und Antwort. Würde es Ihnen etwas ausmachen, uns einen Link zu der von Ihnen erwähnten .NET-Dokumentation zu geben? Danke noch einmal. –

+1

Haben Sie gefunden, wie man einen bestimmten Kalender aus Nicht-Primärfarben auswählt? – glaz666

1

Ich glaube, Anthony bezieht sich entweder auf die v1-Dokumentation oder die v2-Dokumentation auf der Google Calendar APIs-Website. Ich schaffte das ziemlich leicht in Perl, indem ich dem v2 protocol guide folge.

Der Schlüssel ist, die URL zu ändern, an die Sie POST senden. Wählen Sie anstelle des Standards "/ calendar/feeds/default/private/full" zuerst die Liste der verfügbaren Kalender aus, und rufen Sie dann den Inhalt/@ src-Wert aus dem gewünschten Kalender ab und senden Sie diesen z. /calendar/feeds/1234567890abcdefeg%40group.calendar.google.com/private/full