Поэтому я хочу, чтобы наш рабочий календарь автоматически синхронизировался с календарем Google каждого сотрудника, когда диспетчер планирования отправляет / обновляет расписания. Сначала пользователи предпочли бы использовать токен AuthSub, но после этого он должен быть автоматическим. Чтобы избежать конфликтов с другими событиями, которые они запланировали, я хочу создать новый календарь под названием «Рабочее приложение» или что-то еще довольно уникальное. Затем для обновлений он просто удалит любые события из этого диапазона перед созданием новых событий. Поэтому у меня есть некоторые вопросы …
Как выбрать конкретный календарь, который я хочу использовать API? (это все в PHP, кстати, с использованием Zend Framework). Я вижу, где я могу запросить список календарей, но в документации не показано, как добавить к этому конкретному календарю.
Могу ли я создавать календари? Нужно ли мне просто выбирать пользователей, которые выбирают такой календарь? Если это так, есть ли URL-адрес, который я мог бы создать для них, чтобы создать его, например, для добавления событий? (Что-нибудь, чтобы сделать вещи простыми и последовательными, не так ли?)
Я не хочу, чтобы пользователи хранили свои учетные данные, очевидно, но я также не хочу запрашивать доступ для каждого обновления. Нужен ли мне токен OAuth, чтобы иметь постоянный доступ? Я знаю, что токен URL-адреса используется один раз, но могу ли я сохранить токен сеанса и повторно использовать его через неделю?
Есть ли способ, кроме запроса к каждому событию, чтобы избежать дублирования? Я тестировал эту последнюю ночь, и теперь у меня есть 7 случаев из тех же 50 событий. Я не хочу добавлять к серверу время с проверкой перед каждым добавлением.
Наконец, есть способ добавить несколько событий или даже просто нажать файл ics в календаре. Прямо сейчас у меня есть сценарий, выполняющий SQL-запрос, и добавляйте каждое событие, когда оно проходит через результаты. Кажется, что это займет гораздо больше времени, чем ожидалось, поэтому просто создать либо файл ics, либо добавить все события к одному объекту, и добавить их все сразу будет лучше. Благодаря!
Ну, так как никто не ответил, я решил начать разбираться в документации, отличной от PHP для API календаря Google, особенно в материалах .NET и немного в необработанном протоколе. И разве ты не знаешь этого …
Если вы перейдете в документацию .NET, в нем упоминаются интересные новые функции, в частности, как создавать новые непервичные календари для аутентифицированных пользователей и как добавлять события в непервичные календари.
Конечно, эта документация нигде не отображается в области PHP, и, похоже, не существует взаимно однозначной корреляции. Для создания нового календаря я сначала попробовал некоторые очевидные вещи, затем, разобравшись, попробовал что-то не так очевидное, что сработало. Я думал, что поделился бы тем случаем, когда причина для радиомолчания заключалась в том, что никто не знал ответа, но обязательно хотел бы.
Для этого есть два ключа:
Вы должны использовать тот же метод для добавления событий календаря, который является insertEvent()
Вы должны установить 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-адрес календаря. В отличие от пути «принадлежащих календарям», определенные календари не только содержат информацию о пользователе, но и имеют там идентификатор хэш-lookin '.
Вот код:
//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('Ymd\TH:i:sP', strtotime($event['start'])); $eventEnd = date('Ymd\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>";
Спасибо всем, кто прочитал мой вопрос и подумал об этом. Если кто-нибудь знает способ затянуть вышеприведенный код (может быть, мне не нужны две петли?) Мне бы хотелось получить обратную связь.
Я считаю, что Энтони ссылается либо на документы v1, либо на документы v2 на сайте Google Calendar API. Я довольно легко справился с этим в Perl, следуя руководству по протоколу v2 .
Ключ состоит в том, чтобы изменить URL, на который вы отправляете POSTING. Вместо стандартного «/ calendar / feeds / default / private / full» сначала выберите список доступных календарей, затем получите значение content / @ src из нужного календаря и отправьте сообщение на него, например / calendar / feeds / 1234567890abcdefeg% 40group.calendar.google.com / частный / полный