InfoFrame: Digitaler Bilderrahmen (Anzeige von Anrufen, E-Mails, Termine, Wetter...)

Erstmals habe ich mein Plugin umgeschrieben mit der "DoUpdate" Funktion sowie "before_last" und "strrevpos" ergänzt. Die dbconn habe ich um die werte (10) und (100) geändert. Mit der geposteten CalenderPlugin geht's auch nicht. denke ich habe Probleme mit der client-library. Worauf habt ihr verlinkt?
 
Hast Du die Kalender für Deine API-Email-Adresse auch freigegeben?

In meiner config.ini habe ich es so stehen:
Code:
...
google_api_path = "../google-api-php-client"
...

Den Abschnitt für das Calender-Plugin:
Code:
[CalendarPlugin]
project_name = "Infoframe"   [COLOR="#FF0000"][B]<-- Hier Deinen eigenen Projektnamen eingeben[/B][/COLOR]
client_id = "12345678901-tuafke66biv31it6nrpcd4ok7tdbdft4.apps.googleusercontent.com"  [COLOR="#FF0000"][B]<-- Hier Deine eigene Client-ID angeben[/B][/COLOR]
account_name = "12345678901-tuafk336biv31it6nrp1d4ok7tdbdft4@developer.gserviceaccount.com" [COLOR="#FF0000"][B]<-- Und hier Deine API-Mail-Adresse[/B][/COLOR]
key_file = "Infoframe-d47f573dae43.p12" [COLOR="#FF0000"][B]<-- Keyfile habe ich im Hauptverzeichnis gespeichert, auch hier wieder Dein eigenes (Wenn der Webserver öffentlich zugänglich ist, dann nicht unbedingt im Hauptverzeichnis speichern - Sicherheit)[/B][/COLOR]
force_refresh = 1
number_of_days = 10

Beim Download und entpacken heißt das Verzeichnis aber "google-api-php-client-master" oder so ähnlich.

Findest Du irgendetwas im Error Log?

Gruß Daniel
 
Worauf habt ihr verlinkt?
Hallo Thomas,
bei mir ist einfach auf "google-api-php-client" gelinkt. Original heißt der ordner google-api-php-client-master.
brauchen tust du aus dem ordner die autoloader.php und den ordner src. Alles andere hab ich gelöscht. Du kannst auch im browser den ordner test aufrufen und die tests durchlaufen lassen....

php > 5.3.0 ist installiert?

Hallo Google-Calendar-Crew,

Die Hintergrundfarbe (backgroundcolor) stimmt nicht mit der Farbe im Google-Calender überein (wurde auch schon erwähnt). Dies hat natürlich relativ großen Einfluss auf die weitere Verarbeitung in der doOutput-Funktion (Müllabfuhr, etc.). Es scheint auch so, dass eine Anpassung der Farbe im Browser nicht übernommen wird.

Hi Hoobert!
Also bei mir läuft das script ziemlich abgeändert. Ich poste mal mein CalendarPlugin.php als Denkanstoß für die Möglichkeiten mit den Farben und Namen der Kalender:
PHP:
<?php
/***************************************************************************
 * InfoFrame (image generator for digital picture frames)
 * Copyright (C) 2009  Tobias Kolb
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see http://www.gnu.org/licenses/
 ***************************************************************************/


class CalendarPlugin implements IPlugin
{
    private $dbconn = NULL;
    private $config = NULL;
    
    public function __construct($dbconn, $config) {
        $this->dbconn = $dbconn;
        $this->config = $config;
    }

    
    public function doUpdate() {
    	require_once 'google-api-php-client/autoload.php';
    	session_start();
		$client_id = $this->config['client_id'];
		$service_account_name = $this->config['account_name'];

        try {
			$client = new Google_Client();
			$client->setApplicationName($this->config['project_name']);
			$service = new Google_Service_Calendar($client);
        }
        catch (Exception $e) {
            die ('Folgender Fehler trat auf: ' . $e->getMessage());
        }

		if (isset($_SESSION['service_token']))
				$client->setAccessToken($_SESSION['service_token']);
	
		$key = file_get_contents($this->config['key_file']);
	
		$cred = new Google_Auth_AssertionCredentials(
							$service_account_name,
		    				array('https://www.googleapis.com/auth/calendar'),
		    				$key);
		    				
		$client->setAssertionCredentials($cred);
		if ($client->getAuth()->isAccessTokenExpired())
		 		$client->getAuth()->refreshTokenWithAssertion($cred);
	
		$_SESSION['service_token'] = $client->getAccessToken();
	
		//set startDate, endDate, eventParams
	  	$now = new DateTime('NOW');
	 	$clone = clone $now;
	 	$clone = date_modify($clone, '+1 month');
		$startDate = date_format($now, DateTime::W3C);
		$endDate = date_format($clone, DateTime::W3C);
	
		$eventParams = array(
							'timeMin' => $startDate,
							'timeMax' => $endDate,
							'singleEvents' => 'true');
								
		//get Calendar Id´s	
		$calendarList = $service->calendarList->listCalendarList();
	
		// Set begin of querys
		$insertToken = "REPLACE INTO if_system (name, value) VALUES ";
		$insertCalendarData = "INSERT INTO if_calendar (name,color,begin,end,title,location) VALUES ";
		$deleteCalendarData = "DELETE FROM if_calendar WHERE ";
		
	/******************** Update every given time without checking for SyncToken ************************/
		$forceRefresh = $this->config['force_refresh'];
		$updateCalendar = FALSE;
		$query = "SELECT * FROM if_system WHERE name = 'CalendarUpdate'";
	  	$result = mysqli_query($this->dbconn, $query);
		if (mysqli_num_rows($result) > 0) {
			$row = mysqli_fetch_assoc($result);
			if ( ($row['name'] == 'CalendarUpdate') && ((time() - $row['value']) >= ($forceRefresh*3600)) ) {
				$updateCalendar = TRUE;
				$query = "REPLACE INTO if_system (name,value) VALUES ('CalendarUpdate', '".time()."')";
		 		mysqli_query($this->dbconn, $query) or die('CalendarPlugin: '.mysqli_error());					
			}
		}else{
			$updateCalendar = TRUE;
			$query = "INSERT INTO if_system (name,value) VALUES ('CalendarUpdate', '".time()."')";
			mysqli_query($this->dbconn, $query) or die('CalendarPlugin: '.mysqli_error());
		}
	 /*********************************************************************************************************/
	
		$i = 0;
		while(TRUE) {
			
		/***************** Loop through each Calendar, get id, and color **************************/
			foreach ($calendarList->getItems() as $calendarListEntry) {
			  	$calendarID = $calendarListEntry->getID();
			 
			 	/***************** Get SysncToken to skip this calender at next update if nothing has changed **********/ 
			    $events = $service->events->listEvents($calendarID, $eventParams);	    
			    //If the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken
			    try{	
			    	$NextSyncToken = $events->getNextSyncToken();
		        }
		        catch (Exception $e) {
		            if (strripos($e->getMessage(), "410") !== FALSE){
		            	$NextSyncToken = 'FEHLER';
		            }else{
		            	die ('Folgender Fehler trat auf: ' . $e->getMessage());
		            }
		        } 
			    $SyncToken = '';
			   //echo $NextSyncToken.PHP_EOL;
			   	if ($updateCalendar == FALSE) {
					$query = "SELECT value FROM if_system WHERE name = '".$calendarID."'";
					$result = mysqli_query($this->dbconn, $query);
						if (mysqli_num_rows($result) > 0) {
							$row = mysqli_fetch_assoc($result);
						 	$SyncToken = $row['value'];
						}
				}	
				$insertToken .= "('".$calendarID."','".$NextSyncToken."'), ";	
				/***************** SysncToken check done *****************************************************/ 
					
				/**************** if SyncToken changed perform update ******************************/			
			    if ($NextSyncToken != $SyncToken) {
			    	$i++;
			    	$deleteCalendarData .= "name='".$calendarListEntry->getSummary()."' OR ";	    	
					while(TRUE) {
					 	/************************ Get content from each Calendar *****************/
						foreach ($events->getItems() as $event) {
						  	//print_r($event);
					  		if (!empty($event['modelData']['start']['dateTime'])) {
					  			$begin = date_format(date_create($event['modelData']['start']['dateTime']), 'Y-m-d H:i:s');
					  			$end = date_format(date_create($event['modelData']['end']['dateTime']), 'Y-m-d H:i:s');
					  		}else{
					  			$begin = $event['modelData']['start']['date'];
					  			$end = $event['modelData']['end']['date'];
					  		}			  	
					  		$title = $event->getSummary();
					  		$name = $event['modelData']['organizer']['displayName'];
					  		$color = $event->getColorID();	
					 			$insertCalendarData .= "('".$name."','".$color."','".$begin."','".$end."','".$title."',''), ";	
					  }
					  $pageToken = $events->getNextPageToken();
					  if ($pageToken) {
					 			$optParams = array('pageToken' => $pageToken);
					    	$events = $service->events->listEvents($calendarListEntry->getID(), $optParams);
					  	}else{
					    break;
					  	}
					}
				} /********** if SysncToken changed perform update END  **********/
		  	} /*********** Loop through each Calendar, get id, and color END *************************/
		  
		  	$pageToken = $calendarList->getNextPageToken();
		  	if ($pageToken) {
		  		$optParams = array('pageToken' => $pageToken);
		    	$calendarList = $service->calendarList->listCalendarList($optParams);
		  	}else{
		    	break;
		  	}
		}
		
	/***************************** if SyncToken changed perform SQL-statement *********************/
		if ( $i > 0 ) {
			mysqli_query($this->dbconn, $this->before_last('OR', $deleteCalendarData)) or die('CalendarPlugin -> insertCalendarData:  '.mysqli_error());
			mysqli_query($this->dbconn, $this->before_last(',', $insertToken)) or die('CalendarPlugin -> insertToken: '.mysqli_error());
			mysqli_query($this->dbconn, $this->before_last(',', $insertCalendarData)) or die('CalendarPlugin -> insertCalendarData:  '.mysqli_error());
		}
	       		             
    }
    
    public function doOutput($image, $style, $updateData, &$yoffset) {
    	if ($updateData) 
      		$this->doUpdate();

        $query = "SELECT * FROM `if_calendar` 
        								WHERE `end` > NOW() 
        								AND (`begin` <= ADDDATE(NOW(), INTERVAL ".$this->config['number_of_days']." DAY)) 
        						ORDER BY `begin` ASC";
        $result = mysqli_query($this->dbconn, $query);
        if (mysqli_num_rows($result) > 0) {

            // define styles
            $opt_header = array(
                'width' => imagesx($image)-580,
                'line_height' => 18,
                'align' => ALIGN_LEFT
            );
            
            $opt_day = array(
                'width' => imagesx($image)-580,
                'height' => 14,
                'line_height' => 14,
                'align' => ALIGN_LEFT
            );

            $opt_entry = array(
                'width' => imagesx($image)-580,
                'height' => 12,
                'line_height' => 12,
                'align' => ALIGN_LEFT,
                'word_wrap_hyphen' => '...',
                'aggressive_word_wrap' => true,
            );
					$calendarColor = array ('#00008b', '#0000ff', '#48d1cc', '#ff00ff', '#ff4500', 
											'#ffff00', '#ffa500', '#00ffff', '#a9a9a9', '#00008b', '#008000', 'ff0000');
					  // print roundbox
 					 $xleft = 5;
 					 $xend = imagesx($image)-230;
 					 $xoffset = 0;
  		  	 $yoffset_diff = 8;
 					 $yoffset_abstand = 7;
				   $titel_zeilen_hoehe = 14;
 					 $tag_zeilen_hoehe = 4;
 					 $inhalt_zeilen_hoehe = 13;
 				 	 $inhalt_db_zeilen = mysqli_num_rows($result);
      
 					 roundboxtrans_top($image, $xleft, $xend, $yoffset, $yoffset_diff, $yoffset_end, $radius, $titel_zeilen_hoehe);
            // print header
            imagettftextboxopt($image, 18, 0, 40, $yoffset, $style['textcolor'], $style['font'], "Nächste Termine", $opt_header);
            $icon = ImageCreateFromPNG ( 'resources/icons/clock.png' );
            ImageCopy($image, $icon, 10, $yoffset-3, 0, 0, imagesx($icon), imagesy($icon));
            ImageDestroy($icon);
            $yoffset += 26;
            
            // print calendar
            $counter = 0;
            $formatDate = "%d.%m.%Y";
            $formatTime = "%H:%M";
            $today = strftime($formatDate);
            $tomorrow  = strftime($formatDate, strtotime("+1 day", time()));
            $currently_displayed_day = 0;

            while ($row = mysqli_fetch_assoc($result)) {
                $counter++;
                // if end of screen is reached and more than one items left -> cut off and show hint "x more appointments..."
                $rest = (mysqli_num_rows($result) - $counter) + 1;
                if (($yoffset >= (imagesy($image) - 36)) && ($rest > 1)) {
                    $text = "... $rest weitere Termine";
                    roundboxtrans_bottom($image, $xleft, $xend, $yoffset, $yoffset_diff, $yoffset_abstand-3, $yoffset_end, $radius, $bottom_zeilen_hoehe);
                    imagettftextboxopt($image, 14, 0, 24, $yoffset, $style['textcolor'], $style['fontb'], $text, $opt_entry);
                    $yoffset += 20;
                    break;
                }
          					//roundboxtrans_middel($image, $xleft, $xend, $yoffset, $yoffset_abstand, $yoffset_end, $inhalt_zeilen_hoehe4);
                
                // print day name
                $begin_date = strftime($formatDate, strtotime($row['begin']));
                // if begin day is before today set begin to today
                if (strtotime($begin_date) < strtotime($today))
                    $begin_date = $today;
                // now if begin is after $currently_displayed_day update $currently_displayed_day
                if (strtotime($begin_date) > $currently_displayed_day) {
                    // update currently_displayed_day
                    $currently_displayed_day = strtotime($begin_date);
                    // print day name
                    if( $begin_date == $today ) $dayname = "Heute";
                    else if( $begin_date == $tomorrow ) $dayname = "Morgen";
                    else $dayname = strftime("%A, ".$formatDate, strtotime($begin_date));
                    if (isset($last_displayed_day) && ($last_displayed_day != $currently_displayed_day && $breite < 1 && $anzahl_letzter_text < 2) ) {
                    	$breite += 1;
                    	if($xoffset == 0) $xoffset += 77;
			               	$xoffset += 15+strlen($letzter_text)*10;
			               	$yoffset -= 45;
			              }else{
			              	$xoffset = $breite = 0;                  	       					 
				   						roundboxtrans_middel($image, $xleft, $xend, $yoffset, $yoffset_abstand, $yoffset_end, $tag_zeilen_hoehe);
				   					}
                    imagettftextboxopt($image, 14, 0, $xoffset+45, $yoffset-3, $style['textcolor'], $style['fontb'], $dayname, $opt_day);
                    $yoffset += 18;
                }
                
                // build appointment time text
                $end_date = strftime( $formatDate, strtotime($row['end']));
                $begin_time = strftime( $formatTime, strtotime($row['begin']));
                $end_time = strftime( $formatTime, strtotime($row['end']));
                $text = $row['title'];
                //if ($row['location'] != null)
                    //$text = $text . ", " . $row['location'];
                if (($begin_time == "00:00") && ($end_time == "00:00")) {
                    // all day event (substract 1 second to get the real end date at 23:59) 
                    $end_date = strftime( $formatDate, strtotime($row['end'])-1);
                    // if all day event is longer than one day -> print end date
                    if (strtotime($end_date) != $currently_displayed_day)
                        $text = $text." (bis ".$end_date.")";                        
                }else{
                    // normal event with start and end time
                    $text = $text." (".$begin_time." - ";
                    // if event ends not this day -> display end date additionally to time
                    if (strtotime($end_date) != $currently_displayed_day)
                        $text = $text.$end_date.", ";                    
                    $text = $text.$end_time.")";
                }               
               
             if (isset($last_event) && $last_event == $currently_displayed_day && $anzahl_letzter_text < 2) {
             		$anzahl_letzter_text += 1;
             		$xoffset += strlen($letzter_text)*10.8;
               	$yoffset -= 27;
             }elseif ($breite < 1) { 
              	$xoffset = 0;
              	$anzahl_letzter_text = 0;             
              	roundboxtrans_middel($image, $xleft, $xend, $yoffset, $yoffset_abstand, $yoffset_end, $inhalt_zeilen_hoehe);
             }
              	$calenderImage = FALSE;
// ------------------------------------------- Müllabfuhr----------------------------------------                   
                if (($row['name']) == "Nan Di") {
                	if ($row['color'] == 1){
                      $icon = ImageCreateFromPNG ('resources/icons/tonne_blau.png');
                      $calenderImage = TRUE;
                      $xoffset = $xoffset+30;
                      $txoffset = $xoffset+20;
                  }elseif ($row['color'] == 4){
                  		$icon = ImageCreateFromPNG ('resources/icons/schadstoffmobil.png');
                  		$calenderImage = TRUE;
                  		$xoffset = $xoffset+30;
                  		$txoffset = $xoffset+20;
                	}elseif ($row['color'] == 5){
                      $icon = ImageCreateFromPNG ('resources/icons/gelber_sack.png');
                      $calenderImage = TRUE;
                      $xoffset = $xoffset+30;
                      $txoffset = $xoffset+20;                   		                  	
                	}elseif ($row['color'] == 8){
                      $icon = ImageCreateFromPNG ('resources/icons/tonne_schwarz.png');
                      $calenderImage = TRUE;
                      $xoffset = $xoffset+30;
                      $txoffset = $xoffset+20;                                                 
                	}elseif ($row['color'] == 10){
                  		$icon = ImageCreateFromPNG ('resources/icons/tonne_gruen.png');
                  		$calenderImage = TRUE;
                  		$xoffset = $xoffset+30;
                  		$txoffset = $xoffset+20;
                	}             	
  
// ------------------------------------------- Geburtstag ----------------------------------------     
              	}elseif (($row['name']) == "Geburtstage") {
                			$icon = ImageCreateFromPNG ( 'resources/icons/birth.png' );
                			$calenderImage = TRUE;
                			$xoffset = $xoffset+30;
                			$txoffset = $xoffset+20;
              	   
// ------------------------------------------- Namenstag ----------------------------------------     
                
                }elseif (($row['name']) == "Namenstage") {
                		$icon = ImageCreateFromPNG ( 'resources/icons/name.png' );
                			$calenderImage = TRUE;
                			$xoffset = $xoffset+27;
                			$txoffset = $xoffset+23;                		
                } 
                	         	           	
// ------------------------------------------- Standard - Button ----------------------------------------  
            		if ($calenderImage == TRUE) {
            			  ImageCopy($image, $icon, $xoffset, $yoffset+1, 0, 0, imagesx($icon), imagesy($icon));
                		ImageDestroy($icon);
                }else{
                		$xoffset = $xoffset+36;
                		$txoffset = $xoffset+15;
		                // determine button color
		                $colorArray = htmlColorToRgb($calendarColor[$row['color']]);
		                $color = ImageColorAllocate ($image, $colorArray[0], $colorArray[1], $colorArray[2]);
		                // print appointment text and button                            
		                drawGlassButton($image, $color, $xoffset, $yoffset+8);
              	}
                imagettftextboxopt($image, 12, 0, $txoffset, $yoffset, $style['textcolor'], $style['font'], $text, $opt_entry);
                $yoffset += 27; 
								$last_event = $last_displayed_day = $currently_displayed_day;
								$letzter_text = $text;                        
          }
            roundboxtrans_bottom($image, $xleft, $xend, $yoffset, $yoffset_diff, $yoffset_abstand-1, $yoffset_end, $radius, $bottom_zeilen_hoehe);
        		mysqli_free_result($result); 
        		$yoffset += 18;          
        }
    }


	private function before_last ($needle, $inthat) {
        return substr($inthat, 0, $this->strrevpos($inthat, $needle));
 	}
 		  
	private function strrevpos($instr, $needle) {
    	$rev_pos = strpos (strrev($instr), strrev($needle));
    	if ($rev_pos===false) return false;
    	else return strlen($instr) - $rev_pos - strlen($needle);
	}

	private function calenderColorToRgb($olor) {
		
	}   
}
Vorsicht bei Cpoy und Paste: mysqli statt mysql

Struktur von if_calendar:
PHP:
--
-- Datenbank: `infoframe`
--

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `if_calendar`
--

CREATE TABLE IF NOT EXISTS `if_calendar` (
`id` int(11) NOT NULL,
  `name` varchar(50) COLLATE latin1_general_cs NOT NULL,
  `color` int(3) NOT NULL,
  `begin` datetime NOT NULL,
  `end` datetime NOT NULL,
  `title` varchar(255) COLLATE latin1_general_cs NOT NULL,
  `location` varchar(255) COLLATE latin1_general_cs DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=2296 DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs;

--
-- Indizes der exportierten Tabellen
--

--
-- Indizes für die Tabelle `if_calendar`
--
ALTER TABLE `if_calendar`
 ADD PRIMARY KEY (`id`), ADD KEY `begin` (`begin`), ADD KEY `end` (`end`);

ich filtere erst nach dem Namen das Kalenders und dann nach den Farben im Kalender... siehe do Output()

In der Datenbank sieht es dann so aus:
13.PNG
 
Hallo Ihr beiden,

im Errorlog steht nichts, bzw. es wird erst keiner angelegt. Ich muss jetzt weg, sehe aber nach nochmal nach. Glaube das mit dem google-api-php-client-master könnte es sein. das habe ich wahrlich nicht beachtet. Jedoch hätte ich einen Error oder eine "leere / weiße" Seite erwartet.

Ok, ich gabe zu das es eine Kwick änd Dörti copy & paste aktion war. Ich mache es später nochmals in ruhe. Melde mich später nochmal

:)
 
Hallo zusammen

So ich als absoluter Leihe habe es leider auch nicht hinbekommen.Ich habe auf Google alles so gemacht wie spoon3er geschrieben hat Kalender ist auch freigegeben.Dann habe ich dieses Calender Plugin
PHP:
<?php
/***************************************************************************
 * InfoFrame (image generator for digital picture frames)
 * Copyright (C) 2009  Tobias Kolb
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see http://www.gnu.org/licenses/
 ***************************************************************************/


class CalendarPlugin implements IPlugin
{
    private $dbconn = NULL;
    private $config = NULL;
    
    public function __construct($dbconn, $config) {
        $this->dbconn = $dbconn;
        $this->config = $config;
    }
    
    public function doUpdate() {
        
        require_once 'google-api-php-client/autoload.php';
        session_start();
        $client_id = $this->config['client_id'];
        $service_account_name = $this->config['account_name'];

        try {
            $client = new Google_Client();
            $client->setApplicationName($this->config['project_name']);
            $service = new Google_Service_Calendar($client);
        }
        catch (Exception $e) {
            die ('Folgender Fehler trat auf: ' . $e->getMessage());
        }

        if (isset($_SESSION['service_token']))
                $client->setAccessToken($_SESSION['service_token']);
    
        $key = file_get_contents($this->config['key_file']);
    
        $cred = new Google_Auth_AssertionCredentials(
                            $service_account_name,
                            array('https://www.googleapis.com/auth/calendar'),
                            $key);
                            
        $client->setAssertionCredentials($cred);
        if ($client->getAuth()->isAccessTokenExpired())
                 $client->getAuth()->refreshTokenWithAssertion($cred);
    
        $_SESSION['service_token'] = $client->getAccessToken();
    
        //set startDate, endDate, eventParams
      $now = new DateTime('NOW');
         $clone = clone $now;
         $clone = date_modify($clone, '+1 month');
        $startDate = date_format($now, DateTime::W3C);
        $endDate = date_format($clone, DateTime::W3C);
    
        $eventParams = array(
                            'timeMin' => $startDate,
                            'timeMax' => $endDate,
                            'singleEvents' => 'true');
                                
        //get Calendar Id´s    
        $calendarList = $service->calendarList->listCalendarList();
    
        // Set begin of querys
        $insertToken = "REPLACE INTO if_system (name, value) VALUES ";
        $insertCalendarData = "INSERT INTO if_calendar (color,begin,end,title,location) VALUES ";
        $deleteCalendarData = "DELETE FROM if_calendar WHERE ";
        
    /******************** Update every given time without checking for SyncToken ************************/
        $forceRefresh = $this->config['force_refresh'];
        $updateCalendar = FALSE;
        $query = "SELECT * FROM if_system WHERE name = 'CalendarUpdate'";
      $result = mysql_query($query, $this->dbconn);
        if (mysql_num_rows($result) > 0) {
            $row = mysql_fetch_assoc($result);
            if ( ($row['name'] == 'CalendarUpdate') && ((time() - $row['value']) >= ($forceRefresh*3600)) ) {
                $updateCalendar = TRUE;
                $query = "REPLACE INTO if_system (name,value) VALUES ('CalendarUpdate', '".time()."')";
                 mysql_query($query, $this->dbconn) or die('CalendarPlugin: '.mysql_error());                    
            }
        }else{
            $updateCalendar = TRUE;
            $query = "INSERT INTO if_system (name,value) VALUES ('CalendarUpdate', '".time()."')";
            mysql_query($query, $this->dbconn) or die('CalendarPlugin: '.mysql_error());
        }
     /*********************************************************************************************************/
    
        $i = 0;
        while(TRUE) {
            
        /***************** Loop through each Calendar, get id, and color **************************/
            foreach ($calendarList->getItems() as $calendarListEntry) {
                  $calendarID = $calendarListEntry->getID();
                  $color = $calendarListEntry->getBackgroundColor();
             
                 /***************** Get SysncToken to skip this calender at next update if nothing has changed **********/ 
                $events = $service->events->listEvents($calendarID, $eventParams);        
                //If the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken
                try{    
                    $NextSyncToken = $events->getNextSyncToken();
                }
                catch (Exception $e) {
                    if (strripos($e->getMessage(), "410") !== FALSE){
                        $NextSyncToken = 'FEHLER';
                    }else{
                        die ('Folgender Fehler trat auf: ' . $e->getMessage());
                    }
                } 
                $SyncToken = '';
               //echo $NextSyncToken.PHP_EOL;
                   if ($updateCalendar == FALSE) {
                    $query = "SELECT value FROM if_system WHERE name = '".$calendarID."'";
                    $result = mysql_query($query, $this->dbconn);
                        if (mysql_num_rows($result) > 0) {
                            $row = mysql_fetch_assoc($result);
                             $SyncToken = $row['value'];
                        }
                }    
                $insertToken .= "('".$calendarID."','".$NextSyncToken."'), ";    
                /***************** SysncToken check done *****************************************************/ 
                    
                /**************** if SyncToken changed perform update ******************************/            
                if ($NextSyncToken != $SyncToken) {
                    $i++;
                    $deleteCalendarData .= "color = '".$color."' OR ";            
                    while(TRUE) {
                         /************************ Get content from each Calendar *****************/
                        foreach ($events->getItems() as $event) {
                              //print_r($event);
                              if (!empty($event['modelData']['start']['dateTime'])) {
                                  $begin = date_format(date_create($event['modelData']['start']['dateTime']), 'Y-m-d H:i:s');
                                  $end = date_format(date_create($event['modelData']['end']['dateTime']), 'Y-m-d H:i:s');
                              }else{
                                  $begin = $event['modelData']['start']['date'];
                                  $end = $event['modelData']['end']['date'];
                              }                  
                              $title = $event->getSummary();    
                             $insertCalendarData .= "('".$color."','".$begin."','".$end."','".$title."',''), ";    
                          }
                          $pageToken = $events->getNextPageToken();
                          if ($pageToken) {
                             $optParams = array('pageToken' => $pageToken);
                            $events = $service->events->listEvents($calendarListEntry->getID(), $optParams);
                          }else{
                        break;
                          }
                    }
                } /********** if SysncToken changed perform update END  **********/
              } /*********** Loop through each Calendar, get id, and color END *************************/
          
              $pageToken = $calendarList->getNextPageToken();
              if ($pageToken) {
                  $optParams = array('pageToken' => $pageToken);
                $calendarList = $service->calendarList->listCalendarList($optParams);
              }else{
                break;
              }
        }
        
    /***************************** if SyncToken changed perform SQL-statement *********************/
        if ( $i > 0 ) {
            mysql_query($this->before_last('OR', $deleteCalendarData), $this->dbconn) or die('CalendarPlugin -> insertCalendarData:  '.mysql_error());
            mysql_query($this->before_last(',', $insertToken), $this->dbconn) or die('CalendarPlugin -> insertToken: '.mysql_error());
            mysql_query($this->before_last(',', $insertCalendarData), $this->dbconn) or die('CalendarPlugin -> insertCalendarData:  '.mysql_error());
        }
                                
    }

    
    
    public function doOutput($image, $style, $updateData, &$yoffset) {
        if ($updateData)
            $this->doUpdate();

        $query = "SELECT * FROM `if_calendar` WHERE (`end` > NOW()) ORDER BY `begin` ASC";
        $result = mysql_query($query, $this->dbconn);
        if (mysql_num_rows($result) > 0) {

            // define styles
            $opt_header = array(
                'width' => imagesx($image)-290,
                'line_height' => 18,
                'align' => ALIGN_LEFT
            );
            
            $opt_day = array(
                'width' => imagesx($image)-290,
                'height' => 14,
                'line_height' => 14,
                'align' => ALIGN_LEFT
            );

            $opt_entry = array(
                'width' => imagesx($image)-290,
                'height' => 12,
                'line_height' => 12,
                'align' => ALIGN_LEFT,
                'word_wrap_hyphen' => '...',
                'aggressive_word_wrap' => true,
            );

            // print header
            imagettftextboxopt($image, 18, 0, 50, $yoffset, $style['textcolor'], $style['font'], "Nächste Termine", $opt_header);
            $icon = ImageCreateFromPNG ( 'resources/icons/clock.png' );
            ImageCopy($image, $icon, 20, $yoffset-3, 0, 0, imagesx($icon), imagesy($icon));
            ImageDestroy($icon);
            $yoffset += 26;
            
            // print calendar
            $counter = 0;
            $formatDate = "%d.%m.%Y";
            $formatTime = "%H:%M";
            $today = strftime( $formatDate );
            $tomorrow  = strftime( $formatDate, strtotime("+1 day", time() ) );
            $currently_displayed_day = 0;

            while ($row = mysql_fetch_assoc($result)) {
                $counter++;
                
                // if end of screen is reached and more than one items left -> cut off and show hint "x more appointments..."
                $rest = (mysql_num_rows($result) - $counter) + 1;
                if (($yoffset >= (imagesy($image) - 36)) && ($rest > 1)) {
                    $text = "... $rest weitere Termine";
                    imagettftextboxopt($image, 14, 0, 24, $yoffset, $style['textcolor'], $style['fontb'], $text, $opt_entry);
                    $yoffset += 20;
                    break;
                }
                
                // print day name
                $begin_date = strftime( $formatDate, strtotime($row['begin']));
                // if begin day is before today set begin to today
                if (strtotime($begin_date) < strtotime($today))
                    $begin_date = $today;
                // now if begin is after $currently_displayed_day update $currently_displayed_day
                if (strtotime($begin_date) > $currently_displayed_day) {
                    // update currently_displayed_day
                    $currently_displayed_day = strtotime($begin_date);
                    // print day name
                    if( $begin_date == $today )
                        $dayname = "Heute";
                    else if( $begin_date == $tomorrow )
                        $dayname = "Morgen";
                    else
                        $dayname = strftime("%A, ".$formatDate, strtotime($begin_date));

                    imagettftextboxopt($image, 14, 0, 50, $yoffset+4, $style['textcolor'], $style['fontb'], $dayname, $opt_day);
                    $yoffset += 22;
                }
                
                // build appointment time text
                $end_date = strftime( $formatDate, strtotime($row['end']));
                $begin_time = strftime( $formatTime, strtotime($row['begin']));
                $end_time = strftime( $formatTime, strtotime($row['end']));
                $text = $row['title'];
                if ($row['location'] != null)
                    $text = $text . ", " . $row['location'];
                if (($begin_time == "00:00") && ($end_time == "00:00")) {
                    // all day event (substract 1 second to get the real end date at 23:59) 
                    $end_date = strftime( $formatDate, strtotime($row['end'])-1);
                    // if all day event is longer than one day -> print end date
                    if (strtotime($end_date) != $currently_displayed_day)
                        $text = $text." (bis ".$end_date.")";
                        
                } else {
                    // normal event with start and end time
                    $text = $text." (".$begin_time." - ";
                    // if event ends not this day -> display end date additionally to time
                    if (strtotime($end_date) != $currently_displayed_day)
                        $text = $text.$end_date.", ";                    
                    $text = $text.$end_time.")";
                }
                 // ------------------------------------------- M?llabfuhr----------------------------------------                   
                 if (($row['color']) == "#6B3304") {
                        if (strpos($row['title'], 'Sperrmüll') !== false)
                              $icon = ImageCreateFromPNG ( 'resources/icons/tonne_blau.png' );
                        if (strpos($row['title'], 'Grüne Tonne') !== false)
                              $icon = ImageCreateFromPNG ( 'resources/icons/tonne_gruen.png' ); 
                        if (strpos($row['title'], 'Gelber Sack') !== false)
                              $icon = ImageCreateFromPNG ( 'resources/icons/gelber_sack.png' ); 
                        if (strpos($row['title'], 'Graue Tonne') !== false)
                              $icon = ImageCreateFromPNG ( 'resources/icons/tonne_schwarz.png' );
                        if (strpos($row['title'], 'Strauchgutabfuhr') !== false)
                              $icon = ImageCreateFromPNG ( 'resources/icons/strauch.png' );                                               
                        ImageCopy($image, $icon, 23, $yoffset-6, 0, 0, imagesx($icon), imagesy($icon));
                        ImageDestroy($icon);
                } else{  
// ------------------------------------------- Geburtstag ----------------------------------------     
                
                if (($row['color']) == "#AB8B00"){ 
                    $icon = ImageCreateFromPNG ( 'resources/icons/birth.png' );
                ImageCopy($image, $icon, 23, $yoffset+0, 0, 0, imagesx($icon), imagesy($icon));
                ImageDestroy($icon);
                } else {
                  
                // determine button color
                $colorArray = htmlColorToRgb($row['color']);
                $color = ImageColorAllocate ($image, $colorArray[0], $colorArray[1], $colorArray[2]);
                // print appointment text and button
                drawGlassButton($image, $color, 32, $yoffset+8);
                }
                }               
                imagettftextboxopt($image, 12, 0, 50, $yoffset, $style['textcolor'], $style['font'], $text, $opt_entry);
                
                $yoffset += 18;
            
            }
            $yoffset += 26;
            
            
        }
        mysql_free_result($result);

    }

    private function before_last ($needle, $inthat) {
        return substr($inthat, 0, $this->strrevpos($inthat, $needle));
     }
           
    private function strrevpos($instr, $needle) {
        $rev_pos = strpos (strrev($instr), strrev($needle));
        if ($rev_pos===false) return false;
        else return strlen($instr) - $rev_pos - strlen($needle);
    }
    
}
verwendet leider habe ich aber keine Calenderanzeige mehr.in der errorlog steht auch nichts.

Wenn ich bei Google in der calender API schaue sehe ich auch keinerlei Zugriffe auf die API
Bei mir läuft das ganze auf einen kleinen PC unter xammp.

meine Config .ini sieht so aus

Code:
[CalendarPlugin]
; Anzahl der angezeigten Tage (3 = heute, morgen und übermorgen)
number_of_days = 5
;Hier die Daten aus dem Googel-Projekt einfuegen
project_name = "Infoframe"
client_id = "329585675633-3i26brlkpblcv62lj1f0gnl80sd4o89i.apps.googleusercontent.com"
account_name = "329585675633-3i26brlkpblcv62lj1f0gnl80sd4o89i@developer.gserviceaccount.com"
key_file = "c:\xampp\htdocs\infoframe\infoframe.p12"
;Zeit in Stunden nachdem, auch ohne daß sich was am Kalender geaendert hat, die Daten neu eingelesen werden
;Sollte mindestens alle 24Stunden einmal geschehen.
force_refresh = 10

Wo liegt denn das Problem??

Änderung in der index .php habe ich auch gemacht.

Volker
 
Hast Du in der config.ini auf die google-api verlinkt? google_api_path = ...
 
Jo hab ich

Code:
zendfw_path = "c:\xampp\htdocs\zendfw\library\"
google_api_path = "c:\xampp\htdocs\zendfw\library\google-api-php-client-master"

Volker
 
Sodele, bin zwar nicht weiter, aber schlauer. Ich habe jetzt alles gechecked. Ich bekomme weiterhin keine Fehler. Ich habe PHP 5.3.14 drauf.
Ich habe jetzt auch mal die autoload.php, sowie die BaseTest.php versucht zu starten. Da geht nichts. Es passiert rein gar nichts. Bei der autoload.php kommt nur ein weißes Fenster ohne Inhalt und bei der BaseTest.php steht HTTP 500 interner Serverfehler. Any Idea?

Hallo Volker,

mach mal das master weg: google_api_path = "c:\xampp\htdocs\zendfw\library\google-api-php-client-master

Natürlich auch den Ordner so umbenennen.
 
Hallo Thomas

So hab ich gemacht,hat aber nichts gebracht,keine Zugriffe und auch keine Terminanzeige.

Volker
 
Ich glaube wir beide haben das selbe Problem ^^ Wenigstens sind wir nicht alleine mit dem Problem ;)

Das komische ist, das er keinen Fehler bringt.
 
Da haste wohl recht,warum müssen die Googlejungs auch immer alles ändern, es lief doch alles so schön!!!:mad:

Volker

Müssen denn noch mehr API`s aktiv sein .Bei mir ist nur die Calender API on,ist das richtig???
 
Habe es auch so verstanden das wir nur die Google Calendar API aktivieren sollen. Aber alles andere bringt auch nichts. Probier schon alles durch .....
 
So Leutz,
bin gerade dabei einen XAMPP-Server unter Windows zu installieren. Habe eigentlich meinen Webserver virtuell unter Linux am laufen. Teste dann mal mit meinen Einstellungen und gebe Euch dann Rückmeldung. Ich weiß nämlich gerade nicht wie sich das mit den Pfaden unter Windows verhält...

EDIT:

Haut in Eure config.ini die Zeilen des Frameworks/API mal so ein:
Code:
zendfw_path = "../zendfw/library"
google_api_path = "../google-api-php-client"

EDIT2: Das war's auch nicht. mit absoluten Pfaden funktionierts auch... Ich glaube wir müssten mal Eure config.ini und die CalenderPlugin.php sehen.

Bei mir unter Windows/XAMPP läufts. Habe allerdings alles komplett auf Standard (sprich: neu heruntergeladen des Infofram-web.zip und der CalenderPlugin.php von Spoon3er).

Gruß Daniel
 
Zuletzt bearbeitet:
hallo Daniel

Danke erstmal für deine Mühe,meine config.ini und meine CalenderPlugin ist schon im Post 2265
Oder brauchst Du noch was anderes??

Volker
 
Zuletzt bearbeitet:
Hallo Knusterus,

was für Änderungen hast Du in der index.php gemacht? Mit Deiner CalenderPlugin.php funktionierts bei mir. Bist Du komplett nach Spoon3er's Tutorial vorgegangen? Heisst Dein Schlüssel wirklich nur "Infoframe.p12"?

Gruß Daniel
 
Hallo Daniel
Also meine Änderung in der index.php ist
PHP:
// include path for zend framework
if ($sysconfig['zendfw_path'] != "") {
	set_include_path(get_include_path() . PATH_SEPARATOR . $sysconfig['zendfw_path']);
}
if ($sysconfig['google_api_path'] != "") {
    set_include_path(get_include_path() . PATH_SEPARATOR . $sysconfig['google_api_path']);
}

Die Schlüsseldatei habe ich so umbenannt,oder brauche ich die Zahlen davor etwa??

Volker
 
es gibt doch auch unter xamp ein apache error.log such die mal leere sie, speicher die leere datei. machen einen aufruf in dem geupdatet wird, poste den inhalt :)
 
Nimm mal die google_api_path Anweisung wieder raus. Ist bei mir so auch nicht drin. Funktioniert unter XAMPP übrigens auch ohne.
Was steht bei Dir in der MySQL Tabelle if_system? Da sollte mehr als nur ein Eintrag (last_update) drin stehen.

PS: Warum gibts hier keinen Chatraum? Würde einiges um vieles einfacher machen...

Gruß Daniel
 
hehe ich benutze für sowas irc hier connecten irc://freenode/nandi
 
@spoo3er hier meine error.log
Code:
[Mon Nov 24 20:16:00.768300 2014] [core:warn] [pid 5764:tid 216] AH00098: pid file C:/xampp/apache/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
[Mon Nov 24 20:16:01.295331 2014] [mpm_winnt:notice] [pid 5764:tid 216] AH00455: Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7 configured -- resuming normal operations
[Mon Nov 24 20:16:01.295331 2014] [mpm_winnt:notice] [pid 5764:tid 216] AH00456: Server built: Aug 18 2012 12:41:37
[Mon Nov 24 20:16:01.295331 2014] [core:notice] [pid 5764:tid 216] AH00094: Command line: 'c:\\xampp\\apache\\bin\\httpd.exe -d C:/xampp/apache'
[Mon Nov 24 20:16:01.313332 2014] [mpm_winnt:notice] [pid 5764:tid 216] AH00418: Parent: Created child process 2960
[Mon Nov 24 20:16:03.071432 2014] [mpm_winnt:notice] [pid 2960:tid 228] AH00354: Child: Starting 150 worker threads.
[Mon Nov 24 20:17:00.518718 2014] [core:warn] [pid 2624:tid 216] AH00098: pid file C:/xampp/apache/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
[Mon Nov 24 20:17:00.716729 2014] [mpm_winnt:notice] [pid 2624:tid 216] AH00455: Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7 configured -- resuming normal operations
[Mon Nov 24 20:17:00.717729 2014] [mpm_winnt:notice] [pid 2624:tid 216] AH00456: Server built: Aug 18 2012 12:41:37
[Mon Nov 24 20:17:00.717729 2014] [core:notice] [pid 2624:tid 216] AH00094: Command line: 'c:\\xampp\\apache\\bin\\httpd.exe -d C:/xampp/apache'
[Mon Nov 24 20:17:00.734730 2014] [mpm_winnt:notice] [pid 2624:tid 216] AH00418: Parent: Created child process 4492
[Mon Nov 24 20:17:02.387825 2014] [mpm_winnt:notice] [pid 4492:tid 228] AH00354: Child: Starting 150 worker threads.
[Mon Nov 24 20:22:08.232318 2014] [mpm_winnt:notice] [pid 2624:tid 216] AH00428: Parent: child process exited with status 3221225477 -- Restarting.
[Mon Nov 24 20:22:09.525392 2014] [mpm_winnt:notice] [pid 2624:tid 216] AH00455: Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7 configured -- resuming normal operations
[Mon Nov 24 20:22:09.525392 2014] [mpm_winnt:notice] [pid 2624:tid 216] AH00456: Server built: Aug 18 2012 12:41:37
[Mon Nov 24 20:22:09.525392 2014] [core:notice] [pid 2624:tid 216] AH00094: Command line: 'c:\\xampp\\apache\\bin\\httpd.exe -d C:/xampp/apache'
[Mon Nov 24 20:22:09.550394 2014] [mpm_winnt:notice] [pid 2624:tid 216] AH00418: Parent: Created child process 2492
[Mon Nov 24 20:22:11.444502 2014] [mpm_winnt:notice] [pid 2492:tid 228] AH00354: Child: Starting 150 worker threads.

@Daniel so die index.php habe ich wieder zurückgeändert
in der if.system in der Datenbank ist nur ein Eintrag last_update

Was mir noch aufgefallen ist ,Apache stürzt bei jedem Update ab,wenn ich das CalenderPlugin deaktiviere passiert das nicht mehr.

Was ist da falsch??

Volker
 
Zuletzt bearbeitet:
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.