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

Hallo eisbärin,

danke.

Ein kleinerer Fehler ist noch bei ICE, IC, RB, RE, EC, SBS ..., da fehlt bei "route" die Leerzeile und deshalb verschiebt sich alles.
Hast da dafür noch eine Lösung?

Ups. Ok, wenn eine Leerzeile fehlt, dann machen wir doch einfach eine.

PHP:
...
$data_set = substr ($html, 5, $end_next_line - 5);
$data_set = str_replace ("<span class=\"", "", $data_set);
$data_set = str_replace ("\">", "",$data_set);

// neu
$data_set = str_replace ("route\n</span>\n", "route\n\n</span>\n",$data_set);
		
$data_set = str_replace ("</span>\n", "",$data_set);
$data_set = str_replace ("line \n", "line sonst\n",$data_set);
$data_set = str_replace ("line ", "",$data_set);
...

Ist nicht schön, aber funktioniert.

Ich möchte eigentlich sowieso unabhängig von der Seite http://vrrf.finalrewind.org sein, allerdings finde ich im Netz sogut wie keine brauchbare Doku zur EFA-API. Vielleicht hast Du, oder irgend ein Anderer hier im Forum, Infos dazu?
Damit würde das Plugin für alle Verkehrszentralen laufen, die mit EFA arbeiten... und das ist fast ganz Deutschland.

Gruß...
 
Und ob das geholfen hat. Danke.

Hier die neue Version:

Sie ist jetzt unabhängig von http://vrrf.finalrewind.org und scheint mit allen Verkehrsverbünden zu funktionieren, die EFA einsetzen.

Es wird eine XML Datei heruntergeladen und ausgewertet, z.B. http://efa.vrr.de/vrr/XSLT_DM_REQUE...ace_dm=Duesseldorf&type_dm=stop&useRealtime=1. Die APIs scheinen die Parameter place_dm und name_dm unterschiedlich zu interpretieren, VVR kann mit Düsseldorf nichts anfangen, versteht aber Duesseldorf, der MVV hingegen kann mit dem ue nichts tun, versteht aber "place_dm=München, Hbf". Hier bleibt also nur ein wenig auf der Seite des jeweiligen Verkehrsverbundes zu testen. Fehlerhafte Werte für EFA_City und EFA_Station werden (noch) nicht abgefangen.

Die Parameter der config.ini:
[EFAPlugin]
;EFA_url = "http://efa.mvv-muenchen.de/mvv/"
;EFA_url = "http://www2.vvs.de/vvs/"
;EFA_url = "http://www.efa-bw.de/nvbw/"
EFA_url = "http://efa.vrr.de/vrr/"
EFA_City = "Duesseldorf"
EFA_Station = "Eller Mitte"
EFA_max_lines = 3
EFA_line_regex = "/(^U)|(^S)|(715)/"
EFA_platform_regex = "/2/"

EFA_url ist hinzugekommen um den Verkehrsverbund zu bestimmen.
EFA_line_regex und EFA_platform_regex sind jetzt als reguläre Ausdrücke implementiert, nach dem Vorbild vom MailPlugin.

Gruß...
 

Anhänge

  • EFA.tar.gz
    2.9 KB · Aufrufe: 32
Zuletzt bearbeitet:
Zuletzt bearbeitet:
Hallo eisbaerin,

ja, hatte ich auch gefunden. Die Doku ist ok für "Trip Requests", der Abfahrtsmonitor wird zwar erwähnt, aber nur sehr rudimentär, Patrik Brosi lässt sich auch nicht so recht in die Karten schauen.

Nur der Kollege Daniel Friesel scheint all seine Erkenntnisse frei zur Verfügung zu stellen. Ich glaube zwar nicht, dass er hier mitliest, aber an dieser Stelle noch mal Danke für seine Arbeit. Hier der Auszug aus einem seiner Perl-Scripts. Damit kann man mal wirklich was anfangen ;)

PHP:
my $self = {
		post => {
			command                => q{},
			deleteAssignedStops_dm => '1',
			help                   => 'Hilfe',
			itdDateDay             => $date[0],
			itdDateMonth           => $date[1],
			itdDateYear            => $date[2],
			itdLPxx_id_dm          => ':dm',
			itdLPxx_mapState_dm    => q{},
			itdLPxx_mdvMap2_dm     => q{},
			itdLPxx_mdvMap_dm      => '3406199:401077:NAV3',
			itdLPxx_transpCompany  => 'vrr',
			itdLPxx_view           => q{},
			itdTimeHour            => $time[0],
			itdTimeMinute          => $time[1],
			language               => 'de',
			mode                   => 'direct',
			nameInfo_dm            => 'invalid',
			nameState_dm           => 'empty',
			name_dm                => encode( 'ISO-8859-15', $opt{name} ),
			outputFormat           => 'XML',
			placeInfo_dm           => 'invalid',
			placeState_dm          => 'empty',
			place_dm               => encode( 'ISO-8859-15', $opt{place} ),
			ptOptionsActive        => '1',
			requestID              => '0',
			reset                  => 'neue Anfrage',
			sessionID              => '0',
			submitButton           => 'anfordern',
			typeInfo_dm            => 'invalid',
			type_dm                => $opt{type} // 'stop',
			useProxFootSearch      => '0',
			useRealtime            => '1',
		},
	};

Naja, freie Software ist halt eine Philosophie. Einige Leute hier glauben anscheinend wirklich, dass ihr Code so einzigartig ist, ihn nicht zur Verfügung stellen zu dürfen.

Gruß...
 
Zuletzt bearbeitet:
Timeoutprobleme beim TickerPlugin

Hallo an alle Fans vom Ticker Plugin,

bei mir machte seit einigen Tagen der TickerPlugin Zicken. Folgende Fehlermeldung war im apache error.log zu lesen:

Code:
[error] [client 127.0.0.1] PHP Fatal error:  Uncaught exception 'Zend_Http_Client_Adapter_Exception' with message 'Unable to Connect to ssl://api.twitter.com:443.
Error #0: ' in /usr/share/ZendFramework-1.12.7/library/Zend/Http/Client/Adapter/Socket.php:235
Stack trace:
#0 /usr/share/ZendFramework-1.12.7/library/Zend/Http/Client.php(1061): Zend_Http_Client_Adapter_Socket->connect('api.twitter.com', 443, true)
#1 /usr/share/ZendFramework-1.12.7/library/Zend/Oauth/Client.php(223): Zend_Http_Client->request()
#2 /usr/share/ZendFramework-1.12.7/library/Zend/Service/Twitter.php(1246): Zend_Oauth_Client->request('GET')
#3 /usr/share/ZendFramework-1.12.7/library/Zend/Service/Twitter.php(1074): Zend_Service_Twitter->get('statuses/user_t...', Array)
#4 /var/www/plugins/TickerPlugin.php(66): Zend_Service_Twitter->statusesUserTimeline(Array)
#5 /var/www/plugins/TickerPlugin.php(143): TickerPlugin->doUpdate()
#6 /var/www/infoframe.php(167): TickerPlugin->doOutput(Resource id #16, Array, true, 368)
#7 {main}
  thrown in /usr/share/ZendFramework-1.12.7/library/Zend/Http/Client/Adapter/Socket.php on line 235

der Tickerplugin geht auch ziemlich verschwenderisch mit den Ressourcen um: Es wird im Falle eines Updates für jeden ticker_screen_name_X ein doUpdate() gestartet, dieser wiederum updated alle ticker_screen_name_X. Im Extremfall würde fünf hintereinander das gleiche Update durchgeführt. In der Praxis kommt das zwar nicht vor aber unschön ist das allemal.

Das war aber nicht dir Ursache des Problems, sondern die langsame Netzwerkverbindung des WLans.
Den Timeout auf 60 Sekunden hochzusetzen hat bei mir letztendlich für Besserung gesorgt.

PHP:
$twitter = new Zend_Service_Twitter (array (
	'access_token' => array (
		'token' => $this->config['service.twitter.oauth.oauth_token'],
		'secret' => $this->config['service.twitter.oauth.oauth_token_secret'],
		),
	'oauth_options' => array (
		'consumerKey' => $this->config['service.twitter.consumerKey'],
		'consumerSecret' => $this->config['service.twitter.consumerKey_secret'],
		),
    'http_client_options' => array (
		'adapter' => 'Zend_Http_Client_Adapter_Curl',
		'timeout' => 60,
		),
	)
);
 
Ähhhm, hat hier noch jemand das Problem das der Kalender nicht mehr aktualisiert wird? Der zeigt bei mir keine neu eingetragen Termine mehr an.
 
Ja, haben wir.

Goolge hat die Calendar APIv1 und -v2 abgeschaltet "This API is a subject to the Deprecation Policy and will be shutdown on November 17, 2014. Please use APIv3 instead". Quelle
Meines Wissens beherrscht das Zendframework, welches vom CalendarPlugin benutzt wird, nur die APIv1 und -v2. Eine Portierung zu APIv3 ist nicht mal so eben in fünf Minuten erledigt.

Arbeitet vielleicht schon jemand daran?

Gruß...
 
Das wäre prima.... Geh davon aus, dass man es dann hier erfährt , oder?! Greetz
 
Ja, haben wir.
Arbeitet vielleicht schon jemand daran?

Gruß...
Ja bin drüber....
In der Konsole Funktioniert auch alles, muss es nur noch wieder in das Plugin einbetten.

Es müssen mal wieder einige Vrobreitungen getroffen werden:
Am besten https://developers.google.com/api-client-library/php/start/get_started hier anfangen zu lesen, wer will.

Die Kurzform:

Das müsste so alle Anforderungen sein, soweit ich mich erinnere....
 
Danke für die Infos, aber dann muss ich noch selber Hand anlegen - sofern ich deine Anführungen richtig verstanden habe...!

Greetz
 
Ja, wenn du den Kalender weiter benutzen willst, musst das wohl tun.
 
Ok, aber ich muss auf neues Plugin warten?! Danach manuell die Sachen einpflegen... Ohhhh - ob ich das als leihe hinbekomme ;-)
 
Hallo Spoon3er,

soweit ich die Infos von Google verstanden habe geht es nicht mehr ohne OAuth 2.0. Ich kann und will das aber noch nicht gauben, denn mein Smartphone kann mir ganz ohne OAuth meinen Kalender anzeigen :confused:

Ich würde den ganzen Quatsch mit OAuth2.0 nämlich auch gerne weglassen.

Gruß...
 
Zuletzt bearbeitet:
CalendarPlugin.php aktualisiert

Hallo Spoon3er,
....denn mein Smartphone kann mir ganz ohne OAuth meinen Kalender anzeigen :confused:
Bist Du dir da sicher? Das erste was mein smartphone von mir wollte, als ich es vor 4 Jahren bekam, war ein google account!? Somit ist man ja dann auch schon verifiziert und mit einen der unzähligen updates
ist wohl das OAuth 2.0 dazu gekommen - zumindest denke ich mir das so.
Auf https://developers.google.com/google-apps/calendar/v3/reference/calendars/get bekomme ich ohne Anmeldung einen 401 Unauthorized :(

Aber das ganze oAuth 2.0 ist doch nicht wirklich kompliziert. Eigentlich das gleiche wie bei Twitter (TickerPlugin.php), nur einfacher :D


Ab hier CalendarPlugin.php
Voraussetzung für OAuth 2.0 mit der php-client-library ist php > 5.3.0

Gehe auf https://console.developers.google.com/project

  1. Projekt erstellen, falls das erstellte Projekt nicht gleich angewählt wird, dann das erstellte Projekt auswähllen
    2.PNG
  2. API aktivieren
    5.PNG
  3. Apis auswählen (sollte beim erstenmal automatisch ausgewählt sein), alles wegklicken und Calendar API auswählen
    1.PNG
  4. Dann Zugangsdaten -> Neue Client-ID erstellen
    3.PNG
  5. Dienstkonto auswählen -> Client-ID erstellen
    4.PNG
  6. Der .p12 key wird automatisch heruntergeladen das Passwort brauchen wir nicht, da wir den Schlüssel nicht bearbeiten wollen.
  7. CLIENT-ID und E-MAIL-ADRESSE benötigen wir mit dem .p12 key zur Anmeldung bei google. Den .p12 key müsst ihr auf euren (Web-)Server hochladen und den Pfad merken. Diese Daten kommen dann in die config.ini
    6.PNG

Und das wars. Damit sollte eigentlich auf Google alles erledigt sein

Auf https://github.com/google/google-api-php-client die client-library herunterladen und auf euren (web)Server kopieren. Und in php includen. Sei es durch die php.ini oder durch code
z.B:
PHP:
set_include_path(get_include_path() . PATH_SEPARATOR .'Euer/Pfad/Zur/google-api-php-client');
http://www.ip-phone-forum.de/showthread.php?t=206194&page=110&p=2051963&viewfull=1#post2051963

Die "config.ini" sieht bei mir so aus:
Code:
[CalendarPlugin]
; Anzahl der angezeigten Tage (3 = heute, morgen und übermorgen)
number_of_days = 10
;Hier die Daten aus dem Googel-Projekt einfuegen
project_name = "Projektname den Ihr bei Google erstellt habt"
client_id = "CLIENT-ID"
account_name = "E-MAIL-ADRESSE"
key_file = "Pfad/zur/datei.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

Ich benutze die if_system Tabelle um die Kalendernamen und den Aktualisierungs-Token zu speichern. Der Kalendername ist unendlich lang - bei mir über 50 Zeichen.
Da in der vanilla dbconn.php für "name" nur 50 Zeichen gesetzt sind sollte man mit phpmyadmin oder was auch immer "name" auf varchar (100) setzen.
"library/dbconn.php":
PHP:
	// table "if_system"
	if(mysql_num_rows( mysql_query("SHOW TABLES LIKE 'if_system'", self::$connection) ) != 1) {
		$query = "CREATE TABLE `if_system` (
					`name` varchar(100) character set latin1 collate latin1_general_cs NOT NULL,
					`value` varchar(255) character set latin1 collate latin1_general_cs NOT NULL,
					PRIMARY KEY  (`name`)
				) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs; ";
		mysql_query($query, self::$connection) or die('Error, insert query failed: '.mysql_error());
	}

Ich habe bei mir schon vor Ewigkeiten auf "mysqli" statt "mysql" umgestellt, deswegen kann ich den Code in dieser Version nicht testen. Aber ich hoffe, ich habe nix übersehen.
Wenn also was nicht gehen sollte muss es eigentlich an einer der "mysql-statements" liegen.
Marvin ist ja da auch sehr Fit und kann das bestimmt schnell ergründen, sollte etwas nicht passen.
Ich habe einiges an Bemerkungen im Code hinzugefügt für eventuelle Modifizierungen.

Mal sehen was ich alles vergessen habe zu erwähnen... :D

€: Ha, wusst ichs doch!
  1. Ihr braucht nur den "public function doUpdate()" part und die zwei private functions "before_last" und "strrevpos" aus dem CalendarPlugin.php. Somit bleibt eure Ausgabe wie gewohnt.
  2. Falls Ihr, wie ich in meinem eigenen Plugin auch, die Kalender nach den Farben sortiert, zB für die Müllabfuhr oder Geburtstage, müssen die Farben in der "public function doOutput()" angepasst werden. Es werden andere Hexcodes übermittelt - warum auch immer ...
  3. `If_calendar` `color` bitte auch von varchar (7) auf varchar (10) erhöhen
  4. MANN MUSS NATÜRLICH DEN KALENDER AUCH FÜR DEN SYSTEMUSER FREIGEBEN hab ich voll vergessen. Danke an Orca :)
    10.PNG11.PNG12.PNG
 

Anhänge

  • CalendarPlugin01.zip
    4 KB · Aufrufe: 72
Zuletzt bearbeitet:
Also erstmal vielen Dan für die Erklärung! Mit Google habe ich soweit alles hinbekommen..

aber sobald ich meine Calendar.php ändere erhalte ich "Server nicht erreichbar"

vielleicht schaut mal jemand über den Code... Habe nur das Funktion doUpdate geändert...

Code:
<?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 [url]http://www.gnu.org/licenses/[/url]
 ***************************************************************************/

require_once 'Zend/Loader.php';

Zend_Loader::loadClass('Zend_Gdata');
Zend_Loader::loadClass('Zend_Gdata_AuthSub');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
Zend_Loader::loadClass('Zend_Gdata_Calendar');


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 = 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();
			  	$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 = 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 .= "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 ) {
			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()) 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 += 27;
                }
                
                // 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 {
// ------------------------------------------- Standard - Button ----------------------------------------                
                // 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, 13, 0, 50, $yoffset, $style['textcolorgrau'], $style['fontb'], $text, $opt_entry);
                $yoffset += 22;

            }
            $yoffset += 15;
            
            
        }
        mysql_free_result($result);

    }

    private function addCalendar($color, $begin, $end, $title, $location) {
        $query = "INSERT INTO `if_calendar` (`id`, `color`, `begin`, `end`, `title`, `location`) 
                  VALUES (NULL,
                  '".mysql_real_escape_string($color)."', FROM_UNIXTIME($begin), FROM_UNIXTIME($end),
                  '".mysql_real_escape_string($title)."',
                  '".mysql_real_escape_string($location)."'
                  )";
        mysql_query($query, $this->dbconn) or die('Error, insert query failed: '.mysql_error());
    }
    
}
 
ja, habe mal wieder was vergessen. Du musst noch die client library herunterladen und auf dem server kopieren siehe im original Post
 
mmmmm...ok jetzt hast mich erwischt....bin jetzt etwas überfordert,,,


was genau muss ich laden und auf Server kopieren?

Und wo muss ich den Code einfügen?!

Sorry für meine vielleicht etwas doofen Fragen
 
Unten rechts auf "Download Zip" klicken. oder einfacher: https://github.com/google/google-api-php-client/archive/master.zip
Dann kopierst du den entpackten Ordner in das gleiche Verzeichnis in dem du das Zend-Framework liegen hast.

Auszug aus der original config.ini
Code:
zendfw_path = "../zendfw/library"
du könntest zb das hinzufügen direkt unter zendfw_path (bedenke die Pfade müssen passen):
Code:
zendfw_path = "../zendfw/library"
google_api_path = "../google-api-php-client-master"
und die index.php könnte zB so aussehen:
PHP:
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']);
}
 
Daaankke Spoon3er!!!!!

Soweit alles angepasst, das noch wie von die beschrieben eingefügt....Allerdings glaube ich, dass mein Calendar.php nicht stimmt..Sobald ich das einfüge, erhalte ich Server momentan nicht erreichbar...
 

Neueste Beiträge

Statistik des Forums

Themen
246,069
Beiträge
2,245,564
Mitglieder
373,512
Neuestes Mitglied
ah1982
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.