Hat hier immer noch keiner eine Idee, woran das liegen könnt ?
Ankündigung
Einklappen
Keine Ankündigung bisher.
Google Calendar - update für "neue" GoogleAPI
Einklappen
X
-
Hallo und vielen Dank an Brick, der mich hier diese Woche nochmal "angestupst" hat...
Wir haben das Thema mit der Zeitverschiebung der Termine kurz besprochen und gelöst.
Ich habe das zum Anlaß genommen und den ersten Post ganz oben entsprechend editiert, um alle Änderungen, die hier von Euch allen diskutiert & umgesetzt wurden, zu konsolidieren.
(Auch wenn ich das ZIP-File nicht anhängen konnte, jetzt sind die PHP-scripte dort zu finden)
Was also jetzt geht (zumindest bei mir):- normale Termine innerhalb eines Tages
- Ganztagestermine
- Multi-Day Termine
- Farbe wird vom Termin im google Calendar übernommen, sofern fort gesetzt. Ist aber in der Beschreibung des Termins @color enhalten, geht das vor.
- Ein Icon kann über eine Zeile in der Beschreibung gesetzt werden mit @icon
- Sommer/Winterzeit wird entsprechend berücksichtigt, sofern (WICHTIG!) die Zeitzone auf dem smartvisu stimmt.
- Der count kann im calenda-widget gesetzt werden und wird ausgewertet
- Der Kalendername (typischerweise "primary") wird auf der Config-seite der smartvisu gesetzt im Feld "URL"
- Wichtig dabei: hier wirklich NUR "primary" eintragen, nicht die ganz URL !!!
Vielen Dank nochmal für's testen, meine Zeit war ja leider nicht soo üppig...
Viele Grüße - Carsten
- Likes 1
Kommentar
-
Herzlichen Dank auch vion mir - es funktioniert!
Leider bekomme ich es nicht hin, andere als meinen persönlichen Kalender abzurufen? Der von meiner Frau und z.B. die deutschen Feiertage (ein dritter der von Google bereit gestellt wird) sind zwar an den Tablets und Telefonen sichtbar, aber scheinbar nicht ohne weiteres über die API. Hat jemand einen Tipp?
Viele Grüße
Robert
Kommentar
-
Herzlichen Dank schon einmal für Eure massive Vorarbeit!
Habe heute mit dem Thema Google Calendar V3 gestartet.
Leider harpert es bei mir am Ende. Das Feedback über die Console fürCode:php -q googleV3.php
Code:[FONT=courier new][{"pos":1,"start":"15-05-29 19:30:00","end":"15-05-29 21:00:00","title":"Test","content":"","where":"","color":"","link":"https:\/\/www.google.com\/calendar\/event?eid=ODVmMmZvdTliamgydWxsYmRpMDl2YTZ1ZnMgcmFkMgcmFk","starttime":"19:30","endtime":"21:00","period":"29.05.15 19:30 - 21:00","weekday":"Freitag","icon":"pages\/base\/pics\/trans.png"}][/FONT]
Code:Calendar read request failed!
Viele Grüße,
Oliver
Kommentar
-
Hallo,
nachdem ich jetzt mit meiner Visu schon ein gutes Stück voran gekommen bin, bin ich auf verschiedene Kalenderplugins gestoßen.
An der Google-Version gefällt mir besonders gut, dass man über die @icon- und @color-Tags gleich das Icon konfigurieren kann - allerdings benutze ich ownCloud in Verbindung mit dem CalDav-Plugin.
Gibt es eine Möglichkeit, den Parsercode für das andere Plugin umzuschreiben? Ich muss zugeben, dass ich nicht gefunden habe, wo tatsächlich dieses Parsing passiert. Ich habe verstanden, dass Google über JSON und CalDav über XML ausgelesen werden und vermute, dass durch die spezielle Codierung das Parsing ein Automatismus im JSON-Code ist -- sicher bin ich mir indes nicht.
Kann mir jemand einen Tip geben, wie ich das ggf. mit überschaubarem Aufwand umbauen kann (oder hat das schon jemand gemacht? :-) )
Gruß Sebastian
Kommentar
-
Hallo,
super Arbeit !!!
Aber irgendwie mache ich etwas falsch beim konfigurieren :-( da bei mir keine Einträge angezeigt werden.
Oder kann man nur den ersten/primary Kalender anzeigen oder ich habe da was falsch konfiguriert.
System: GoogleV3
URL: Müllkalender (Kalendername in Google)
Gruß
Marco
Kommentar
-
Hallo zusammen,
zunächst einmal herzlichen Dank an Carsten für die Anpassung des Moduls an die neue API-Authentifizierung.
In den letzten Tagen habe ich das Modul noch um die unten aufgeführten Möglichkeiten erweitert, die ich euch nicht vorenthalten möchte.
Den bisher vorhandenen Code habe ich weitestgehend gleich belassen.
Caching
Cachen des Authentifizierungs-Tokens, sowie der Colors.
Alle Daten bleiben nur solange im Cache, wie das Token gültig ist. Nach Ablauf des Tokens werden alle Daten aus dem Cache gelöscht und neu geladen.
Um den Cache vorzeitig zu löschen, muss die Datei .../smartVISU/temp/calendar_google.json gelöscht werden.
Anzeige mehrerer Kalender
Sollen Events aus mehreren Kalendern dargestellt werden, so können in der Konfiguration die IDs der Kalender durch Komma getrennt angegeben werden. Die Termine werden dann mit den Farben des jeweiligen Kalenders dargestellt, falls nicht explizit eine Farbe definiert wurde.
Die Standardfarben der verfügbaren Kalender werden gecacht und erst mit dem Ablauf des Tokens neu geladen.
Es können nur Kalender angezeigt werden, auf die der verwendete Google-Account berechtigt wurde.
PHP-Code:<?php
/**
* -----------------------------------------------------------------------------
* @package smartVISU
* @author Martin Gleiß (basic version), Carsten Gotschlich (google API V3), Thorsten Moll (cache, multiple calendars)
* @copyright 2012
* @license GPL [http://www.gnu.de]
* -----------------------------------------------------------------------------
*/
// Note: for debugging purposes you can execute this script from commandline with php -q <scriptname>
require_once '../../../lib/includes.php';
require_once const_path_system.'calendar/calendar.php';
require_once const_path_system.'class_cache.php';
/**
* This class reads a google calendar
*/
class calendar_google extends calendar
{
const CLIENT_ID = ''; // put your clientID here - from Google website
const CLIENT_SECRET = ''; // put your client Secret here - from Google WebSitr
const REFRESH_TOKEN = ''; // Put your google refresh token here - from other PHP script
var $calendar_ids = array();
/**
* initialization of some parameters
*/
public function init($request)
{
parent::init($request);
if ($this->url == '')
$this->url = 'primary';
if ($this->count == 0)
$this->count = 10;
$this->calendar_ids = explode(',' , $this->url);
}
public function run()
{
$cache = new class_cache('calendar_google.json');
// check for cached data
if ($cache->hit(3600)) {
$cache_content = json_decode($cache->read(), ture);
if ($cache_content['accessTokenExpiry'] < time()) {
// if token is not valid anymore reload everything cached
unset($cache_content);
}
}
if (!isset($cache_content['accessToken'])) {
$token_url = 'https://accounts.google.com/o/oauth2/token';
$post_data = array(
'client_secret' => self::CLIENT_SECRET,
'grant_type' => 'refresh_token',
'refresh_token' => self::REFRESH_TOKEN,
'client_id' => self::CLIENT_ID
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $token_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$token_object = json_decode($result);
$cache_content['accessToken'] = $token_object->{'access_token'};
$cache_content['accessTokenExpiry'] = time() + $token_object->{'expires_in'} - 60;
}
//---------------------------------------------------------------------
// so now we have an access-token, let's use it to access the calendar
$context = stream_context_create(array('http' => array('method' => "GET", 'header' => "Authorization: OAuth " . $cache_content['accessToken'])));
// first let's retrieve the colors and cache them
if (!isset($cache_content['calendarColors'])) {
$resturl = 'https://www.googleapis.com/calendar/v3/colors';
$content = @file_get_contents($resturl, false, $context);
if ($content !== false)
{
$result = json_decode($content,true);
$cache_content['calendarColors'] = $result["event"];
//var_dump($cache_content['calendarColors']);
}
}
// then retrieve the users calendars available and cache them, too
// do only if more than one calendar specified
if (count($this->calendar_ids) > 1 && !isset($cache_content['calendarList'])) {
$resturl = 'https://www.googleapis.com/calendar/v3/users/me/calendarList';
$content = @file_get_contents($resturl, false, $context);
if ($content !== false) {
$result = json_decode($content);
$calendarList = array();
foreach ($result->{'items'} as $entry) {
$cal = array();
$cal["description"] = $entry->{'summary'};
$cal["backgroundColor"] = $entry->{'backgroundColor'};
$calendarList[$entry->{'id'}] = $cal;
}
$cache_content['calendarList'] = $calendarList;
//var_dump($cache_content['calendarList']);
}
}
// retrieve the calendar entries from each calendar
$events = array();
foreach ($this->calendar_ids as $calendarid) {
$resturl = 'https://www.googleapis.com/calendar/v3/calendars/'. $calendarid . '/events?maxResults='. $this->count .'&q=-%22%40visu+no%22&singleEvents=true&orderBy=startTime&timeMin='.urlencode(date('c'));
$content = @file_get_contents($resturl, false, $context);
$this->debug($content);
// for debugging purposes only
// echo $content;
// echo "###########";
if ($content !== false)
{
$result = json_decode($content,true);
foreach ($result["items"] as $entry)
{
$startstamp = (string)($entry["start"]["dateTime"]);
$endstamp = (string)($entry["end"]["dateTime"]);
if ($startstamp == '')
$startstamp = (string)($entry["start"]["date"]);
if ($endstamp == '')
$endstamp = (string)($entry["end"]["date"]);
$start = strtotime($startstamp);
$end = strtotime($endstamp);
$color = '';
if (((string)($entry["colorId"]))!='') {
$color=$cache_content['calendarColors'][(string)($entry["colorId"])]['background'];
}
else if (count($this->calendar_ids) > 1) {
$color=$cache_content['calendarList'][$calendarid]['backgroundColor'];
}
$events[$start] = array(
'start' => date('y-m-d', $start).' '.date('H:i:s', $start),
'end' => date('y-m-d', $end).' '.date('H:i:s', $end),
'title' => (string)($entry["summary"]),
'content' => (string)($entry["description"]),
'where' => (string)($entry["location"]),
'color' => $color,
'link' => (string)($entry["htmlLink"])
);
}
}
else
{
$this->error('Calendar: Google', 'Calendar '. $calendarid .' read request failed!');
}
}
// finally re-order the events comming potentially from different calendars
$i = 1;
ksort($events);
foreach($events as $event) {
$event['pos'] = $i++;
$this->data[] = $event;
if ($i > $this->count) break;
}
// at the end write back cache
$cache->write( json_encode($cache_content) );
}
}
// -----------------------------------------------------------------------------
// call the service
// ----------------------------------------------------------------------------
//
$service = new calendar_google(array_merge($_GET, $_POST));
echo $service->json();
?>
Kommentar
-
Hallo
Im Schritt 5 steht "Wichtig: hier „Installierte Anwendung“ auswählen". Dieser Punkt existiert nicht. Soll mann dort "Sonstige* auswählen?
Und: Welcher "Name" ist auf der Config im Feld "URL" einzutippen? Muss das einfach der Name eines der Kalender sein, die man selbst erstellen kann?
Meine Kalender URL ist in der Form
"https://www.google.com/calendar/embed?src=name%40domain.com&ctz=Europe/Zurich", wobei "name%40domain" für meine Mailadresse steht. Ich erhalte keine andere Kalender-URL.
Danke für Eure Hilfe!
Gruss,
Dieter
Kommentar
Kommentar