Pergunta

Então, eu quero que nosso calendário de trabalho sincronize automaticamente com o calendário do Google de cada funcionário quando o gerente de agendamento postar/atualizar os horários. Inicialmente, os usuários optariam por usar o token do AuthSub, mas depois isso deve ser automático. Para evitar conflitos com outros eventos que eles agendaram, quero criar um novo calendário chamado "Work App" ou algo bastante único. Em seguida, para atualizações, ele simplesmente excluiria quaisquer eventos desse intervalo antes de criar os novos eventos. Então eu tenho algumas perguntas ...

  1. Como seleciono o calendário específico que eu quero usar a API? (tudo isso em PHP, a propósito, usando a estrutura Zend). Vejo onde posso consultar a lista de calendários, mas a documentação não mostra como adicionar a esse calendário específico.

  2. Posso criar calendários? Preciso ter apenas os usuários que optam por criar esse calendário? Nesse caso, existe um URL que eu poderia gerar para que eles criem um como existe para adicionar eventos? (Qualquer coisa para tornar as coisas simples e consistentes, certo?)

  3. Não quero que os usuários armazenem suas credenciais, obviamente, mas também não quero solicitar acesso a cada atualização. Preciso de um token OAuth para ter acesso persistente? Eu sei que o token URL é um uso único, mas posso armazenar token de sessão e reutilizá -lo uma semana depois?

  4. Existe uma maneira além de consultar para cada evento para evitar duplicatas? Eu estava testando isso ontem à noite e agora tenho 7 instâncias dos mesmos 50 eventos. Não quero adicionar ao horário do servidor com a verificação antes de cada adição.

  5. Por fim, existe uma maneira de adicionar vários eventos, ou mesmo para simplesmente empurrar o arquivo ICS para o calendário. No momento, tenho o script uma consulta SQL e adicione cada evento à medida que ele percorre os resultados. Parece demorar muito mais do que o esperado, portanto, basta construir o arquivo do ICS ou adicionar todos os eventos a um objeto e adicioná -los de uma só vez seria melhor. Obrigado!

Foi útil?

Solução

Bem, desde que ninguém respondeu, decidi começar a cutucar a documentação não php para a API do Google Calendar, especificamente no material .NET e apenas um pouco no Protocolo Raw. E você não saberia ...

Se você for para a documentação .NET, ele menciona legal novo 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.

Obviamente, esta documentação não aparece na área de PHP e não parece haver uma correlação individual. Para a criação do novo calendário, tentei algumas coisas óbvias primeiro e depois ir à Break, tentei algo não tão obviz 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.

Para criar um novo calendário:

Existem duas chaves para isso:

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

  2. Você deve definir a URL post no método, que de outra forma vai para o URL de alimentação padrão.

Este exemplo verifica se o calendário do aplicativo já existe e, se nã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.

Adicionando eventos ao calendário não primário

A parte mais fácil que você provavelmente pode adivinhar é que precisa definir esse URL opcional novamente, assim: insertEvent($newEvent, $calURL), a parte complicada é obter o URL do calendário. Ao contrário do caminho dos "calendários de propriedade", os calendários específicos não apenas têm informações de especificação do usuário, mas também têm algum tipo de ID de quem gosta de hash lá.

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 nisso. Se alguém souber de uma maneira de apertar o código acima (talvez eu não precise de dois loops?) Eu adoraria obter feedback.

Outras dicas

Acredito que Anthony está se referindo aos documentos V1 ou aos documentos V2 no site APIs do Google Calendar. Eu consegui isso facilmente em Perl, seguindo o Guia do protocolo V2.

A chave é alterar o URL para o qual você está postando. Em vez do padrão "/calendário/feeds/default/private/completo", primeiro busque a lista de calendários disponíveis e, em seguida, obtenha o valor conteúdo/@src do calendário que deseja e postar para isso, por exemplo,/calendário/feeds/ 1234567890ABCDefeg%40Group.Calendar.google.com/private/completo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top