2009-10-07 20 views
11

Así que quiero que nuestro calendario de trabajo se sincronice automáticamente con el Calendario de Google de cada empleado cuando el administrador de programación publique/actualice los horarios. Los usuarios inicialmente optarían por usar el token AuthSub, pero después de eso debería ser automático. Para evitar conflictos con otros eventos que han programado, quiero crear un nuevo calendario llamado "Aplicación de trabajo" u otra cosa bastante única. Luego, para las actualizaciones, simplemente eliminará cualquier evento de ese rango antes de crear los nuevos eventos. Entonces tengo algunas preguntas ...API de calendario de Google: ¿Seleccionar/Crear calendarios?

  1. ¿Cómo selecciono el calendario específico que quiero usar la API? (todo esto en PHP, por cierto, usando Zend Framework). Veo dónde puedo consultar la lista de calendarios, pero la documentación no muestra cómo agregarlo a ese calendario específico.

  2. ¿Puedo crear calendarios? ¿Debo simplemente hacer que los usuarios que opten por crear dicho calendario? Si es así, ¿existe una URL que pueda generar para que creen una como para agregar eventos? (Cualquier cosa para hacer las cosas simples y consistentes, ¿no?)

  3. No quiero que los usuarios guarden sus credenciales, obviamente, pero tampoco quiero solicitar acceso para cada actualización. ¿Necesito un token de OAuth para tener acceso persistente? Sé que el token de URL se usa una sola vez, pero ¿puedo almacenar el token de sesión y reutilizarlo una semana después?

  4. ¿Existe alguna otra manera que no sea consultar cada evento para evitar duplicados? Estuve probando esto anoche y ahora tengo 7 instancias de los mismos 50 eventos. No quiero agregar a la hora del servidor con la comprobación antes de cada adición.

  5. Finalmente, hay una manera de agregar varios eventos, o incluso simplemente insertar el archivo ics en el calendario. En este momento, el script hace una consulta SQL y agrega cada evento a medida que recorre los resultados. Parece tomar mucho más tiempo de lo esperado, por lo que sería mejor construir el archivo ics o agregar todos los eventos a un objeto y agregarlos todos a la vez. Gracias!

+0

Quité la etiqueta google-app-engine, ya que no creo que la estés utilizando en absoluto. –

Respuesta

26

Bueno, ya que nadie respondió, decidí comenzar a hurgar en la documentación que no sea PHP para la API de Google Calendar, específicamente a la materia .NET y sólo un poco en el protocolo prima. Y no sabría usted que ...

Si vas a la documentación de .NET Menciona fresco nuevas características, específicamente cómo crear nuevos calendarios no primarios para los usuarios autenticados y cómo añadir eventos a calendarios no primarios.

Por supuesto, esta documentación no aparece en ninguna parte en el área de PHP, y no parece haber una correlación de uno a uno. Para la creación del nuevo calendario, intenté algunas cosas obvias primero, luego, yendo a la quiebra, intenté algo no tan obvio que funcionó. Pensé que lo haría en caso de que la razón del silencio de la radio fuera que nadie sabía la respuesta, pero seguro que me gustaría.

Para crear un nuevo calendario:

Hay dos claves de este:

  1. Usted tiene que usar el mismo método para añadir eventos de calendario, que es insertEvent()

  2. Tienes para establecer la URL de la publicación en el método, que de lo contrario va a la URL de la fuente predeterminada.

En este ejemplo se comprueba si el calendario de aplicación ya existe y si no, 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); 
} 

Y ahí lo tienen. El siguiente objetivo es insertar eventos en ese calendario, no en el calendario predeterminado.

añadir eventos al calendario no primaria

La parte fácil que es fácil adivinar es que es necesario establecer esa URL opcional de nuevo, como por ejemplo: insertEvent($newEvent, $calURL), la parte difícil es conseguir la URL del calendario. A diferencia de la ruta "calendarios de propiedad", calendarios específicos no sólo tienen info-specifc usuario en ella, tienen algún tipo de hash Lookin' Identificación de allí, también.

Aquí está el código:

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

Gracias a cualquier persona que lea mi pregunta y no hizo ningún pensamiento en él. Si alguien sabe de una forma de ajustar el código anterior (tal vez no necesito dos bucles?) Me encantaría recibir comentarios.

+1

Gracias por la auto-investigación y respuesta. ¿Te importaría darnos un enlace de la documentación de .NET que mencionas? Gracias de nuevo. –

+1

¿Has encontrado cómo seleccionar un calendario específico de no primarios? – glaz666

1

creo que Anthony se refiere a cualquiera de los documentos v1 v2 o los documentos en el sitio de las API de Google Calendar. logré esta bastante facilidad en Perl, siguiendo el v2 protocol guide.

La clave es cambiar la URL envías. En lugar del defecto "/ calendario/feeds/default/privada/lleno", ir a buscar primero la lista de calendarios disponibles, a continuación, obtener el valor de contenido src/@ del calendario que desea, y después de eso, por ejemplo, /calendar/feeds/1234567890abcdefeg%40group.calendar.google.com/private/full

Cuestiones relacionadas