PHP-Programmierung mit Eclipse

Aus LinuxUser 05/2006

PHP-Programmierung mit Eclipse

© sxc.hu

Alles im Griff

Das Plugin PHPEclipse bringt der Java-Entwicklungsumgebung Eclipse die Skriptsprache PHP bei, Subclipse sorgt für eine Einbindung von SVN. Heraus kommt eine komfortable Umgebung für die Entwicklung dynamischer Webseiten in PHP.

Die IDE Eclipse – ursprünglich für Java konzipiert – bietet eine umfassende Programmierumgebung, die einen komfortablen Editor, eine Versionsverwaltung und einen Debugger unter einer gemeinsamen Oberfläche vereint. Plugins ermöglichen es, Eclipse für viele Programmiersprachen einzusetzen: PHPEclipse verwandelt Eclipse in eine vollständige Entwicklungsumgebung für dynamische Webseiten in PHP. Auch Webentwickler profitieren so von der komfortablen und ausgereiften Umgebung. Eclipse steht als Binärarchiv unter [1] zum Dowload (99 MByte) bereit.

Abbildung 1 zeigt den Arbeitsbereich in der Standardeinstellung. Die Unterfenster lassen sich in ihrer Größe anpassen und minimieren oder maximieren. Bei manchen Unterfenstern steht nach einem Rechtsklick auf den Reiter am oberen Fensterrand die Option Detached zu Verfügung, um das Unterfenster zu verselbständigen.

Test-Setup

Für die Entwicklung dynamischer Webseiten macht es Sinn, einen Webserver mit Unterstützung der eingesetzten Skriptsprache lokal zu installieren. Dieser Artikel beschreibt ein Setup, bei dem alle Komponenten auf dem lokalen Rechner laufen. Der SVN-Server kann jedoch ebenso gut auf einem für mehrere Entwickler erreichbaren zentralen Server liegen.

Das Debugging setzt voraus, dass sich der Projektordner im Stammverzeichnis des Webservers befindet: Beim Debuggen müssen die Dateien über den Webserver laufen, damit dieser den enthaltenen PHP-Code ausführt. Andererseits benötigt der Debugger auch direkten Zugriff auf die Quellen. Beim Start von Eclipse wählen Sie als Verzeichnis für den Workspace den Stammordner des Servers. Natürlich muss sichergestellt sein, dass der Benutzer, der Eclipse ausführt, hier Schreibrechte besitzt.

Die im Artikel beschriebene Konfiguration setzt folgende Software voraus:

  • Einen mit Webserver auf localhost mit PHP-Unterstützung
  • Subversion mit laufendem Subversion-Server: Falls Ihre Distribution den Subversion-Server in ein zweites Paket auslagert, müssen Sie dieses ebenfalls installieren.
  • Die Eclipse-IDE mit den Plugins Subclipse und PHPEclipse. Eclipse setzt das Java Runtime Environment ab Version 1.4 voraus.
Abbildung 1: Die Eclipse-Umgebung bietet einen flexiblen Arbeitsbereich, bei dem sich Unterfenster in vielfältiger Weise neu anordnen lassen.

Abbildung 1: Die Eclipse-Umgebung bietet einen flexiblen Arbeitsbereich, bei dem sich Unterfenster in vielfältiger Weise neu anordnen lassen.

Subclipse-Installation

Subclipse (siehe [3]) steht unter der Common Public License und lässt sich einfach über die Eclipse-Plugin-Schnittstelle installieren. Help | Software updates | Find and install öffnet das Update-Werkzeug (Abbildung 2). Aktivieren Sie die Option Search for new features to install und klicken Sie auf Next. Wählen Sie dann die Schaltfläche Add remote Site und geben Sie die URL http://subclipse.tigris.org/update_1.0.x/ ein. Bei der Installation muss sichergestellt sein, dass der Benutzer, der Eclipse ausführt, Schreibrechte für das Programmverzeichnis besitzt.

Abbildung 2: Über die Eclipse-Pluginschnittstelle können Sie nicht nur Subversion, sondern auch viele andere Erweiterungen installieren.

Abbildung 2: Über die Eclipse-Pluginschnittstelle können Sie nicht nur Subversion, sondern auch viele andere Erweiterungen installieren.

TIPP

Eine Übersicht finden aller verfügbaren Plugins für Eclipse finden Sie online beim Eclipse Plugin Resource Center [4].

Eclipse kann im Moment nicht direkt über das Dateisystem auf lokale Repositories zugreifen – es sei denn, Sie kompilieren Subversion (SVN) mit den JavaHL-Bindings und weisen Eclipse unter Preferences | Team | SVN an, diese zu benutzen. Die Quellen von SVN finden Sie unter [5]. Subversion bringt jedoch einen einfach zu konfigurierenden Server mit; meist macht es weniger Aufwand, diesen auch für lokale Repositories einzusetzen.

Legen Sie zunächst mit svnadmin create --fs-type fsfs Pfad/zum/Repository] ein Repository für das Projekt an. Den Serverzugriff stellen Sie über die Dateien svnserve.conf (Listing 1) und passwd (Listing 2) im Unterverzeichnis conf/des Repository ein.

Listing 1

### conf/svnserve.conf
[general]
password-db= passwd
realm = example realm ### eine Art "Namespace"
anon-access = none    ### für anonymen Lesezugriff: "read"
auth-access = write

Listing 2

### conf/passwd
[users]
testuser = secret ### User / Passwort

Den Server starten Sie mit svnserve -d -r Pfad/zum/Repository. Damit Subclipse auf das Repository zugreifen kann, müssen Sie es anmelden. Wechseln Sie dazu über Window | Open Perspective zur Perspektive SVN Repository Exploring. Dort finden Sie in der linken Bildschirmhälfte das Fenster SVN Repository, das alle eingebundenen Repositories anzeigt. Ganz rechts in der Werkzeugleiste dieses Fensters findet sich die Schaltfläche Add new SVN Repository. Klicken Sie darauf, und geben Sie im Dialogfenster die URL svn://localhost ein. Subclipse fordert Sie nun auf, das Kennwort einzugeben. Nach der Eingabe erscheint das neue Repository in der Liste am linken Fensterrand.

TIPP

Bei Projekten, die unter der Kontrolle einer Versionsverwaltung stehen, arbeiten Sie stets mit lokalen Kopien der Dateien aus dem Repository: Versionsverwaltungssysteme sind dazu ausgelegt, mehreren Entwicklern das gleichzeitige Bearbeiten der selben Dateien zu ermöglichen.

Liegt das Projekt, an dem Sie in Eclipse arbeiten möchten in einem SVN-Repository, so unterstützt Sie Subclipse beim Checkout: Ein Klick auf File | New | Other… öffnet die Auswahl der verfügbaren Projektassistenten. Mit SVN | Checkout projects from SVN erstellen Sie aus im Repository vorhandenen Dateien ein neues Eclipse-Projekt.

Möchten Sie bereits vorliegende PHP-Dateien bearbeiten, kopieren Sie das Stammverzeichnis des Projekts in den Workspace-Ordner und erstellen in Eclipse ein neues Projekt mit dem Namen des Projektordners. Klicken Sie rechts auf den Stammordner des Projekts und wählen Sie Team | Share Project, um es unter die Kontrolle der Versionsverwaltung zu stellen.

Ein neues Projekt legen Sie mit einem Rechtsklick auf den Dateibrowser an. Wählen Sie die Option New | PHP Project. Falls dass PHP Project nicht direkt im Menü New erscheint, müssen Sie eventuell den Umweg über Other… gehen. Der Versionsverwaltung fügen Sie das neue Projekt nach einem Rechtsklick über den Punkt Team | Share Project hinzu.

Ist ein Bearbeitungsschritt abgeschlossen, übergibt ein Commit die Änderungen an das Repository: Klicken Sie dazu mit der rechten Maustaste auf eine Datei oder einen Ordner und wählen Sie Team | Commit (Abbildung 3). Jede in einem Commit erstellte Version lässt sich mit einem Kommentar versehen. Um die Änderungen auch später noch nachvollziehen zu können, sollten Sie diese Möglichkeit nutzen.

Haben Sie eine neue Datei erstellt, dann müssen Sie diese explizit unter die Kontrolle von SVN stellen. Setzen Sie dazu das Häkchen vor dem Dateinamen; der Status ändert sich dabei auf added.

Abbildung 3: Im Dialog <code srcset=

Commit wählen Sie die zu aktualisierenden Dateien aus und geben einen erläuternden Kommentar ein.” width=”300″ height=”239″ /> Abbildung 3: Im Dialog Commit wählen Sie die zu aktualisierenden Dateien aus und geben einen erläuternden Kommentar ein.

Konfliktmanagement

Nehmen mehrere Entwickler an einer Datei zur gleichen Zeit Änderungen vor, so fügt SVN die verschiedenen Versionen automatisch zusammen, sofern die Änderungen sich auf unterschiedliche Zeilen im Code beschränken. Überschneiden sich die Änderungen jedoch, meldet Subversion einen Konflikt. Ein solcher muss von Hand aufgelöst werden, da SVN den Sinn von Änderungen im Quelltext nicht nachvollziehen kann.

Subclipse überträgt die Ausgabe des Befehlszeilentools in die grafische Eclipse-Umgebung: In der Dateiliste erscheint vor dem Dateinamen ein Ausrufezeichen, falls in der Datei ein Konflikt vorliegt. Öffnen Sie eine solche Datei, so sehen Sie, dass SVN Konfliktmarker wie <<<<<<< .mine oder >>>>>>> .r7 eingefügt hat (vgl. Listing 3).

Listing 3

$name = $_GET['name'];
<<<<<<< .mine
 $alter = $_GET['alter'];
=======
 $land = $_GET['land'];
>>>>>>> .r7
<<<<<<< .mine
 print "<h1>Hallo, $name. Du bist $alter Jahre alt.</h1>";
=======
 print "<h1>Hallo, $name. Du kommst aus $land</h1>";
>>>>>>> .r7

Die Zeilen über den Gleichheitszeichen entsprechen dem Dateiinhalt der lokalen Version, die darunter dem Inhalt aus dem Repository. Unter Team | Edit conflicts bietet Eclipse eine Ansicht, die die in Konflikt stehenden Zeilen gegenüberstellt (Abbildung 4). In der Mitte zwischen beiden Editorfenstern, welche die unterschiedlichen Versionen enthalten, befinden sich Schaltflächen, mit denen Sie die Änderungen aus einer der beiden Versionen übernehmen können. Nach dem Überarbeiten teilt Team | Mark as resolved der Versionsverwaltung mit, dass die Konflikte bereinigt wurden.

Abbildung 4: Mit einer Vergleichsansicht beheben Sie Konflikte im Handumdrehen. Unterschiede fasst Eclipse übersichtlich zusammen.

Abbildung 4: Mit einer Vergleichsansicht beheben Sie Konflikte im Handumdrehen. Unterschiede fasst Eclipse übersichtlich zusammen.

Die Update-Funktion erspart es, bei jeder Änderung erneut das gesamte Repository auszuchecken. Sie lädt nur Dateien herunter, für die das Repository eine neuere Revision enthält als die lokalen Arbeitskopie. Wie beim Commit finden Sie die Funktion im Kontextmenü des Ordners oder der einzelnen Datei, die Sie aktualisieren möchten: Team | Update bringt Sie auf den neuesten Stand. Das Fenster Console im unteren Teile des Eclipse-Fensters listet auf, welche Dateien verändert wurden.

Go PHP

Die über die Plugin-Schnittstelle nachladbare Erweiterung PHPEclipse verwandelt die Java-IDE in eine Programmierumgebung für PHP. Starten Sie mit Help | Software updates | Find and install das Update-Tool, wählen Sie Search for new features to install und klicken Sie auf Next. Über Add remote Site fügen Sie die neue Dowload-URL http://phpeclipse.sourceforge.net/update/cvs/ hinzu.

Der Editor von Eclipse/PHPEclipse bietet alles, was für zügiges Schreiben von PHP-Code hilfreich ist: [Strg]+[Leertaste] vervollständigt PHP-Befehle (Abbildung 5). Zusätzlich zeigt das Eclipse eine Übersicht über Parameter und Rückgabewerte sowie eine kurze Beschreibung des Befehls an. Die automatische Vervollständigung funktioniert auch bei bereits verwendeten Variablen. Auch Klammern und Anführungszeichen schließt der Editor automatisch. Bei Programmstrukturen wie If-Anweisungen oder For-Next-Schleifen rückt Eclipse die untergeordneten Codeblöcke ein.

Für Übersicht im Quellcode sorgt Syntax-Highlighting: Eclipse färbt Befehle, Funktionen, Variablen, Strings und einige andere Code-Elemente unterschiedlich ein (Abbildung 6). Die Faben lassen sich unter Preferences | PHPEclipse Web Development anpassen. Dort lässt sich auch die Anzeige von Zeilennummern einschalten. Seit dem letzten Speichern veränderte Zeilen kennzeichnet Eclipse durch eine blaue Markierung am Rand.

Unter [6] finden Sie ein Anleitung, wie Sie die ofizielle PHP-Dokumentation von php.net installieren können. Mit einem Rechtsklick auf einen Befehl im Code lässt sich nach der Installation über die Option PHP Help die zugehörige Hilfeseite öffnen.

Abbildung 5: Wie heißt der Befehl, welche Parameter hat er? PHPEclipse unterstützt Sie beim Schreiben von PHP-Code, indem es eine beschreibung des Befehls und seiner Parameter anzeigt.

Abbildung 5: Wie heißt der Befehl, welche Parameter hat er? PHPEclipse unterstützt Sie beim Schreiben von PHP-Code, indem es eine beschreibung des Befehls und seiner Parameter anzeigt.

Abbildung 6: Syntax-Highlighting und automatische Codeformatierung sorgen für Überblick im Quellcode. Syntaxfehler markiert Eclipse bereits beim Tippen.

Abbildung 6: Syntax-Highlighting und automatische Codeformatierung sorgen für Überblick im Quellcode. Syntaxfehler markiert Eclipse bereits beim Tippen.

Fehlerteufel

Auch bei sorgsamem Codieren schleichen sich Fehler ein. Im Gegensatz zu Syntaxfehlern, für die PHP Fehlermeldungen mit Zeilennummer anzeigt, sind Fehler in der Programmlogik oft schwer zu finden. Ein Debugger erleichtert es, nachzuvollziehen, warum Programmcode nicht das gewünschte Ergebnis bringt.

Dabei operiert er nach einem simplen Prinzip: Er unterbricht den Ablauf des Progamms an vorher festgelegten Stellen (“Breakpoints”). Im Browser sehen Sie einerseits die Ausgabe, die der Skript bisher zurückgegeben hat. Zum anderen zeigt der Debugger die Werte sämtlicher Variablen zu diesem Zeitpunkt an. Diese lassen sich auch verändern, um in den Programmablauf einzugreifen.

Zudem zeigt ein Debug-Cursor direkt auf die entsprechende Zeile im Code, sodass Sie einen Überblick über den Ablauf des Skripts erhalten. Neben Breakpoints beherrscht der Debugger auch verschiedene Einzelschrittmodi: Hier sehen Sie an den Sprüngen des Cursors im Code, in welcher Reihenfolge PHP die Codezeilen ausführt.

Eclipse arbeitet mit dem PHP-Debugger Dbg. Er findet sich unter [7] als Binärarchiv zum Dowload. Wählen Sie die dbg_modules, die zu Ihrer PHP-Version passen. Oft funktionieren die Module auch mit neueren Releases.

TIPP

Der PHP-Debugger Dbg ist zwar frei erhältlich, jedoch nicht quelloffen. Eine komplette Open-Source-Alternative mit dem vorgestellen Leistungsumfang existiert derzeit nicht. Einzig die kommerzielle IDE “Zend Studio” übertrifft Dbg im Leistungsumfang.

Um das PHP-Modul dbg.so zu installieren, passen Sie die Konfigurationsdatei von PHP (php.ini) an. Wo diese liegt, finden Sie heraus, indem Sie eine Datei test.php mit dem Inhalt <? phpinfo() ?> anlegen und im Webbrowser aufrufen. Suchen Sie im Browser nach php.ini. In der Datei php.ini suchen Sie die Variable extension_dir. Sie gibt an, in welchem Verzeichnis auf Ihrem System die Extension-Module für PHP liegen. Entpacken Sie nun das heruntergeladene Archiv und verschieben die Datei dgb.so-X.X.X, die Ihrer PHP-Version entspricht, in den Modulordner. Benennen Sie diese schließlich in dbg.so um.

Fügen Sie in php.ini unterhalb der gerade gefundenen Stelle folgende Zeilen ein:

extension=dbg.so
[debugger]
debugger.enabled = true
debugger.profiler_enabled = true
debugger.JIT_host = clienthost
debugger.JIT_port = 7869

Deaktivieren Sie noch die EAccelerator-Extension (eaccelerator.enable="0"), sofern diese exitiert, und kommentieren gegebenfalls den Eintrag für XDebug aus (;zend_extension=/usr/lib/php4/20020429/xdebug.so). Weitere Information zu inkompatiblen PHP-Extensions finden Sie unter [8].

Ändern Sie nun noch den Wert der Variablen implicit_flush auf On. Dies bewirkt, dass PHP den dynamisch generierten Content bereits an den Webserver übergibt, bevor das Skript bis zum Ende abgelaufen ist. Der Vorteil für das Debugging liegt auf der Hand. Auf Produktivsystemen sollten Sie die Einstellung jedoch nicht verändern, da sie die Systemleistung reduziert. Rufen Sie nach einem Neustart des Webservers erneut test.php auf. Wenn die Ausgabe von phpinfo()dbg unter den installierten Extensions listet (vgl. Abbildung 7), war die Installation erfolgreich.

Abbildung 7: Die Ausgabe der PHP-Funktion phpinfo() zeigt, dass die Installation des Debuggermoduls erfolgreich war.

Abbildung 7: Die Ausgabe der PHP-Funktion phpinfo() zeigt, dass die Installation des Debuggermoduls erfolgreich war.

Nun fehlt noch die Konfiguration des Debugger-Tools in Eclipse. Öffnen Sie dieses über Run | Debug. Wählen Sie unter Configurations den Eintrag PHP DBG Script und klicken Sie auf New. Im Reiter PHP-Environment sind zunächst einige grundsätzliche Einstellungen erforderlich: Aktiveren Sie unter Remote Debug das Kontrollkästchen Remote Debug.

Remote Debug bedeutet nicht anderes, als dass der Debugger die Seiten über den Webserver aufruft. Nur so werden bei Seiten, die PHP-Code enthalten, die Skriptbefehle auch interpretiert. Deshalb stellt Remote Debug die richtige Option dar, auch wenn der Server auf dem selben Rechner abläuft wie Eclipse selbst. Der Remote Sourcepath muss auf den Projektordner zeigen (Abbildung 8). Geben Sie im Reiter Interpreter den Pfad zum PHP-Binary ein. Sie finden diesen auf der Konsole mit which php heraus. Sollte das Interpreter-Binary nicht existieren, müssen Sie den CGI-Teil von PHP installieren oder PHP mit CGI-Unterstützung kompilieren.

Abbildung 8: Der Eclipse-Debugger ruft die Seiten remote über den Webserver auf. Dieser führt die PHP-Befehle auf. Zusätzlich benötigt der Debugger den Pfad zu den Quelldateien.

Abbildung 8: Der Eclipse-Debugger ruft die Seiten remote über den Webserver auf. Dieser führt die PHP-Befehle auf. Zusätzlich benötigt der Debugger den Pfad zu den Quelldateien.

Wählen Sie nun im Reiter File das Projekt und die Datei, die Sie debuggen möchten, klicken Sie auf Apply und schließen Sie das nun vollständig konfigurierte Debugger-Werkzeug. Nun sollten Sie sich dem Quellcode der zu untersuchenden PHP-Datei zuwenden und überlegen, an welcher Stelle Sie Einblick in den Ablauf des Interpretationsvorgangs benötigen. Setzen Sie dort durch Doppelklick auf den linken Rand des Editorfensters Breakpoints. Eclipse symbolisiert diese durch einen blauen Punkt. Breakpoints funktionieren nur in Zeilen, in denen PHP-Befehle stehen. Rufen Sie nun erneut den Debugger auf (RunDebug) und starten Sie ihn mit Debug.

Öffnen die zu debuggende Datei im Webbrowser. Um den Debugger zu starten, müssen Sie an die Adresse im Browser ?DBGSESSID=1@clienthost:10001 anhängen. Dies ist nur beim ersten Aufruf erforderlich, der Debugger setzt dann ein Cookie.

Der Webbrowser sollte nun eine unvollständige Seite anzeigen, da der Breakpoint die Verarbeitung der Datei unterbricht. Falls Ihr Fenstermanager es zulässt, schiebt sich das Eclipse-Fenster in den Vordergrund. Um die Anzeige des Debuggers zu sehen, öffnen Sie unter Window | Open Perspective die Debug-Perspektive. Im Debug-Unterfenster sehen Sie eine aktive Debug-Session.

Das Variables-Fenster in der Debug-Perspektive zeigt alle Variablen (Abbildung 9). Am unteren Rand des Fensters sehen Sie deren Inhalte und können sie bei Bedarf auch verändern, so dass der weitere Ablauf des Skripts mit einem anderen Wert startet. Bei Arrays klicken Sie auf den kleinen Pfeil, um die Elemente und deren Werte zu sehen. Das Unterfenster Breakpoints listet alle Haltepunkte und ermöglicht, sie temporär zu deaktivieren.

Abbildung 9: So finden Sie Programmierfehler: Der Debugger hält den Ablauf von PHP-Skripten an festgelegten Punkten an und zeigt die Werte aller Variablen.

Abbildung 9: So finden Sie Programmierfehler: Der Debugger hält den Ablauf von PHP-Skripten an festgelegten Punkten an und zeigt die Werte aller Variablen.

Im Debug-Unterfenster können Sie Debug-Sessions mit einem Rechtsklick beenden oder neu starten. Wenn Sie den Debugger benutzt haben und keine Debug-Session mehr aktiv ist, zeigt der Browser allerdings beim Aufruf von Pages über den lokalen Webserver nur noch eine Fehlerseite. Das Löschen des Cookies mit dem Namen DBGSESSID schafft Abhilfe.

Der Debugger benötigt mindestens einen Breakpoint pro Datei, sonst läuft das Skript ohne anzuhalten durch. Möchten Sie den Code jedoch Befehl für Befehl ausführen, müssen Sie deshalb nicht für jede Zeile einen Haltepunkt setzen: [F5] bewirkt, dass das Skript ab dem ersten Haltepunkt Zeile für Zeile abläuft. Ein grüner Cursor zeigt, welcher Befehl gerade ausgeführt wird. Der Debugger öffnet beim Durchlauf durch das Skript selbständig über include eingefügte Dateien. Mit [F6] überspringt das Debugging Unterstrukturen, so dass Sie sich auf den Ablauf der obersten Ebene konzentrieren können. Bei jedem Schritt bietet Ihnen das Fenster Variablen lesenden und schreibenden Zugriff auf alle Variablenwerte.

Fazit

Schritt für Schritt nachvollziehen zu können, was passiert, wenn ein Programm abläuft, hilft dabei, logische Fehler zu finden – um so mehr, je komplexer Ihre Anwendung ausfällt. Ausnahmeprogrammierer wie Linus Torvalds mögen ruhig behaupten, es sei besser, den eigenen Kopf zu benutzen als einen Debugger. Wer sich aber schon einmal eine Nacht um die Ohren geschlagen hat, um einen an sich trivialen Fehler zu finden, ist für die Unterstützung bei der Fehler-Jagd dankbar.

Die direkt aus der grafischen Oberfläche heraus bedienbare Versionsverwaltung tut ihr Übriges, um das Weiterentwickeln von bestehendem Programmcode zu erleichtern. Ein komfortabler Editor schließlich beschleunigt das Tippen, sorgt durch Syntax-Highlighting für Übersicht und hilft durch seine automatische Formatierfunktion dabei, lesbaren Code zu schreiben.

Glossar

Versionsverwaltung

System, das Änderungen am Programmcode archviert. Bei neu hinzugekommenen Fehlern lassen sich vorausgehende Versionen wiederherstellen. Eine Dif(ference)-Anzeige hilft beim Aufspüren der Ursachen. Eine Ausführliche Einführung in die Versionsverwaltung SVN finden Sie unter [2].

IDE

Integrated Development Environment. Eine Umgebung zur Entwicklung von Software, die mehrere Komponenten integriert.

Repositories

In einem Repostitory befinden sich sämtliche Daten und Meta-Informationen eines Projekts. Versionsverwaltungen wie Subversion können mehrere Repositories bereitstellen.

Checkout

Das Kopieren sämtlicher Daten des Repositories auf den lokalen Rechner als Arbeitsgrundlage.

Commit

Das Gegenteil eines Checkouts. Die veränderte Dateien werden zurück zum Server übertragen.

LinuxUser 05/2006 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben