2.9.1 Aufbau
Die Applikation stellt einen Warenkorb anhand eines Büchershops dar. Die Startseite bietet die vorhandenen Büchersparten an. Von dort aus kann man sich alle Bücher zu dieser Sparte anzeigen lassen. Interessiert einen dann ein Buch, so ist man nur noch einen Mausklick von einer genauen Beschreibung entfernt. Ist man dann gewillt das Produkt zu kaufen, so kann man es gleich mal in den Warenkorb legen / der Shoppingliste hinzufügen. Wenn nicht kehrt man einfach über die Navigationsleiste, die auf jeder Seite gleich erscheint, an den Anfang zurück. Hat man die Shoppingliste zu seiner Zufriedenheit erstellt und möchte nun die Waren bestellen, so läßt man sich einfach den Warenkorb anzeigen und klickt auf den Button \"Bestellen\". Jetzt gelangt man zu einem Login-Menü. Entweder loggt man sich mit einem bereits erstellten Kundennamen und -paßwort ein, oder man erstellt ein neues Konto. Egal was man tut, man muß dann weitere persönliche Daten eingeben / überprüfen. Bevor man nun die Bestätigung bekommt, daß die Bestellung erfolgt ist, muß man noch seine bevorzugte Zahlungsart angeben. Dann darf man sich E-Shopper nennen ...
2.9.2 Allgemeines zur Code-Dokumentation
Code - was ist das? Nun, hier ist damit das gemeint, was hinter dem Shop steht, der Quellcode, Schleifen und Funktionen, Variablen und Datensätze, alles vereint in Active Server Pages Dateien.
Schwierig? Um das ganze einfacher zu machen sehen wir uns einmal den Aufbau, das Grundgerüst einer Html-Datei (Hypertext Markup Language - die Sprache des Internet) an. Eine ASP-Datei ist nämlich nichts Anderes als eine Html-Datei mit ein wenig ASP-Code.
Das Grundgerüst einer Html-Datei:
Der Name der Datei, der in der Windows-Startleiste angezeigt
wird
Hier der Inhalt der Html-Datei, der auch wirklich angezeigt wird
Tippt man diesen simplen Code genau so in einen Text-Editor (zb Notepad) ein und benennt diese als *.htm/*.html, so erhält man eine einfachste Html-Datei die mit einem Internet-Browser angezeigt werden kann.
Die Schlüsselwörter (so werden vom System belegte Wörter, die man zB nicht für Variablen verwenden darf, genannt) zwischen den eckigen Klammern () sind Bestandteil der Sprache HTML. Diesen Code werden wir in der Folge nicht erklären, außer es sollte zum Verständnis unbedingt notwendig werden. Interessierte können zB auf https://www.teamone.de/selfhtml mehr über Html-Code erfahren.
Wie erkennt man nun den wahren Programm-Code, der die Applikation ausmacht? Durch eckige Klammern mit Prozentzeichen:
Wenn Sie nun schon ein wenig Bekanntschaft mit Html und Ähnlichem gemacht haben werden Sie bemerken, daß das nicht ASP-Code sondern VB-Script-Code ist.
Nun, ASP ist eigentlich keine Programmiersprache sonder ein Produkt Microsofts, der das Einbinden von Datenbanken in Html-Dateien ermöglicht. Die Datenbank-Befehle sind eigentlich auch im VB-Script eingebunden, aber nicht jeder kann Dateien mit solchen Befehlen nutzen. Zuerst einmal erkennt man solche Dateien an der Endung .asp, verwenden kann man sie nur wenn man den richtigen Web-Server auf seinem Host installiert hat. Dieser Server ist natürlich das zu ASP gehörige oben erwähnte Microsoft-Produkt, genannt Internet Information Server, kurz IIS. Er arbeitet nur auf Windows NT Servern. Für Windows 9x gibt es den vergleichsweise eher trivial anmutenden Personal Web Server.
Also, wir wissen jetzt, daß VB-Script den eigentlichen Programmcode ausmacht und daß dieser mit endet. Diesen werden wir in der Folge erklären, wo es nötig ist.
Obwohl wir nur den VB-Script Code erklären, führen wir zum besseren Verständnis immer die vollständige ASP-Datei an.
Der erklärende Text wird zur Unterscheidung vom Text der Html-Datei kursiv gedruckt.
2.9.3 Der Code
default.asp
Hier gleich eine Eigenheit - bevor noch die Html-Datei beginnt wird hier schon eine Datei eingebunden. Dies ist eine sogenannte Cascading-Style-Sheet-Datei - dort kann man grafische Konventionen für bestimmte Zustände und Tags formulieren die dann für jeden Tag, der in der CSS-Datei erwähnt wird, zutreffen.
Ein Beispiel: In der CSS-Datei weisen wir dem body-tag eine Hintergrundgrafik zu - folglich hat jede Datei die diese CSS-Datei implementiert diese Hintergrundgrafik.
Die inkludierten Dateien werden oft zwischen Kommentarzeichen gesetzt um sie so vor alten Browsern zu verstecken, die statt die Datei zu inkludieren Text ausgeben würden. Neue Browser erkennen diesen Trick und inkludieren die Datei trotzdem, obwohl sie zwischen Kommentarzeichen steht.
Diese Konstante brauchen wir später, falls für eine Sparte oder einen Artikel kein Bild vorhanden sein sollte.
Kleiner Hinweis: am Ende des VB-Scripts bauen wir eine Datenbankverbindung auf. Dies wird später immer mittels der inkludierten Datei idConnection.inc gelöst.
Diese Datei ist die Navigationsleiste, die in jede Datei eingeschlossen wird.
Warenkorb-Standardpage
ein Trennstrich
eine Absatzmarke
ein Absatz mit CSS Formatierungen
Willkommen!
ein Bereich mit CSS Formatierungen
Hier sehen Sie unsere verschiedenen Büchersparten.
Bitte wählen Sie eine Gruppe aus
um Artikel anzuzeigen.
;-)) ein Smiley
Hier muß ich die Sparten aus der Database abfragen und möglichst in einer Tabelle schön geordnet mit verlinkten Bildern anzeigen ;-))
Wir zentrieren die Tabelle mal und beginnen sie hier, wobei der Zelleninhalt immer einen Abstand von 25 zum Zellenrand haben soll.
Die erste Zeile
die erste Spalte
Hier wird ein Bild (lnkImage) in einen Link eingebettet. Damit die Session# etc. nicht verlorengeht wird das alles an den Link angehängt ;-)
1 %> mache solange die Hilfsvariable nicht groesser eins ist
hier wird das Bild eingefügt; SRC und ALT sind dynamisch und werden nach je dem LOOP mit dem Movenext-Befehl auf den nächsten Datensatz gesetzt (das Loop der umgebenden Schleife ist gemeint)
=2) - LOOP beendet dann die DO WHILE Schleife wieder. Damit beim nächsten Schleifendurchlauf der umgebenden Schleife varB wieder =1 es ist ja direkt über dieser Schleife (aber außerhalb) definiert varB=1 !!
LOOP das obligatorische Ende der DO WHILE Schleife
%>
Das Ende des Links, in den die Grafik eingebettet ist
Der Zeilenumbruch und das Zentrieren bewirkt, daß in derselben Zelle wie das Bild, unterhalb (br) und zentriert (center) der Titel steht (erneut als Link).
hier weisen wir die Zufallsfarbe und die jeweilige Sparte zu
.... eine neue Zeile wird begonnen
artikel.asp
Unsere Artikel der Sparte Und hier ist auch schon der Titel
Willkommen bei unseren Artikeln!
Hier sehen Sie die gesamte Auswahl unserer
Artikel der Kategorie .
Bitte wählen Sie für eine genaue
Beschreibung einen
Artikel aus
;-))
Wir öffnen die Tabelle Artikel und wählen alle Datensätze aus, bei denen idLnk (Verknüpfung von Tabelle Sparte zu Tabelle Artikel) der gerade ausgewählten Sparte entspricht - so können die Artikel angezeigt werden, die jeweils zur ausgewählten Sparte gehören.
Die Variable varA wird dazu benutzt, daß Jede Zeile der folgenden Tabelle genau drei Spalten hat.
Der Link, auf den das Bild des jeweiligen Artikels verweist, inklusive allen Informationen die in der nächsten Datei wieder mittels Request.QueryString abgerufen werden.
Das Bild inklusive Untertitel
Es erwies sich als beste Möglichkeit um die Position des Titels im Griff zu haben, diesen innerhalb der Tabelle erneut in eine Tabelle zu verpacken.
Es folgt: die zufällige Auswahl einer Farbe für die Schrift nach dem selben Prinzip das wir bereits kennen, ich erkläre also nicht nochmals.
xartikel.asp
Hier werden der Artikel- und der Spartenname aus dem QueryString (an URL angehangener Code) geholt.
Hier wird in der Tabelle gesucht, ob genau dieser Artikel bereits im Warenkorb liegt, oder nicht - je nachdem wird command mit dem insert oder change belegt und löst dann die gewünschte Reaktion in der warenkorb.asp aus - es wird so verhindert, daß ein Artikel zwei mal angezeigt wird, der Warenkorb wird um die Anzahl der gewählten Artikel erweitert, dh wenn vorher 3 solche Artikel im Warenkorb waren und ich jetzt wieder 1 dieser Artikel einfüge steht dann nicht eine Zeile mit 3 mal und eine mit 1 mal diesem Artikel, sondern nur eine Zeile mit 4 mal diesem Artikel da.
Artikel der Sparte
Stück
Preis/Stk.: Euro
Autor(en):
Preis/Stk.: ATS
ISBN:
Wenn Sie hier auf den Knopf \"auf die Shoppingliste\"
drücken, wird dieser Artikel in der gewüschten
Stückzahl in den Warenkorb gelegt :-)
Erschienen:
Eine Kurzbeschreibung des Artikels:
Weitere Informationen
finden Sie bei
Amazon
Was wir hier sehen ist nichts weiter als eine Tabelle - die Struktur sieht nicht nur kompliziert aus, sie ist es auch und man programmiert das wohl einfacher mit einem Tool (zB Frontpage) als von Hand. Die Tabelle ist eigentlich nur für das Aussehen der Site zuständig, die Funktion wird im Formular verpackt (form-tag). Dort wird die Artikel# und die gewünschte Stückzahl weitergegeben.
warenkorb.asp
Es werden auch hier verschiedene Daten aus dem QueryString bzw. aus einem Formular geholt. Um aus einem Formular Daten holen zu können muß die \"Vorgängerseite\" mit einem Formular und der Method Post genau diese Daten übergeben haben.
Warenkorb
Diese Color-Spielerei bewirkt, daß bei Bestellung von mehreren Daten die einzelnen Artikel im Warenkorb gut unterschieden werden können - es wird immer eine Zeile schwarz angezeigt, die nächste weiß, die nächste wieder schwarz ...
Anzahl: Stück
Neue Stückzahl:
Hier kann man die Bestellmenge eines Artikels ändern - bei Büchern mag dies unsinnig erscheinen weil man wohl kaum 2 mal dasselbe Buch bestellt, bei anderen Artikeln würde dies aber durchaus Sinn machen. (zB: 100 CD-Rohlinge)
Einzelpreis: Euro
Euro ge-samt
Mehr Info
Eine Funktion zum Streichen eines bestimmten Artikels.
Um die oben erwähnte Farbfunktion durchführen zu können ist natürlich ein Zähler in der Schleife nötig, der wiederum von Bedingungen abhängt.
Hier wird eine Variable immer mit der Bestellsumme belegt, die andere wird verwendet um sich die Summe zu merken und bei Anzeige von mehreren Artikeln und damit bei mehreren Schleifendurchläufen die Summe immer zu aktualisieren.
Ar-tikel
Euro ge-samt
ATS gesamt
Auch eine Funktion zum Löschen des Warenkorbs darf nicht fehlen.
Diese Funktion leitet schließlich zur nächsten Datei auf der man dann seine persönlichen Daten bekanntgibt.
Hier wiederholt sich derselbe Code mehrmals - nur um zu unterscheiden ob ein Artikel hinzugefügt, gelöscht, upgedated oder bloß der Warenkorb angeschaut werden soll. Das könnte man sicherlich ganz einfach mit einer Variablen lösen, in die man alle diese Befehle packt - es sei jedem überlassen es so bzw. besser zu machen.
Anzahl: Stück
Neue Stückzahl:
Einzelpreis: Euro
Euro ge-samt
Mehr Info
Ar-tikel
Euro ge-samt
ATS gesamt
Anzahl: Stück
Neue Stückzahl:
Einzelpreis: Euro
Euro ge-samt
Mehr Info
Ar-tikel
Euro ge-samt
ATS gesamt
Anzahl: Stück
Neue Stückzahl:
Einzelpreis: Euro
Euro ge-samt
Mehr Info
Ar-tikel
Euro ge-samt
ATS gesamt
bestellen.asp
Hier werden bereits ziemlich viele Daten abgefragt, sogar auf 2 verschiedene Arten - da die Seite eigentlich verschiedene Seiten in sich vereint und daher immer wieder neu unter anderen Bedingungen geladen werden muß, kommt es vor, daß Daten auf verschiedene Arten übergeben werden - eben entweder per QueryString oder per Formular.
Anmelden/Bestellen
Hier dieselbe Funktion (Reload der Seite) mit verschiedenen Parametern. Sie werden von den unterschiedlichsten Stellen der Seite her aufgerufen und sind je nach Bedarf bezüglich der zu übergebenden Parameter abgestimmt. Der Name nonameorpass rührt daher, daß wir am Anfang auf das Problem stießen, daß falls der Anwender keinen Namen oder Paßwort angibt die Seite erneut geladen wird und der Anwender so quasi zur Eingabe gezwungen wird, da er sonst nie zu einer anderen Seite kommt. Daß wir diese Funktion später so intensiv anwenden würden ahnten wir hier noch nicht.
function nonameorpass()
{ parent.top.location.href=\"bestellen.asp?idSession2=&idUser2=&command=bestellen3&EName=\" }
function nonameorpass2()
{ parent.top.location.href=\"bestellen.asp?idSession2=&idUser2=&command=bestellen6&EName=\" }
function nonameorpass3()
{ parent.top.location.href=\"bestellen.asp?idSession2=&idUser2=&command=bestellen4&EName=\" }
function nonameorpass4()
{ parent.top.location.href=\"bestellen.asp?idSession2=&idUser2=&command=bestellen&EName=\" }
function nonameorpass5()
{ parent.top.location.href=\"bestellen.asp?idSession2=&idUser2=&command=bestellen2&EName=&Anmeldung=neu\" }
function nonameorpass6()
{ parent.top.location.href=\"bestellen.asp?idSession2=&idUser2=&command=bestellen2&EName=&Anmeldung=aendern\" }
Der CASE bestellen ist true wenn man direkt von der warenkorb.asp kommt, dann wird genau jener Teil angezeigt, der in der Struktur an dieser Stelle steht.
Man beachte: Hier wird die Reload-Funktion nonameorpass noch nicht benötigt, da ein Neuladen vom User angefordert werden muß - die Funktion wird notwendig wenn selbständig ein neuer Teil der Seite aufgerufen werden soll.
Name:
Passwort:
Neu anmelden
Bestehendes Konto
Konto ändern
Diese Textarea verursacht mit Netscape grafische Probleme, sie wird nicht als solche erkannt. Überhaupt ist diese Seite vom grafischen Aufbau her besser für den IE geeignet.
¿ +++++ HILFE +++++ ?
Bevor Sie wirklich endgültig bestellen können müssen Sie sich noch authentifizieren.
Wenn Sie ein neuer Kunde sind geben Sie bitte einfach den gewünschten Usernamen und das gewünschte Paßwort ein und wählen Sie die Option \"Neu anmelden\".
Wenn Sie bereits ein Konto bei uns besitzen, so loggen Sie sich einfach mit dem üblichen Namen und Paßwort ein und wählen Sie die Option \"Bestehendes Konto\".
Wenn Sie bereits ein Konto haben, aber etwas umändern möchten, so geben Sie bitte Ihren üblichen Namen und Paßwort ein und wählen Sie die Option \"Konto ändern\".
alert(\"Sie müssen sowohl einen Namen als auch ein Paßwort eingeben\")
nonameorpass4()
Hier sehen wir erstmals die Notwendigkeit der Funktion - wenn der User Namen oder Passwort nicht eingibt soll die Seite automatisch neu geladen werden, und zwar der erste Teil der Seite, damit der User die Daten nochmals eingeben kann.
alert(\"Bitte wählen Sie einen anderen Namen - Ihr Name ist bereits vergeben\")
nonameorpass4()
Vielen Dank für Ihre Anmeldung :-))
Wir bitten Sie noch folgende Details anzugeben bevor die Bestellung durchgeführt werden kann.
Ihre Firma:
Straße
PLZ/Ort
Staat
Telefon:
Fax:
E-mail Addy:
alert(\"Sie haben sich entweder vertippt, oder zuvor noch nicht angemeldet - bitte überprüfen Sie Ihre Eingaben\")
nonameorpass4()
Überprüfen Sie bitte Ihre Einstellungen - falls alles stimmt drücken Sie bitte weiter.
Ihre Firma:
Straße
PLZ/Ort
Staat
Telefon:
Fax:
E-mail Addy:
alert(\"Sie haben sich entweder vertippt, oder zuvor noch nicht angemeldet - bitte überprüfen Sie Ihre Eingaben\")
nonameorpass4()
Hier können Sie Ihre persönlichen Daten beliebig umändern. Falls Sie es sich doch noch anders überlegt haben drücken Sie einfach weiter.
Ihre Firma:
Straße
PLZ/Ort
Staat
Telefon:
Fax:
E-mail Addy:
CASE bestellen22 bzw 23 unterscheiden sich nur dadurch, daß im Falle einer Fehleingabe der User zu verschiedenen Seiten zurückgeleitet wird.
Ändert der User seine Daten werden sie aktualisiert und zur Überprüfung erneut angezeigt - dieser Kreislauf währt so lange bis der User mit seinen Daten zufrieden ist und auf \"weiter\" klickt.
Hier findet sich auch leider das letzte Problem dieser Applikation - beim MS IE werden die Daten bei einer Änderung zwar in die Tabelle eingetragen, aber dann falsch angezeigt. Dies geschieht obwohl die Daten richtig in der Tabelle stehen und der Browser die Daten eigentlich aus der Tabelle holen sollte - das tut er leider nicht, der Browser merkt sich die alten Daten, bemerkt nicht daß sich etwas verändert hat und zeigt die alten Daten an um Zeit zu sparen - klickt man auf \"Aktualisieren\" zeigt der Browser die richtigen Daten an.
Der Netscape Navigator (getestet mit Version 4.7) macht hier keine Probleme, es werden alle Daten richtig zur Anzeige gebracht.
alert(\"Sie müssen wohl oder übel in jedes Feld einen Wert eintragen\")
nonameorpass5()
nonameorpass()
alert(\"Sie müssen wohl oder übel in jedes Feld einen Wert eintragen\")
nonameorpass6()
nonameorpass()
Überprüfen Sie bitte nochmals Ihre Einstellungen - falls alles stimmt drücken Sie bitte weiter.
Ihre Firma:
Straße
PLZ/Ort
Staat
Telefon:
Fax:
E-mail Addy:
Erst hier endet die Schleife zur Änderung und Überprüfung der persönlichen Daten des Users. Jetzt kann eine von 2 Zahlungsmethoden ausgewählt werden. Hier haben wir uns an www.amazon.de angelehnt, die genau diese Zahlungsmethoden anbieten. Alleine unsere eigene Kreditkartenfirma stellen wir auch zur Auswahl (James Cool CC).
Hier werden die nötigen Daten wieder per Formular weitergegeben.
Bitte wählen Sie Ihre bevorzugte Zahlungsmethode aus und geben Sie die notwendigen Informationene an. *g* Ich möchte an dieser Stelle den Ausschluß meiner persönlichen Haftung für jedwegen aus diesem Warenkorb entstehenden Schaden bekanntgeben :-)) Bitte geben Sie nicht Ihre richtige Kreditkartennummer ein :-)) Das ist nur eine Probe-Applikation ohne jedgliche Sicherheitsmaßnahmen.
Das Attribut hidden heißt, daß dieses Feld nicht angezeigt werden soll - der Sinn? Daten können so übermittelt werden.
Zahlungsart
Konto-Nr.
Bankleitzahl
Name des Kontoin-habers
Bankeinzug
Kreditkartennr.
Gültig bis:
Name des Kreditkartenin-habers
James Cool CC
Visa
American Express
MasterCard
01 02 03 04 05 06 07 08 09 10 11 12
1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010
Noch einmal wird überprüft ob der User auch wirklich alle Daten bekanntgegeben hat, dann wird der Erfolg der Bestllung verkündet. Außerdem werden die Daten über die Zahlungsform in eine eigene Tabelle eingetragen.
alert(\"Bitte wählen sie eine Zahlungsart aus indem Sie auf den gewünschten Optionsschalter klicken\")
nonameorpass3()
alert(\"Sie müssen in alle Felder Daten eingeben - leider unumgänglich, sonst könnten Sie ja nicht bezahlen, und das wollen Sie ja nicht :-))\")
nonameorpass3()
alert(\"Sie müssen in alle Felder Daten eingeben - leider unumgänglich, sonst könnten Sie ja nicht bezahlen, und das wollen Sie ja nicht :-))\")
nonameorpass3()
nonameorpass2()
Herzlichen Glückwunsch !!
Sie haben soeben folgende Waren bestellt :-))
Anzahl: Stück
Einzelpreis: Euro
Euro ge-samt
Mehr Info
Ar-tikel
Euro ge-samt
ATS gesamt
Leider werden Sie nie bei Ihnen ankommen weil dies nur eine Probeapplikation ist *fg*
;-)
Hier endet der Select Befehl und im Prinzip auch die Applikation - über die Menüleiste die ja in jedem Feld eingefügt ist kann der User aber erneut shoppen, muß allerdings den alten Warenkorb löschen.
styles.inc
Dies ist die Menüleiste, die wie bereits erwähnt in jede ander Datei eingefügt wurde.
Warengruppen
Hier wird definiert, daß Links weder unterstrichen noch färbig sein sollen. Außerdem wird bestimmt das aktive Links (der Mauszeiger ruht auf dem Link) unterstrichen sein sollen (Hover-Effekt).
Der hier definierte Background gilt auch für die gesamte Datei, in die diese Datei eingefügt wird - die Pfad muß auch aus der Sicht der Datei, in der diese Datei eingefügt ist gesehen werden.
| Start
Hier der einzige interessante Teil dieser Datei - Dynamisch wird ein Optionsfeld erzeugt, das die verschiedenen Sparten samt Link darstellt - ausgeführt wird der Link mit einem Formular.
|
Hier muß darauf geachtet werden, daß auch alle notwendigen Informationen zur Ansicht des Warenkorbs übergeben werden.
|
|
| Electronic Commerce
| Home |
idConnection.inc
Diese Datei wird auch beinahe überall inkludiert und baut immer die Verbindung zur Datenbank auf. Der Inhalt der Datei ist Ihnen bereits von der default.asp bekannt.
default.css
.clsBold { font-weight:bold; }
#Gruppen { text-align:left; font-family:\"Comic Sans MS\"; font-size:\"14pt\"; font-color:\"red\"; margin-left:30px; }
#Artikel { text-align:left; font-family:\"Comic Sans MS\"; font-size:\"14pt\"; font-color:\"navy\"; margin-left:30px; }
#einzelneArtikel { background:\"black\"; text-align:\"left\"; font-family:\"Comic Sans MS\"; font-size:\"14pt\"; font-color:\"white\"; margin-left:30px; }
#Warenkorb { background:\"white\"; text-align:left; font-family:\"Comic Sans MS\"; font-size:\"14pt\"; font-color:\"black\"; margin-left:30px; }
#WeitereInfo { background:\"white\"; text-align:left; font-family:\"Comic Sans MS\"; font-size:\"14pt\"; font-color:\"red\"; }
Diese Style-Sheets-Datei ist sehr wenig ausgeprägt, CSS könnte in einer Applikation wie dieser viel stärker genutzt werden. Es sind hier eine Klasse und mehrere Ids definiert, die dann in jeder Datei, in der die default.css inkludiert ist, genutzt werden können.
details.asp
Diese Datei ist eine abgespeckte Version der xartikel.asp. Im Warenkorb hat der User die Möglichkeit sich Informationen zu einem der Artikel nochmals genau anzusehen - die Datei wird in einem neuen Fenster geöffnet und bietet keine interaktiven Möglichkeiten, eben \"nur\" Information.
Artikel der Sparte
Stück
Preis/Stk.: Euro
Autor(en):
Preis/Stk.: ATS
ISBN:
Wenn Sie dieses Fenster nicht mehr brauchen schließen Sie es einfach :-)
Erschienen:
Eine Kurzbeschreibung des Artikels:
Weitere Informationen
finden Sie bei
Amazon
|