API календаря Google: выбор / создание календарей? - PullRequest
11 голосов
/ 08 октября 2009

Поэтому я хочу, чтобы наш рабочий календарь автоматически синхронизировался с Календарем Google каждого сотрудника, когда менеджер по расписанию публикует / обновляет расписания. Сначала пользователи выбирают токен AuthSub, но после этого он должен быть автоматическим. Чтобы избежать конфликтов с другими запланированными событиями, я хочу создать новый календарь под названием «Рабочее приложение» или что-то еще достаточно уникальное. Затем для обновлений он просто удалит любые события из этого диапазона перед созданием новых событий. Итак, у меня есть несколько вопросов ...

  1. Как выбрать нужный календарь с помощью API? (это все в PHP, кстати, используя Zend Framework). Я вижу, где можно запросить список календарей, но в документации не показано, как добавить этот календарь.

  2. Могу ли я создавать календари? Нужно ли просто, чтобы пользователи, которые решили создать такой календарь? Если так, есть ли URL, который я мог бы сгенерировать, чтобы он создал такой же, как для добавления событий? (Что-нибудь, чтобы сделать вещи простыми и последовательными, верно?)

  3. Я не хочу, чтобы пользователи хранили свои учетные данные, очевидно, но я также не хочу запрашивать доступ для каждого обновления. Нужен ли токен OAuth для постоянного доступа? Я знаю, что URL-токен используется один раз, но могу ли я сохранить сеансовый токен и повторно использовать его через неделю?

  4. Есть ли способ, кроме запросов для каждого события, чтобы избежать дубликатов? Я тестировал это прошлой ночью, и теперь у меня есть 7 экземпляров тех же 50 событий. Я не хочу добавлять на сервер время с проверкой перед каждым добавлением.

  5. Наконец, есть способ добавить несколько событий или даже просто вставить файл ics в календарь. Прямо сейчас у меня есть скрипт, который выполняет SQL-запрос и добавляет каждое событие, поскольку оно просматривает результаты. Похоже, это займет гораздо больше времени, чем ожидалось, поэтому было бы лучше создать файл ics или добавить все события в один объект и добавить их все сразу. Спасибо!

Ответы [ 2 ]

26 голосов
/ 10 октября 2009

Ну, так как никто не ответил, я решил начать изучать не-PHP документацию по API Календаря Google, в частности, .NET, и немного по сырому протоколу. И разве ты не знаешь это ...

Если вы переходите к документации .NET, там упоминаются интересные новые функции, в частности, как создавать новые неосновные календари для аутентифицированных пользователей и как добавлять события в неосновные календари.

Конечно, эта документация нигде не обнаруживается в области PHP, и, похоже, нет однозначной корреляции. Для создания нового календаря я сначала попробовал некоторые очевидные вещи, а затем, разорившись, попробовал что-то не столь очевидное, что сработало. Я думал, что поделюсь, если причина радиомолчания была в том, что никто не знал ответа, но наверняка хотел бы.

Чтобы создать новый календарь:

Для этого есть два ключа:

  1. Вы должны использовать тот же метод для добавления событий календаря, который является insertEvent()

  2. Вы должны установить URL-адрес публикации в методе, который в противном случае переходит к URL-адресу канала по умолчанию.

В этом примере проверяется, существует ли уже календарь приложений, и, если нет, создается его:

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

И вот оно у вас есть. Следующая цель - вставить события в этот календарь, а не в календарь по умолчанию.

Добавление событий в неосновной календарь

Самая простая часть, которую вы, вероятно, можете догадаться, заключается в том, что вам нужно снова установить этот необязательный URL-адрес, например: insertEvent($newEvent, $calURL), сложная часть заключается в получении URL-адреса календаря. В отличие от пути «собственные календари», в определенных календарях есть не только информация, определяемая пользователем, но и некоторый идентификатор хеш-поиска.

Вот код:

 //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>";

Спасибо всем, кто прочитал мой вопрос и задумался над ним. Если кто-нибудь знает способ ужесточить вышеприведенный код (может быть, мне не нужны две петли?), Я хотел бы получить обратную связь.

1 голос
/ 28 июня 2010

Я полагаю, что Энтони имеет в виду либо документы v1, либо документы v2 на сайте API Календаря Google. Мне это довольно легко удалось в Perl, следуя руководству по протоколу v2 .

Ключ в том, чтобы изменить URL-адрес, на который вы размещаете. Вместо значения по умолчанию "/ calendar / feeds / default / private / full" сначала выберите список доступных календарей, затем получите значение content / @ src из нужного календаря и опубликуйте его, например /calendar/feeds/1234567890abcdefeg%40group.calendar.google.com/private/full

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...