Mysql
 sql >> Database >  >> RDS >> Mysql

API del calendario di Google:selezione/creazione di calendari?

Bene, poiché nessuno ha risposto, ho deciso di iniziare a dare un'occhiata alla documentazione non PHP per l'API di Google Calendar, in particolare al materiale .NET e solo un po' nel protocollo grezzo. E tu non lo sapresti...

Se vai alla documentazione di .NET, viene menzionato il fantastico nuovo funzionalità, in particolare come creare nuovi calendari non primari per utenti autenticati e come aggiungere eventi a calendari non primari.

Naturalmente, 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 in rovina, ho provato qualcosa di non così ovvio che funzionava. Ho pensato di condividere nel caso in cui il motivo del silenzio radiofonico fosse che nessuno conosceva la risposta, ma sicuramente vorrebbe.

Per creare un nuovo calendario:

Ci sono due chiavi per questo:

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

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

Questo esempio verifica se l'App Calendar esiste già e, in caso contrario, 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. L'obiettivo successivo è inserire eventi in quel calendario, non nel calendario predefinito.

Aggiunta di eventi al calendario non principale

La parte facile che probabilmente puoi indovinare è che devi impostare di nuovo quell'URL opzionale, in questo modo: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 per l'utente, ma contengono anche una sorta di ID hash.

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 chiunque abbia letto la mia domanda e ci abbia pensato. Se qualcuno conosce un modo per rafforzare il codice sopra (forse non ho bisogno di due loop?) Mi piacerebbe ricevere un feedback.