Ankündigung

Einklappen
Keine Ankündigung bisher.

Google Calendar - update für "neue" GoogleAPI

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #76
    Hat hier immer noch keiner eine Idee, woran das liegen könnt ?
    Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

    Kommentar


      #77
      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

      Kommentar


        #78
        Hallo,

        hab das ja auch schon eingespielt und kann bestätigen, dass das so funktioniert...

        Gruß Martin
        Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

        Kommentar


          #79
          Hab es auch soeben eingearbeitet und stelle fest: "Es funktioniert"

          :-)

          Vielen Dank nochmal

          Kommentar


            #80
            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


              #81
              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ür
              Code:
              php -q googleV3.php
              ist meiner Einschätzung nach plausibel:

              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]
              Allerdings gibt mir SmartVisu nach Auswahl der "googleV3" nur eine Fehlermeldung:
              Code:
              Calendar read request failed!
              Hat jemand eine Idee?

              Viele Grüße,
              Oliver

              Kommentar


                #82
                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


                  #83
                  Hallo Carsten,

                  besten Dank für die super Umsetzung und die genaue Beschreibung, Goggle Kalender funktioniert wieder, echt TOLL!!!

                  Gruß
                  Georg

                  Kommentar


                    #84
                    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


                      #85
                      Hi,

                      ok habe es hin bekommen, musste nur die KalenderID in die URL einfügen danach ging es.

                      Gruß

                      Marco

                      Kommentar


                        #86
                        Hallo, sehe ich es recht, dass nur einer der Kalender eines Accounts unterstützt wird?

                        Kommentar


                          #87
                          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($chCURLOPT_URL$token_url);
                                      
                          curl_setopt($chCURLOPT_POST1);
                                      
                          curl_setopt($chCURLOPT_POSTFIELDS$post_data);
                                      
                          curl_setopt($chCURLOPT_RETURNTRANSFERtrue);

                                      
                          $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($resturlfalse$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) > && !isset($cache_content['calendarList'])) {
                                      
                          $resturl 'https://www.googleapis.com/calendar/v3/users/me/calendarList';
                                      
                          $content = @file_get_contents($resturlfalse$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($resturlfalse$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->writejson_encode($cache_content) );
                              }
                          }


                          // -----------------------------------------------------------------------------
                          // call the service
                          // ----------------------------------------------------------------------------

                          //

                          $service = new calendar_google(array_merge($_GET$_POST));
                          echo 
                          $service->json();
                          ?>

                          Kommentar


                            #88
                            Hallo CodeRed,

                            super, ganz herzlichen Dank dafür ! Gerade das Caching hatte mir auch noch gefehlt.
                            Bin grad im Urlaub und kann nicht testen, freu mich aber schon darauf !!

                            Viele Grüße - Carsten

                            Kommentar


                              #89
                              Top, danke.
                              Spricht etwas dagegen, das ins Repository zu über nehmen?

                              Kommentar


                                #90
                                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

                                Lädt...
                                X