Google Calendar API PHP列表无法检索所有事件

时间:2012-10-25 10:03:43

标签: php api google-api google-calendar-api

我正在尝试使用Google_CalendarService检索所有事件。到目前为止,我正在使用recuring事件检索所有内容,但有些事件没有显示出来。

示例:我有22-okt,23-okt和24-okt的事件。它们都是正常事件,但我得到的唯一事件是22和23. 24没有显示,但它确实存在于我的日历中!

[更新]发现另一个问题!每次我通过我的应用程序编辑现有事件时,事件都会消失,但确实存在于日历中!

以下是我获取数据的代码:

API设置:

function calSettings(){

    $client = new Google_Client();

    $cal = new Google_CalendarService($client);

    $client->setAccessType('offline');

    if (isset($_GET['code'])) {

        $client->authenticate($_GET['code']);

        $_SESSION['token'] = $client->getAccessToken();

        header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);

    }


    if (isset($_SESSION['token'])) {


        $client->setAccessToken($_SESSION['token']);


        $sessionToken = json_decode($_SESSION['token']);


        $this->Cookie->write('token', $sessionToken->refresh_token, false, '1 month');
    }


    $cookie = $this->Cookie->read('token');

    if(!empty($cookie)){
        $client->refreshToken($this->Cookie->read('token'));
    }


    $serviceArr = array('client' => $client, 'service' => $cal);

    return $serviceArr;
}

获取活动:

public function initCalendar($ownerCalendarId = null, $eventID = null){

    $serviceArr = $this->calSettings();
    $client = $serviceArr['client'];
    $cal = $serviceArr['service'];
    $wandaCalendarId = 'gmail@gmail.com';

    if ($client->getAccessToken()) {
        /************* Code entry *************/
        if($eventID != null){
            $events = $cal->events->get($ownerCalendarId, $eventID);
        }else{
            $ownerEvents = $cal->events->listEvents($ownerCalendarId);

            if($ownerCalendarId != $wandaCalendarId){
                $wandaEvents = $cal->events->listEvents($wandaCalendarId);
                $events = array('owner' => $ownerEvents, 'wanda' => $wandaEvents);
            }else{
                $events = array('owner' => $ownerEvents, 'wanda' => '');
            }
        }

        return $events;

    }else{
        /************* Not connected to google calendar code *************/
        $authUrl = $client->createAuthUrl();

        $returnArr = array('status' => 'false', 'message' => "<a class='login' href='$authUrl'>Connect Me!</a>");

        return $returnArr;
    }
}

所以使用这段代码,我得到了大部分事件,为什么不出现其他事件?有没有人之前有这个问题?

4 个答案:

答案 0 :(得分:10)

好的,终于找到了如何获得所有活动!

有趣的是,你可以获得所有活动,但是分批进行250次活动。如果您有超过250个事件,您将在JSON响应中获得一个页面令牌。使用页面令牌获取下一批事件!

关于编辑部分?我注意到,当您编辑事件时,事件将被抛出到事件列表的底部。因此,您获得的事件按上次编辑排序。

为了避免您不需要或保持简单的数据,您可以使用timeMin和timeMax过滤事件。根据您的操作,您可以动态设置此项以更改请求查询。

以下是我使用页面令牌获取所需事件的版本:

$minCheck = date(DATE_ATOM, mktime(0, 0, 0, 1, 1, date("Y") -1));
$maxCheck = date(DATE_ATOM, mktime(0, 0, 0, 12, 31, date("Y") +1));

do{
if(isset($result['nextPageToken'])){
   $result= $cal->events->listEvents($calendarId, array('singleEvents' => 'true', 'pageToken' => $result['nextPageToken'], 'timeMin' => $minCheck, 'timeMax' => $maxCheck));
}else{
   $result= $cal->events->listEvents($calendarId, array('singleEvents' => 'true', 'timeMin' => $minCheck, 'timeMax' => $maxCheck));
}
array_push($totalResult, $result['items']);
}while(isset($result['nextPageToken']) && !empty($result['nextPageToken']));

答案 1 :(得分:2)

250结果是默认值。使用可选的查询参数“maxResults”(参见Events: list

,最多可以增加2500个结果

答案 2 :(得分:0)

您可以使用while循环:

while(true) {
  foreach ($events->getItems() as $event) {
    echo $event->getSummary();
  }
  $pageToken = $events->getNextPageToken();
  if ($pageToken) {
    $optParams = array('pageToken' => $pageToken);
    $events = $service->events->listEvents('primary', $optParams);
  } else {
    break;
  }
}

如果需要,还可以添加一个maxResults并将其设置为最大值2500

$optParams = array('pageToken' => $pageToken, 'maxResults' => 2500);

答案 3 :(得分:0)

@TheYuwana感谢您的评论。

我要注意的一件小事:如果您有private Single<...> httpRequest() 那么useBatch=>true将返回准备在$cal->events->listEvents($ownerCalendarId)中执行的请求

因此,您需要先执行$ownerEvents,然后再进行batch->add($ownerEvents)