Mysql
 sql >> Base de données >  >> RDS >> Mysql

API Google calendrier :Sélectionner/Créer des calendriers ?

Eh bien, comme personne n'a répondu, j'ai décidé de commencer à fouiller dans la documentation non-PHP de l'API Google Calendar, en particulier dans les trucs .NET et juste un peu dans le protocole brut. Et ne le sauriez-vous pas...

Si vous allez à la documentation .NET, elle mentionne des nouveaux sympas fonctionnalités, en particulier comment créer de nouveaux calendriers non principaux pour les utilisateurs authentifiés et comment ajouter des événements aux calendriers non principaux.

Bien sûr, cette documentation n'apparaît nulle part dans le domaine PHP, et il ne semble pas y avoir de corrélation un à un. Pour la création du nouveau calendrier, j'ai d'abord essayé des trucs évidents, puis, en faisant faillite, j'ai essayé quelque chose de pas si évident qui a fonctionné. J'ai pensé que je partagerais au cas où la raison du silence radio serait que personne ne connaissait la réponse mais qu'il aimerait bien la connaître.

Pour créer un nouvel agenda :

Il y a deux clés pour cela :

  1. Vous devez utiliser la même méthode pour ajouter des événements de calendrier, qui est insertEvent()

  2. Vous devez définir l'URL de la publication dans la méthode, qui sinon va à l'URL du flux par défaut.

Cet exemple vérifie si le calendrier de l'application existe déjà et si ce n'est pas le cas, le crée :

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

Et voila. L'objectif suivant est d'insérer des événements dans ce calendrier, et non dans le calendrier par défaut.

Ajout d'événements au calendrier secondaire

La partie facile que vous pouvez probablement deviner est que vous devez définir à nouveau cette URL facultative, comme suit :insertEvent($newEvent, $calURL) , la partie délicate consiste à obtenir l'URL du calendrier. Contrairement au chemin "calendriers détenus", les calendriers spécifiques contiennent non seulement des informations spécifiques à l'utilisateur, mais également une sorte d'identifiant de recherche de hachage.

Voici le 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>";

Merci à tous ceux qui ont lu ma question et y ont réfléchi. Si quelqu'un connaît un moyen de resserrer le code ci-dessus (peut-être que je n'ai pas besoin de deux boucles ?), J'aimerais avoir des commentaires.