sql >> Base de Datos >  >> RDS >> Mysql

API de calendario de Google:¿seleccionar/crear calendarios?

Bueno, dado que nadie respondió, decidí comenzar a hurgar en la documentación que no es de PHP para la API de Google Calendar, específicamente en las cosas de .NET y solo un poco en el protocolo sin formato. Y no lo sabrías...

Si va a la documentación de .NET, menciona nuevo genial características, específicamente cómo crear nuevos calendarios no principales para usuarios autenticados y cómo agregar eventos a calendarios no principales.

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

Para crear un nuevo calendario:

Hay dos claves para esto:

  1. Debe usar el mismo método para agregar eventos de calendario, que es insertEvent()

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

Este ejemplo verifica si el calendario de la 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 tienes. El siguiente objetivo es insertar eventos en ese calendario, no en el calendario predeterminado.

Agregar eventos al calendario no principal

La parte fácil que probablemente puedas adivinar es que necesitas establecer esa URL opcional nuevamente, así:insertEvent($newEvent, $calURL) , la parte complicada es obtener la URL del calendario. A diferencia de la ruta de "calendarios propios", los calendarios específicos no solo tienen información específica del usuario, sino que también tienen algún tipo de ID que parece un hash.

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 cualquiera que leyó mi pregunta y pensó en ella. Si alguien conoce una forma de ajustar el código anterior (¿quizás no necesito dos bucles?), Me encantaría recibir comentarios.