2016-03-30 16 views
0

Ich arbeite an einem Skript, um eine Veranstaltung aus Google Kalender zu ziehen und auf eine Website zu stellen. Ziel ist es, die Öffnungszeiten meines Arbeitgebers (einer Universitätsbibliothek) auf unserer Website zu setzen. Grundsätzlich erstellen wir Ereignisse in Google Kalender mit den Betriebsstunden in der Zusammenfassung. Mein Ziel ist es, die relevanten Informationen programmatisch aus dem Kalender zu ziehen und in ein div-Tag auf unserer Homepage einzufügen.Google Kalender-API gibt keine neu erstellten Ereignisse zurück

Es war nicht schwer, das grundlegende PHP-Beispiel von Google zu modifizieren, um die erforderlichen Informationen zu erhalten. Leider hat der Controller-Code das Abrufen neu erstellter Ereignisse gestoppt. Es ist kein Berechtigungsproblem, da ich der Besitzer des Kalenders bin. Und bis zum gestrigen Nachmittag konnte ich neue Ereignisse erstellen und das Skript in meinem Browser ausdrucken lassen. Hier ist mein Code:

<?php 
require __DIR__ . '/vendor/autoload.php'; 

define('APPLICATION_NAME', 'Library Hours Script'); 
define('CREDENTIALS_PATH', '~/path-to-credentials'); 
define('CLIENT_SECRET_PATH', __DIR__ . '/private key file'); 
// If modifying these scopes, delete your previously saved credentials 
// at ~/.credentials/calendar-php-quickstart.json 
define('SCOPES', implode(' ', array(
    Google_Service_Calendar::CALENDAR_READONLY) 
)); 

/** 
* Returns an authorized API client. 
* @return Google_Client the authorized client object 
*/ 
$client_email = '[email protected]'; 
$private_key = file_get_contents('/path-to-private-key'); 
$credentials = new Google_Auth_AssertionCredentials(
    $client_email, 
    SCOPES, 
    $private_key 
); 

// Get the API client and construct the service object. 
$client = new Google_Client(); 
$client->setAssertionCredentials($credentials); 
if ($client->getAuth()->isAccessTokenExpired()) { 
    $client->getAuth()->refreshTokenWithAssertion(); 
} 
$service = new Google_Service_Calendar($client); 

// Get the calendar ID. The script currently uses the "Regular Hours" calendar. 
$calendarId = '[email protected]'; 
$optParams = array(
    'maxResults' => 1, 
    'singleEvents' => TRUE, 
    'timeMin' => date('c'), 
); 
$results = $service->events->listEvents($calendarId, $optParams); 

if (count($results->getItems()) == 0) { 
    print "<a href='http://www.deltastate.edu/academics/libraries/libraries-hours-of-operation/' target='_blank'>Click here for Library hours</a>.\n"; 
} else { 
    foreach ($results->getItems() as $event) { 
     $opHours = $event->getSummary(); 
     $start = $event->start->dateTime; 

     if (empty($start)) { 
     $start = $event->start->date; 
     } 

    print($opHours . " " . $start . " " . date('c')); 
    } 
} 

Wesentlichen über den Code macht eine Anfrage an die Kalender-API für eine Liste von Ereignissen mit der maximalen Anzahl der Ergebnisse 1 ist, durch das aktuelle Datum gefiltert. Dann druckt das Startdatum und die Zusammenfassung auf dem Bildschirm.

Der API-Explorer gibt die gleichen Ergebnisse zurück wie bei der Ausführung des Skripts auf einem Webserver. Es zeigt nur Ereignisse in der Zukunft, die vor einiger Zeit erstellt wurden. Die Ereignisse, die ich gestern und heute für diese Woche erstellt habe, werden nicht zurückgegeben. Das Problem scheint nicht sehr verbreitet zu sein, aber niemand, der es gemeldet hat, hat eine Lösung gefunden. Jede Hilfe würde sehr geschätzt werden.

Antwort

0

Ich denke, es ist in pagination Problem bei der Einstellung der maxResult Parameter.

Laut dem Dokument. Sie können die maximale Anzahl der Ressourcen steuern, die der Server in der Antwort auf eine Listenanforderung zurückgibt, indem Sie das Feld maxResults festlegen. Darüber hinaus gibt es für einige Sammlungen (wie z. B. Ereignisse) eine feste Grenze für die Anzahl der abgerufenen Einträge, die der Server niemals überschreiten wird. Wenn die Gesamtzahl der Ereignisse dieses Maximum überschreitet, gibt der Server eine Seite mit Ergebnissen zurück.

Unvollständige Ergebnisse können von einem nicht leeren Feld nextPageToken im Ergebnis erkannt werden. Um die nächste Seite abzurufen, führen Sie die gleiche Anfrage wie zuvor aus und hängen Sie ein Feld mit dem Wert nextPageToken von der vorherigen Seite an. Eine neue nextPageToken wird auf den folgenden Seiten bereitgestellt, bis alle Ergebnisse abgerufen sind.

prüfen diese SO question, wie die verwenden pageToken.

0

es heraus! Das Problem betraf die Paginierung, aber nicht in der erwarteten Weise. Eine der Änderungen, die ich am Beispielskript von Google vorgenommen habe, bestand darin, 'orderBy' aus dem optParams-Array zu entfernen, da nur ein einzelnes Ereignis zurückgegeben wurde. In der Tat hat das Skript es getan. Die Seite mit den Ergebnissen wurde jedoch immer noch in einer bestimmten Reihenfolge ausgegeben, vermutlich mit dem Datum, an dem das oberste Ergebnis gedruckt wurde. Ereignisse, die kürzlich dem Kalender hinzugefügt wurden, wurden am Ende der Ereignisliste vergraben und nicht auf dem Bildschirm ausgegeben. Ich habe den Schlüssel wieder in so das Array sieht wie folgt aus:

$optParams = array(
    'maxResults' => 5, 
    'orderBy' => 'startTime', 
    'singleEvents' => TRUE, 
    'timeMin' => date('c'), 
); 

nun das Skript gibt das Datum ich mag es. Wenn mehrere Ergebnisse zurückgegeben werden, sind sie jetzt nach Startdatum sortiert. Danke, dass Sie mich in die richtige Richtung weisen.