Как получить текущее или следующее событие из календаря Google с помощью Google API? - PullRequest
2 голосов
/ 04 мая 2010

Введение

Я пытаюсь заменить сотовый телефон "по вызову", который переносится программистом по вызову в назначенный им день. При возникновении чрезвычайной ситуации служба поддержки звонит на этот мобильный телефон. Сейчас мы планируем перейти на веб-форму, которую служба поддержки будет заполнять в чрезвычайной ситуации. Когда форма отправлена, скрипт будет общаться с календарем Google (используя php api), видеть, кто находится на вызове, и отправлять текстовое сообщение программисту по вызову в это время, предупреждая его / ее о чрезвычайной ситуации. Если в текущий момент никто не разговаривает по телефону, то следующий собеседник получит электронное письмо, чтобы он мог первым делом решить проблему на следующее утро. У нас все это работает, кроме повторяющихся событий.

Игра с одиночными событиями и установка ее в true работали нормально, пока я не решил позволить запросу обрабатывать поиск текущих событий (вместо того, чтобы извлекать кучу событий и проверять время вручную). Например, если кто-то в данный момент находится на вызове, текущее событие с именем этого программиста должно существовать и быть возвращено. Это событие может повторяться или не повторяться в зависимости от того, торговал ли кто-либо в течение нескольких дней. Если в данный момент не запланировано ни одного события, я отправляю сообщение другому по вызову вместо отправки текстового сообщения. В другом разделе я переключаю максимальный старт на 7 дней в будущем.


Код запроса выглядит следующим образом.

$now = date("c");
$gdataCal = new Zend_Gdata_Calendar($client);
$query = $gdataCal->newEventQuery();
$query->setUser('[our_resource_is_here]@resource.calendar.google.com');
$query->setVisibility('private');
$query->setProjection('full');
$query->setOrderby('starttime');
$query->setStartMin($now);
$query->setStartMax($now);
$query->setFutureevents(false);
$query->setSingleevents(true);
$query->setSortorder('a');
$eventFeed = $gdataCal->getCalendarEventFeed($query);
foreach ($eventFeed as $event) {
    foreach ($event->when as $when) {
        echo $when->startTime.'';
        echo $when->endTime.'';
        echo $event->title->text.'';   
    }
}

Шаги приняты

1) Я создаю повторяющееся событие, охватывающее 8-5, без конца периода повторения.
2) Затем я удаляю одно событие (чтобы проверить кого-то в торговые дни) и добавляю другое событие для хихиканья (другое событие не обязательно, но помогает показать проблему).

Информация о данных ниже:
Повторяющееся событие, которое удаляется в диапазоне запросов, называется «Бен», а второе не повторяющееся событие, которое действительно запланировано на этот день, называется «тест». Вывод при возврате заголовка, времени начала и окончания выглядит следующим образом. Помните, что в календаре нет события «Бен», но оно все равно появляется 3 раза, даже с очень строгими установленными временными пределами (см. $ Сейчас в коде).


с $ query-> setSingleevents (false); "

2010-05-03T08:00:00.000-05:00
2010-05-03T17:00:00.000-05:00
Ben
2010-05-03T08:00:00.000-05:00
2010-05-03T17:00:00.000-05:00 
Ben
2010-05-03T08:00:00.000-05:00
2010-05-03T17:00:00.000-05:00
Ben
2010-05-03T13:30:00.000-05:00
2010-05-03T15:00:00.000-05:00
test

с "$ query-> setSingleevents (true);"

2010-05-03T13:30:00.000-05:00
2010-05-03T15:00:00.000-05:00
test

Объяснение результатов

Я действительно хочу, чтобы функция возвращала одно имя кого-либо (т.е. только текущее событие). Если текущее событие не существует, я извлекаю события на следующие 7 дней, чтобы быть уверенным, что уловил выходные и праздничные дни и вернул первое предстоящее событие.

Второй вывод выше (для отдельных событий установлено значение true) выглядит так, как будто он решает проблему, но он решает проблему только при наличии неповторяющегося события. Если я оставляю все повторяющимся, данные не возвращаются, если у меня установлено setSingleevents (true).

У меня есть догадка, что это связано с тем, что я установил минимальное и максимальное время начала в $ сейчас (текущее время), но так как это работает нормально с однократным повторением, я не понимаю, в чем проблема (особенно когда я я пытаюсь рассматривать повторяющиеся события как свои собственные отдельные события.

Опять же, кажется, что все работает нормально, если я не использую повторяющиеся события (по моему мнению, ручное добавление раз в неделю не очень хорошее решение).

-
Спасибо за вашу помощь,
Ben

1 Ответ

0 голосов
/ 20 мая 2010

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

$eventStatusUrl = $event->getEventStatus();
list($trash, $eventStatus) = explode('#', $eventStatusUrl);
if ($eventStatus == 'event.confirmed') {
    return $event->title->text;
}
...