Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

API de calendário do Google:Selecionando/Criando calendários?


Bem, já que ninguém respondeu, decidi começar a bisbilhotar a documentação não-PHP para a API do Google Calendar, especificamente no material .NET e um pouco no protocolo bruto. E você não saberia...

Se você for para a documentação do .NET, ela menciona um novo legal recursos, especificamente como criar novos calendários não primários para usuários autenticados e como adicionar eventos a calendários não primários.

Claro, esta documentação não aparece em nenhum lugar na área de PHP, e não parece haver uma correlação um-para-um. Para a criação do novo calendário, eu tentei algumas coisas óbvias primeiro, então, tentando quebrar, tentei algo não tão óbvio que funcionou. Eu pensei em compartilhar caso o motivo do silêncio do rádio fosse que ninguém sabia a resposta, mas com certeza gostaria de saber.

Para criar um novo calendário:


Existem duas chaves para isso:

  1. Você deve usar o mesmo método para adicionar eventos de calendário, que é insertEvent()

  2. Você precisa definir o URL do post no método, que, caso contrário, vai para o URL do feed padrão.

Este exemplo verifica se o App Calendar já existe e, caso não exista, o cria:
 //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 aí está. O próximo objetivo é inserir eventos nesse calendário, não no calendário padrão.

Adicionar eventos ao calendário não principal


A parte fácil que você provavelmente pode adivinhar é que você precisa definir esse URL opcional novamente, como:insertEvent($newEvent, $calURL) , a parte complicada é obter o URL do calendário. Ao contrário do caminho de "calendários próprios", calendários específicos não apenas contêm informações específicas do usuário, mas também têm algum tipo de ID de aparência de hash.

Aqui está o 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>";

Obrigado a quem leu minha pergunta e pensou sobre isso. Se alguém souber de uma maneira de apertar o código acima (talvez eu não precise de dois loops?) Eu adoraria receber feedback.