Erstellung eines Web-basierten Konfigurators für Renn - Lab4Inf ...
Erstellung eines Web-basierten Konfigurators für Renn - Lab4Inf ...
Erstellung eines Web-basierten Konfigurators für Renn - Lab4Inf ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Fachhochschule Münster<br />
Fachbereich Elektrotechnik und Informatik<br />
Diplomarbeit<br />
<strong>Erstellung</strong> <strong>eines</strong> <strong>Web</strong>-<strong>basierten</strong> <strong>Konfigurators</strong> für<br />
<strong>Renn</strong>- und Triathlonräder mittels PHP und MySQL<br />
von<br />
Marco Ressler<br />
Betreuer/Prüfer:<br />
Prof. Dr. rer. nat. Nikolaus Wulff<br />
Dipl.-Kfm. Christian Pyrrek
Eidesstattliche Erklärung<br />
Ich versichere hiermit, dass ich diese Diplomarbeit ohne fremde Hilfe selbstständig<br />
verfasst und nur die angegebenen Quellen und Hilfsmittel benutzt habe. Wörtlich<br />
oder dem Sinn nach aus anderen Werken entnommene Stellen sind unter Angabe<br />
der Quelle kenntlich gemacht.<br />
Die Arbeit wurde bisher in gleicher oder ähnlicher Form keiner anderen Prüfungsbehörde<br />
vorgelegt und auch nicht veröffentlicht.<br />
Münster, den 22.Juli 2006
Inhaltsverzeichnis<br />
Einführung<br />
V<br />
1 PHP vs. Java 1<br />
1.1 Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />
1.1.1 Die Vor- und Nachteile bei Java und JSP . . . . . . . . . . . 3<br />
1.1.2 Anwendungsbereiche von Java . . . . . . . . . . . . . . . . . 4<br />
1.2 PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />
1.2.1 Die Vor- und Nachteile bei PHP . . . . . . . . . . . . . . . . 6<br />
1.2.2 Typische Anwendungen bei PHP . . . . . . . . . . . . . . . 7<br />
1.3 PHP vs. Java - überhaupt vergleichbar? . . . . . . . . . . . . . . . 7<br />
2 Das <strong>Renn</strong>-/Triathlonrad 10<br />
2.1 Aufbau und Komponenten . . . . . . . . . . . . . . . . . . . . . . . 11<br />
2.2 Abhängigkeiten der Komponenten . . . . . . . . . . . . . . . . . . . 14<br />
3 Das Programm aus Sicht des Nutzers 19<br />
3.1 Programmablauf . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />
3.2 Bildschirmausgabe . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />
3.2.1 Navigationsleiste . . . . . . . . . . . . . . . . . . . . . . . . 21<br />
3.2.2 Komponententabelle . . . . . . . . . . . . . . . . . . . . . . 22<br />
3.2.3 Übersichtstabelle . . . . . . . . . . . . . . . . . . . . . . . . 24<br />
3.2.4 Sonstige Anzeigen . . . . . . . . . . . . . . . . . . . . . . . . 24<br />
3.2.5 Showroom . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />
Diplomarbeit<br />
I
INHALTSVERZEICHNIS<br />
4 MySQL Datenbank 27<br />
4.1 Aufbau der Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />
4.1.1 Gemeinsame Eigenschaften . . . . . . . . . . . . . . . . . . . 28<br />
4.1.2 Einzelne Tabellen . . . . . . . . . . . . . . . . . . . . . . . . 29<br />
5 Die Progamm-Dateien 35<br />
5.1 Programmablauf . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />
5.2 Darstellung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />
5.2.1 index.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />
5.2.2 Main.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40<br />
5.2.3 Showroom.php . . . . . . . . . . . . . . . . . . . . . . . . . 42<br />
5.3 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />
5.3.1 XML-Datei . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />
5.3.2 XML-Handler Klasse . . . . . . . . . . . . . . . . . . . . . . 46<br />
5.4 Event-Handler Klasse . . . . . . . . . . . . . . . . . . . . . . . . . . 48<br />
5.4.1 Die Ereignisse . . . . . . . . . . . . . . . . . . . . . . . . . . 49<br />
5.4.2 Weitere Funktionen . . . . . . . . . . . . . . . . . . . . . . . 50<br />
6 Das Programm aus Sicht des Entwicklers 53<br />
6.1 Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53<br />
6.1.1 Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54<br />
6.1.2 Entfernen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55<br />
6.1.3 Auswahl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55<br />
6.1.4 Zusätzliche Auswahl . . . . . . . . . . . . . . . . . . . . . . 56<br />
6.1.5 Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56<br />
6.2 Komponentenklassen . . . . . . . . . . . . . . . . . . . . . . . . . . 58<br />
6.2.1 Funktion set session . . . . . . . . . . . . . . . . . . . . . . 59<br />
6.2.2 Funktion display . . . . . . . . . . . . . . . . . . . . . . . . 61<br />
6.2.3 Weitere Funktionen . . . . . . . . . . . . . . . . . . . . . . . 63<br />
6.3 Elternklasse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64<br />
6.3.1 Komponentendarstellung . . . . . . . . . . . . . . . . . . . . 65<br />
6.3.2 Komponenten entfernen . . . . . . . . . . . . . . . . . . . . 68<br />
6.3.3 Preis- und Gewichtsaktualisierung . . . . . . . . . . . . . . . 69<br />
Diplomarbeit<br />
II
INHALTSVERZEICHNIS<br />
6.4 Weitere Klassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70<br />
6.4.1 XML Handler Klasse . . . . . . . . . . . . . . . . . . . . . . 70<br />
6.4.2 Session Handler Klasse . . . . . . . . . . . . . . . . . . . . . 72<br />
6.4.3 Datenbank Handler Klasse . . . . . . . . . . . . . . . . . . . 72<br />
6.5 Interaktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73<br />
6.5.1 Event: Navigation . . . . . . . . . . . . . . . . . . . . . . . . 73<br />
6.5.2 Event: Auswahl . . . . . . . . . . . . . . . . . . . . . . . . . 74<br />
6.5.3 Event: Auswahl mit Zusatz . . . . . . . . . . . . . . . . . . 77<br />
7 Zusammenfassung und Ausblick 79<br />
7.1 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79<br />
7.2 Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81<br />
7.3 Schlusswort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82<br />
A Tables der Datenbank 83<br />
B Screenshots 91<br />
Quellenverzeichnis 94<br />
Diplomarbeit<br />
III
Abbildungsverzeichnis<br />
2.1 Übersicht Fahrrad-Komponenten . . . . . . . . . . . . . . . . . . . 11<br />
3.1 Pfade im Programmablauf . . . . . . . . . . . . . . . . . . . . . . . 20<br />
3.2 Navigatonsleiste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22<br />
3.3 Komponententabelle . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />
3.4 Übersichtstabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />
4.1 Aufbau der Artikelnummer . . . . . . . . . . . . . . . . . . . . . . . 29<br />
5.1 Klassendiagramm . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />
5.2 Diagramm zur index.php . . . . . . . . . . . . . . . . . . . . . . . . 41<br />
6.1 Aufteilung zwischen Footer und Head . . . . . . . . . . . . . . . . . 66<br />
6.2 Ablauf beim Event Navigation . . . . . . . . . . . . . . . . . . . . . 75<br />
6.3 Ablauf beim Event Auswahl . . . . . . . . . . . . . . . . . . . . . . 76<br />
6.4 Ablauf beim Event zusätzliche Auswahl . . . . . . . . . . . . . . . . 78<br />
B.1 Die Startseite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91<br />
B.2 Konfigurator für Triathlonräder . . . . . . . . . . . . . . . . . . . . 92<br />
B.3 Konfigurator für <strong>Renn</strong>räder . . . . . . . . . . . . . . . . . . . . . . 93<br />
Diplomarbeit<br />
IV
Einführung<br />
Das Ziel dieser Arbeit war es mit Hilfe von kostengünstigen Mitteln einen <strong>Web</strong><strong>basierten</strong><br />
Konfigurator für <strong>Renn</strong>- und Triathlonräder zu erstellen. Um die Entwicklungskosten<br />
zu minimieren wurden die Skriptsprache PHP und die open-source Datenbank<br />
MySQL gewählt. In Auftrag gegeben wurde das Projekt won der Firma<br />
all4triathlon.com, einem Internethandel, der sich auf die Nischensportart Triathlon<br />
spezialisiert hat. Eine Recherche im Internet hat ergeben, dass viele schon vorhandene<br />
Konfiguratoren für z. B. <strong>Renn</strong>räder sehr unzureichend sind [NR05] oder nur<br />
eine Marke unterstützen [Bik06]. Dieser Umstand sollte mit diesem Konfigurator<br />
geändert werden, so dass ein benutzerfreundliches Programm unabhängig von Herstellern<br />
existiert.<br />
Mit Hilfe des <strong>Konfigurators</strong> kann sich ein Benutzer, unter Berücksichtigung der<br />
Abhängigkeiten der einzelnen Komponenten, sein Wunsch-Fahrrad“ erstellen. Diese<br />
Abhängigkeiten galt es in PHP zu realisieren, in dem eine so genannte Rule- ”<br />
”<br />
Engine“ entworfen wurde, so dass am Ende ein <strong>Renn</strong>rad erstellt wird, bei dem die<br />
einzelnen Teile sich auch tatsächlich von einem Mechaniker zusammenbauen lassen.<br />
Zusätzlich mussten nicht nur die komponentenspezifischen Daten gespeichert und<br />
dargestellt werden, sondern es sollten auch der Preis und das Gewicht automatisch<br />
berechnet werden. Eine weitere Anforderung an den Prototypen war, dass, nachdem<br />
ein Rad zusammengestellt war, es möglich sein sollte ein oder mehr weitere<br />
Räder zu konfigurieren. In einer Gesamtübersicht sollten dann alle erstellten Räder<br />
angezeigt werden, so dass man die Gelegenheit hat alle <strong>Renn</strong>räder miteinander zu<br />
vergleichen.<br />
Der fertige Prototyp ist unter der Internetadresse http://www.radtraum.de<br />
erreichbar.<br />
Diplomarbeit<br />
V
Kapitel 1<br />
PHP vs. Java<br />
Am Anfang er Entwicklung stellte sich natürlich die Frage mit welchen Mitteln der<br />
Konfigurator erstellt werden sollte. Manche Programmiersprachen schieden von<br />
vornherein aus. Dazu gehören z. B. C/C++, Delphi oder Pascal. Unter anderem<br />
weil die Sprachen nicht für <strong>Web</strong>anwendungen zu verwenden sind. Am Ende kamen<br />
nur Java bzw. JSP 1 oder PHP in Frage. Beide (Skript-)Sprachen sind hervorragend<br />
geeignet für Anwendungen im Internet und ebenso können beiden Sprachen den<br />
Anforderungen des <strong>Konfigurators</strong> gerecht werden.<br />
In diesem Kapitel soll auf die Eigenschaften und auf die Vor-/Nachteile der jeweiligen<br />
Sprache eingegangen werden. Auch werden typische Anwendungen von Java<br />
und PHP vorgestellt. Gegen Ende des Kapitels wird ein Resümee gezogen, wobei<br />
sich von vornherein die Frage stellt, ob sich diese Sprachen überhaupt vergleichen<br />
lassen.<br />
1.1 Java<br />
Angefangen hat die Entwicklung von Java im Jahre 1991 unter dem Namen Green ”<br />
Project“. Ursprünglich war eine komplette Betriebssystemumgebung geplant und<br />
1992 gab es die erste funktionsfähige Anwendung, in der mittels Touchscreen und<br />
1 Java Server Pages<br />
Diplomarbeit 1
KAPITEL 1. PHP VS. JAVA<br />
GUI 2 mehrere Geräte interaktiv gesteuert werden konnten. Das bevorzugte Betätigungsfeld<br />
sollte aber das immer populärere Internet werden. Im Jahre 1995 wurde<br />
dann Java erstmals offiziell der Öffentlichkeit vorgestellt. Mit der Kooperation<br />
zwischen Netscape und Sun kam der Durchbruch für Java. Die erste Version, also<br />
Java 1.0, wurde dann 1996 veröffentlicht. Es waren zwar noch nicht viele Pakete<br />
enthalten, was sich aber mit der Version 1.1 aus dem Jahre 1997 änderte. Damals<br />
wurden heute selbstverständliche Funktionen, wie JavaBeans oder JDBC 3 zum Zugriff<br />
auf Datenbanken, erstmals implementiert. Mit der ein Jahr später erschienen<br />
Version 1.2 änderte sich der Name in Java 2. So hießen die Produkte nicht mehr<br />
JDK1.2 sondern J2SDK 4 . Eine herausragende Neuerung in dieser Version war ein<br />
so genannter Just-in-Time Compiler, so dass Java-Programme deutlich schneller<br />
liefen als vorher. Hinzu kamen noch verschiede Änderungen an den Standard-<br />
Bibliotheken. Im Jahr 2000 kam die nächste Version auf den Markt, bei dem neben<br />
einer erweiterten API 5 auch weitere Optimierungsroutinen implementiert wurden.<br />
Nach zwei weiteren Jahren erschien die Version 1.4, in welcher erneut Änderungen<br />
an der Programmiersprache selbst vorgenommen wurden. Zuletzt geschah dies in<br />
Version 1.1. Implementiert wurden auch Erweiterungen die eine Serverprogrammierung<br />
vereinfachen sollten, wie z. B. mit JSPs. Die momentan (Stand Juli 2006)<br />
aktuelle Version ist 1.5, in der unter anderem generische Typen oder weitere Hilfsklassen<br />
eingeführt wurden. Die Version wurde aber wieder umbenannt und heißt<br />
nun Java 5.0 [Wik06a].<br />
So weit der Überblick der Geschichte von Java. Doch warum sollte ein Entwickler<br />
überhaupt Java oder Java Server Pages wählen? Die üblichen Vorteile, die immer<br />
wieder genannt werden, sind z. B. die Portabilität und die Vielseitigkeit der Sprache.<br />
Nachfolgend werden die Vor- und Nachteile von Java, JSP usw. hervorgehoben<br />
und analysiert.<br />
2 Graphical User Interface<br />
3 Java DataBase Connectivity<br />
4 Java 2 Software Development Kit<br />
5 Application Programming Interface<br />
Diplomarbeit 2
KAPITEL 1. PHP VS. JAVA<br />
1.1.1 Die Vor- und Nachteile bei Java und JSP<br />
Zum Anfang eine Eigenschaft von Java,, welche noch immer im Internet zu lesen,<br />
jedoch mittlerweile überholt ist. Es wird oft genannt, dass Java eine clientseitige<br />
Sprache sei [Ind06]. Z. B. durch JSP ist Java heute eher eine serverseitige Sprache<br />
geworden.<br />
Den größten Vorteil, den Java besitzt ist die Plattformunabhängigkeit. So ist ein<br />
einmal kompilierter Code auf jedem System einsetzbar, dass die JVM installiert<br />
hat. Dies wird auch als write once, run everywhere“ umschrieben. Aber durch die<br />
”<br />
Java Virtual Machine ergeben sich auch Nachteile. Es muss eine JVM erst einmal<br />
auf dem System vorhanden sein, damit der Java-Code läuft. Als großer Vorteil<br />
wird bei Java immer wieder die Skalierbarkeit angeführt. Skalierbarkeit bedeutet,<br />
dass eine Anwendung problemlos auf größere Rechnersysteme übertragen werden<br />
kann, wenn es die Benutzerzahlen bzw. die Systembelastung erfordert. So kann ein<br />
Javaprogramm ohne weitere Optimierung viele Aufgaben bewältigen, so lange die<br />
Hardware stimmt [Hom06b].<br />
Der nächste Vorteil ist die Testbarkeit von Programmen. Dieses wird häufig durch<br />
Komponentenmodelle wie EJB erreicht. Da diese Enterprise Java Beans<br />
unabhängig voneinander Aufgaben erfüllen können, werden diese Funktionen üblicherweise<br />
auch getrennt getestet, so dass das Aufspüren von Fehlern leichter ist<br />
[Ihn06]. Dieser Vorteil wird seit PHP4, und besonders seit PHP5, aufgehoben, da<br />
objektorientiertes Programmieren nun auch dort möglich ist. Wobei man allerdings<br />
sehr viel mehr Disziplin“ beim Erstellen des Codes haben muss, um die gleiche<br />
”<br />
Testbarkeit und Modularität von Java zu erreichen.<br />
Das führt direkt zu einem weitern Vorteil bzw. Nachteil, je nach Sichtweise: Bei<br />
Java ist Vieles von vornherein definiert und abstrahiert. So müssen bei Java Variablentypen<br />
und Klassen deklariert werden, oder es müssen Referenztypen angegeben<br />
werden um objektorientiert zu arbeiten. Das bringt aber auch Typensicherheit. Außerdem<br />
muss Java über eine main-Funktion verfügen damit der Java-Interpreter<br />
einen so genannten Startpunkt hat.<br />
Falls eine komplette Entwicklungsumgebung mit dazugehörigem Server gekauft,<br />
bzw. gemietet werden soll, so sind die Kosten üblicherweise nicht gering. Eine<br />
Diplomarbeit 3
KAPITEL 1. PHP VS. JAVA<br />
einzige Benutzerlizenz für Sun Java Studio Enterprise 7 kostet schon 1.850 e; eine<br />
Verlängerung der Lizenz kostet nochmals 1.300 e 6 . Für eine Java-Application-<br />
Server Software wird jährlich nochmals 1.950 e 7 verlangt [Cat06]. Allein an diesen<br />
Preisdimensionen kann man sofort sehen, dass dies ein großer Nachteil von Java ist,<br />
und sich entweder nur für gut situierte Unternehmen und/oder große Anwendungen<br />
eignet.<br />
Ein weiterer Nachteil mag in dem relativ schweren Erlernen der Programmiersprache<br />
liegen. Auch die strikte Objektorientierung mag für manchen Anfänger<br />
zu abstrakt erscheinen. Weiterhin wird als Nachteil die längere Anlaufzeit“ <strong>eines</strong><br />
”<br />
Java-Projekts genannt. Wie lange allerdings die Gesamtentwicklungszeit einer Anwendung<br />
dauert, kommt natürlich auf das Projekt an. Dabei heißt es, dass je größer<br />
die Anwendung, desto kürzer ist die Entwicklungszeit gegenüber PHP [XF04].<br />
1.1.2 Anwendungsbereiche von Java<br />
Hauptsächlich wird Java in E-Business Anwendungen eingesetzt. Auch auf <strong>Web</strong>und<br />
Applikationsservern wird Java in diesem Bereich verwendet. Die J2EE bietet<br />
hierfür einen modularen Aufbau und die Möglichkeit mehrschichtige Anwendungen<br />
zu erstellen. Das Spektrum reicht hier von Call-Center Lösungen über Kundeninformationssystemen<br />
bis hin zu graphischen Editoren [ID06].<br />
Applets sind bzw. waren ein wichtiges Aufgabengebiet von Java. Gegen Ende der<br />
neunziger Jahre war ein Java-Chatraum, das eigentlich eine Applet war, Normalität.<br />
Andere Anwendungen fanden sich in der Datenpräsentation, in Animationen<br />
und Visualisierungen. Heute sind Applets nicht mehr so verbreitet, werden aber<br />
immer noch gerne zu Visualisierungszwecken in Wissenschaft und Technik benutzt.<br />
Heutzutage findet man Java auch in kleinen, mobilen Geräten wie einen PDA<br />
oder das Mobiltelefon. Hier können dann verschiedenste Anwendungen, vom Spiel<br />
bis zum Fahrplan 8 , ausgeführt werden. Allerdings wird nur das Notwendigste der<br />
6 jeweils ohne MWSt.<br />
7 ohne MWSt.<br />
8 siehe www.mofahr.de<br />
Diplomarbeit 4
KAPITEL 1. PHP VS. JAVA<br />
JVM implementiert - die kleinste Version der J2ME, CLDC genannt [Hom06a],<br />
verzichtet sogar auf Berechnung von Fließkommazahlen.<br />
1.2 PHP<br />
PHP ist als Programmiersprache relativ jung. Erst 1995 wurde sie aus einer Sammlung<br />
Perl-Skripten erschaffen. Der Name stand damals noch für Personal Home<br />
”<br />
Page“. 1997 wurde dann PHP 2.0 veröffentlicht, in dem ein Form Interpreter beinhaltet<br />
war. Deshalb wurde auch von PHP/FI gesprochen. Es war Perl recht ähnlich,<br />
wenn auch eingeschränkter und einfacher.<br />
PHP3 wurde neu geschrieben, da die alten Versionen dem e-commerce nicht mehr<br />
genügten. Es erschien 1998. Die Entwicklung des Form Interpreters wurde bald<br />
darauf eingestellt. Es wurde die Firma Zend Technologies gegründet und somit<br />
wurde 2000 die Zend-Engine, die das Herzstück von PHP4 darstellte veröffentlicht,<br />
in der auch einfache objektorientierte Programmierung möglich war. Auch<br />
die Bedeutung der Abkürzung wurde geändert. PHP steht nun für ein rekursives<br />
Akronym und heißt PHP: Hypertext Processor. Der nächste Meilenstein für<br />
diese Sprache kam 2004, als PHP5 veröffentlicht wurde. Nun war ernsthafte OO-<br />
Programmierung möglich, und es kamen Java-ähnliche Funktionen wie Exceptions<br />
vor. Die aktuellste Version ist derzeit 5.1. [Wik06b] [Bra05]<br />
Vor allem das gegen Ende der neunziger Jahre stark anwachsende World Wide<br />
<strong>Web</strong> verlangte nach einer Skriptsprache, die fähig ist, dynamische <strong>Web</strong>seiten darzustellen.<br />
Die damals als Standard geltende Sprache Perl wurde von PHP in der<br />
Popularität überholt, da sie als einfacher zu erlernen gilt.<br />
PHP ist eine serverseitige Skriptsprache und wird fast ausschließlich für <strong>Web</strong>anwendungen<br />
angewandt. Natürlich ist auch ein Zugriff auf Datenbanken, insbesondere<br />
MySQL, möglich. Gerne werden die Vorzüge von PHP genannt: leichte Erlernbarkeit,<br />
schnellere Performance oder einfachstes Zusammenspiel mit HTML.<br />
Nachstehend werden die Vor- und auch die Nachteile einer PHP-<strong>basierten</strong> Anwendung<br />
beschrieben.<br />
Diplomarbeit 5
KAPITEL 1. PHP VS. JAVA<br />
1.2.1 Die Vor- und Nachteile bei PHP<br />
Der größte Vorteil ist wohl, dass PHP über die GPL 9 vertrieben wird. Das bedeutet,<br />
es ist freie Software. Der Quelltext kann von jedem eingesehen werden, und<br />
daher ist eine GPL-Software auch kostenlos. Ebenso ist MySQL eine freie Software<br />
und kann kostenfrei heruntergeladen werden. Dadurch werden für PHP-Projekte<br />
gegenüber Java weniger Geldmittel aufgewendet werden müssen [Bra05].<br />
Der nächste positive Aspekt von PHP liegt in dem von vornherein großen Funktionsumfang,<br />
wie z. B. optimierte Funktionen zu Datenbankanbindungen, Netzwerken<br />
oder (seit PHP5) XML. Diese stehen sofort zur Verfügung, ohne dass die<br />
Funktionen/Bibliotheken erst importiert oder inkludiert werden müssen. Dadurch<br />
kann sich auch die Entwicklungszeit <strong>eines</strong> Projekts verkürzen, da viele dieser Funktionen<br />
nicht erst selbst erstellt werden brauchen [Mor02b].<br />
Ein häufig genannter Vorteil ist die Performancegeschwindigkeit, die viel höher<br />
liegen soll als die von Java. Allerdings gibt es in der Praxis zu viele Faktoren, wie<br />
z. B. die Leistungsfähigkeit des Server-Computers und die des Client-Rechners, um<br />
einen Unterschied festzustellen.<br />
Die im Java-Teil schon erwähnte, strenge Typisierung entfällt bei PHP völlig. So<br />
braucht man Variablen nicht deklarieren, denn die erste Zuweisung bestimmt den<br />
Typ. Auch kann man, z. B. bei einer switch-Anweisung, fast jeden Typ verwenden<br />
[Hat02]. Doch dadurch geht auch die Typensicherheit verloren und macht Javatypische<br />
Funktionen wie Polymorphie unmöglich.<br />
Nachteile ergeben sich durch den erhöhten Netzwerktraffic. Da PHP serverseitig<br />
funktioniert, müssen bei jeder zu prüfenden Eingabe diese Daten an den Server<br />
gesendet werden. Diese können durch JavaScript zwar minimiert werden, doch das<br />
ist umständlich und stellt auch nur eine Vorprüfung“ dar [Mor02a].<br />
”<br />
Ein ganz großer Nachteil (insbesondere für größere Projekte) dürfte in der fehlenden<br />
Modularität liegen. Java ist von vornherein auf mehrschichtige Anwendungen<br />
abgestimmt, während man bei PHP schon recht disziplinierter“ arbeiten muss,<br />
” 9 General Public Licence<br />
Diplomarbeit 6
KAPITEL 1. PHP VS. JAVA<br />
um alle Aufgaben sauber von einander zu trennen. Dieses reduziert die Übersichtlichkeit,<br />
die Wartbarkeit und den Wiederverwendungswert [WC04].<br />
1.2.2 Typische Anwendungen bei PHP<br />
Es gibt im Grunde genommen nur einen Anwendungsbereich von PHP, und das<br />
sind dynamische <strong>Web</strong>seiten, bei denen Daten aus einer Datenbank entnommen<br />
werden.<br />
Aber da das <strong>Web</strong> viele Anwendungsmöglichkeiten bietet, sind auch die Bereiche in<br />
denen PHP verwendet wird sehr unterschiedlich. Der oben genannte, grundlegende<br />
Prozess kann mitunter auch sehr Komplex werden. Das einfachste Beispiel wäre<br />
eine Homepage <strong>eines</strong> Hobbyprogrammierers. Das kann bei einem selbst erstellten<br />
Gästebuch oder einem Forum anfangen. Das Ganze kann bis zu einer Unternehmenspräsenz<br />
mit Homepage, e-commerce-shop [osC06] und Content Management<br />
System (CMS) [Typ06] gehen.<br />
Aber es gibt auch neben dem Internet Anwendungsgebiete für PHP. Allerdings<br />
sind diese recht unbedeutend, da es für diese Aufgaben bessere Programmiersprachen<br />
gibt (z. B. Java). Es handelt sich beispielsweise hierbei um Kommandozeilen-<br />
Skripte für häufig verwendete Aufgaben, wobei nur der PHP Interpreter benötigt<br />
wird. Ein weiteres Beispiel ist die clientseitige GUI-Programmierung. Dazu wird<br />
allerdings die Erweiterung PHP-GTK 10 verwendet [Gle03].<br />
1.3 PHP vs. Java - überhaupt vergleichbar?<br />
Auf einer Seite im Internet wird behauptet ein Vergleich zwischen Java und PHP<br />
sei wie ein Vergleich zwischen Coke und Pepsi“ oder Hulk Hogan und Mr. T“<br />
” ”<br />
[Nor03]. Trotz dieser zugegebenermaßen seltsamen Analogie ist es wahr, dass sich<br />
diese beiden Sprachen nicht ohne weiteres Vergleichen lassen. Jede Programmiersprache<br />
hat seine Vor- und Nachteile. Deshalb könnte eigentlich diese Diskussion<br />
damit abgeschlossen werden, indem behauptet wird:<br />
10 GIMP (GNU Image Manipulation Program) Tool Kit<br />
Diplomarbeit 7
KAPITEL 1. PHP VS. JAVA<br />
Grundsätzlich bestimmen die Anforderungen des Kunden welches System<br />
zu Einsatz kommt.[Con04]<br />
Doch welches System kommt wann zum Einsatz? Im Grunde genommen kann<br />
man sagen, dass je größer und umfangreicher eine Anwendung wird, desto eher<br />
sollte Java die Sprache der Wahl sein. Als Beispiel kann man das System <strong>eines</strong><br />
Call-Centers nutzen. Dort müssen viele Informationen von tausenden von Kunden<br />
verfügbar sein. Diese Informationen müssen von jedem Call-Center Mitarbeiter<br />
manipulierbar sein, und zusätzlich muss es nachvollziehbar sein, welcher Arbeiter<br />
welche Änderungen vorgenommen hat. Dies ist ein System, das hunderte bis tausende<br />
von Anfragen pro Minute hat und eine riesige Datenbank verwalten muss.<br />
Dabei kann Java z. B. auch die Verteilung der Anrufe steuern. Das Ganze muss<br />
auch so automatisch, d.h. so effizient wie möglich erfolgen.<br />
Die Skriptsprache PHP wäre dabei überfordert, da unter anderem PHP ein so<br />
genanntes Multithread System (mit dem Apache-Server) ist, während Java ein<br />
Multiprocess System darstellt und somit mehrere Aufgaben gleichzeitig erledigen<br />
kann. Außerdem ist es mit PHP nicht möglich auf so genannte Low-Level Ressourcen<br />
zuzugreifen, so dass keine Hardware gesteuert werden kann.<br />
Anders herum ist natürlich PHP vorzuziehen. Besonders bei kleineren oder mittleren<br />
Projekten ist die Entwicklungszeit sehr kurz. Es macht keinen Sinn ein Javasystem<br />
für eine Homepage oder einfache Internetpräsenz <strong>eines</strong> Unternehmens zu<br />
nutzen. Auch bei etwas größeren Projekten, wie eine e-commerce Applikation oder<br />
ein Content Management System, wäre PHP geeigneter wergen den geringeren<br />
Kosten und der (wahrscheinlich) kürzeren Entwicklungszeit.<br />
Als Fazit der Gegenüberstellung der beiden doch recht unterschiedlichen Programmiersprachen<br />
kann man sagen:<br />
Obwohl PHP schneller erste Fortschritte erzielt, ist bei großen Anwendungen eher<br />
damit zu rechnen, dass die Java-Version schneller fertig gestellt wird. Deshalb ist,<br />
wie schon erwähnt bei großen und umfangreichen Projekten Java zu bevorzugen.<br />
Im Umkehrschluss heißt es also, dass bei kleineren und mittleren Projekten, bei<br />
denen nicht so viel Performance benötigt wird, PHP vorzuziehen ist.<br />
Diplomarbeit 8
KAPITEL 1. PHP VS. JAVA<br />
Für das Projekt mit der <strong>Erstellung</strong> des <strong>Konfigurators</strong> stand dann fest, dass PHP<br />
verwendet werden sollte. Die <strong>Web</strong>anwendung ist nicht so umfangreich, dass ein<br />
Team von Programmierern zur Realisierung benötigt wäre. Ebenso wäre eine derart<br />
teure Anschaffung, wie die einer Lizenz für Java Studio Enterprise 7, für dieses<br />
Projekt kaum gerechtfertigt.<br />
Diplomarbeit 9
Kapitel 2<br />
Das <strong>Renn</strong>-/Triathlonrad<br />
Ein <strong>Renn</strong>- bzw. Triathlonrad besteht aus vielen Komponenten, die nicht beliebig<br />
austauschbar sind. Es stand früh fest, dass dies ein interdisziplinäres Projekt werden<br />
würde. Nicht nur Programmierfähigkeiten waren notwendig, sondern auch ein<br />
technisches und mechanisches Verständnis für den Aufbau einer solchen <strong>Renn</strong>maschine“.<br />
Daher bestand ein nicht unerheblicher Teil dieser Diplomarbeit daraus,<br />
”<br />
zu ermitteln, welche Komponenten bzw. Komponentengruppen sich überhaupt für<br />
einen Konfigurator eignen.<br />
Als Beispiel kann das Laufrad genannt werden: es besteht aus Felge, Speichen, Nabe<br />
und Schnellspanner. Jedes dieser Teile ließe sich einzeln kaufen und so könnte<br />
man nur für das Laufrad vier weitere Bauteile in den Konfigurator aufnehmen. Dieses<br />
detailgenaue Erstellen <strong>eines</strong> <strong>Renn</strong>rades würde allerdings den Rahmen sprengen,<br />
und so mussten Bauteilgruppen zusammengefasst werden 11 um eine überschaubare<br />
Menge an Komponenten zu erhalten.<br />
Der nächste zeitaufwändige Teil bestand darin, zu ermitteln, in welchen Abhängigkeiten<br />
diese Komponenten zueinander standen, bzw. wie diese Bauteile zusammengebaut<br />
werden. Unter anderem wurden bei unterschiedlichen Herstellern unterschiedliche<br />
Bezeichnungen verwendet, so dass erst herausgefunden werden musste,<br />
welche dieser Bezeichnungen das Gleiche bedeuteten. Als Beispiel kann man die<br />
Größe der Laufräder verwenden, denn dort gibt es drei Bezeichnungen für den<br />
11 Die Komponenten Kurbelsatz und Schaltgruppe bestehen ebenfalls aus mehreren Einzelteilen<br />
Diplomarbeit 10
KAPITEL 2. DAS RENN-/TRIATHLONRAD<br />
gleichen Durchmesser: normal ist ein Durchmesser von 28 ”. Die Bezeichnung von<br />
Reifen- und Schlauchherstellern lautet hier für 663, was diese Größe in mm angibt,<br />
während die traditionelle französische Bezeichnung 700C ist, und oft von<br />
Laufradherstellern verwendet wird.<br />
Abbildung 2.1: Übersicht Fahrrad-Komponenten<br />
2.1 Aufbau und Komponenten<br />
An diesem Punkt sind die Komponenten aufgelistet, die in dem Konfigurator Verwendung<br />
finden. Da die Benutzung ein gewisses Vorwissen über den Aufbau <strong>eines</strong><br />
<strong>Renn</strong>rades erfordert, das die Zielgruppe zweifellos besitzt, werden die einzelnen<br />
Baugruppen beschrieben, und es wird erklärt was deren Funktionen sind. Abbildung<br />
2.1 zeigt wo an einem <strong>Renn</strong>rad die Komponenten zu finden sind.<br />
Diplomarbeit 11
KAPITEL 2. DAS RENN-/TRIATHLONRAD<br />
Rahmen Der Rahmen ist das Herzstück des Fahrrades, da fast alle anderen Bauteile<br />
daran angebaut werden. An dieser Komponente werden direkt der Steuersatz,<br />
die Gabel, die Sattelstütze und der Kurbelsatz befestigt. Eine wichtige<br />
Einheit bei der Auswahl <strong>eines</strong> Rahmens ist die Rahmenhöhe.<br />
Steuersatz Diese Komponente hält Gabel und Rahmen zusammen und sorgt mit<br />
den Kugellagern dafür, dass diese auch beweglich bleibt. Der untere Teil des<br />
Steuersatzes wird auf die Gabel geschoben, und diese beiden Bauteile werden<br />
dann durch das Steuerrohr des Rahmens geschoben. Mit dem oberen Teil des<br />
Steuersatzes wird dann die Gabel an das Rohr festgeklemmt.<br />
Gabel An der Gabel werden am oberen Ende der Vorbau, der Lenker und (beim<br />
Triathlonrad bzw. Zeitfahrrad) der Aeroaufsatz montiert. Am unteren Ende<br />
wird das vordere Rad befestigt. Die Gabel wird, wie schon beschrieben, mit<br />
Hilfe des Steuersatzes an das Steuerrohr des Rahmens befestigt.<br />
Vorbau Der Vorbau ist das Verbindungsstück zwischen Gabel und Lenker. Er<br />
wird in verschiedenen Längen gefertigt, die individuell vom Fahrer ausgewählt<br />
werden. Ein Vorbau kann auch einen bestimmten Winkel besitzen, damit der<br />
Lenker eine für den Fahrer optimale Höhe erreichen kann.<br />
Lenker Der Lenker ist an dem Vorbau befestigt, und er kann verschiedene Breiten<br />
von 40 cm bis 44 cm haben. Diese muss von Fahrer individuell gewählt werden.<br />
An dem Lenker sind bei einem <strong>Renn</strong>rad die Schalt-Bremshebel befestigt<br />
(Die Schaltung und die Bremse befinden sich in einem Bauteil).<br />
Aeroaufsatz Dieses Bauteil wird nur bei Zeit- bzw. Triathlonrädern verwendet.<br />
Durch den Aufsatz wird eine aerodynamischere Fahrposition erreicht. Hier<br />
befinden sich die Schalthebel am Ende es Aufsatzes, während sich die Bremsen<br />
am Lenker befinden.<br />
Laufräder Die Laufräder sind ein für die Aerodynamik wichtiges Bauteil. Sie<br />
können je nach Einsatzzweck normale Speichen und Felgen, (für normale<br />
Radrennen), oder besonders aerodynamisch Geformte, bis hin zu einer Scheibe<br />
am Hinterrad (für Zeitfahren u. ä.) haben. Bei speziell für Aerodynamik<br />
Diplomarbeit 12
KAPITEL 2. DAS RENN-/TRIATHLONRAD<br />
und Gewicht ausgerichtete Laufräder spricht man auch von Systemrädern.<br />
Zusätzlich wird zwischen Schlauch- und Drahtreifen unterschieden. Auch gibt<br />
es zwei verschiedene Arten von Naben am hinteren Laufrad, die mit dem<br />
Hersteller für die Schaltgruppe kompatibel sein müssen.<br />
Reifen Den Kontakt zum Boden bilden die Reifen. Es gibt spezielle Gummi-<br />
Mischungen für Wettkampf und Training. Außerdem wird zwischen Schlauchreifen<br />
und Drahtreifen unterschieden. Erstere werden wie normale Reifen<br />
gehandhabt, während letztere aufwändig auf das Laufrad geklebt werden.<br />
Kurbelsatz Dies ist eine Bauteilgruppe, die aus sehr vielen Einzelteilen besteht,<br />
die, wenn sie einzeln zusammengestellt werden sollten, den Umfang <strong>eines</strong><br />
<strong>Konfigurators</strong> sprengen würden. Doch viele Hersteller bieten Komplettsysteme<br />
an. Ein Kurbelsatz besteht aus zwei bzw. drei Kettenblättern, zwei Kurbeln,<br />
einer Achse und dazu passendes Tretlagergehäuse samt Kugellager. Die<br />
Kurbeln werden in verschiedenen Längen angeboten, die entsprechend den<br />
Vorlieben des Fahrers ausgewählt werden.<br />
Schaltgruppe Hier gibt es nur zwei weltweit führende Hersteller, Shimano und<br />
Campagnolo, deren Systeme untereinander nicht kompatibel sind. Auch die<br />
Schaltgruppe besteht aus vielen Einzelteilen, wie z. B. einem vorderen und<br />
hinteren Umwerfer, der für das Wechseln der Kette auf die verschiedenen<br />
Ritzel bzw. Kettenblätter zuständig ist. Des weiteren gehört zu einer Schaltgruppe<br />
ein Ritzelpaket, auch Kassette genannt. Es besteht aus neun bis zehn<br />
unterschiedlich großen Ritzeln, die auf die hintere Nabe des Laufrades gesteckt<br />
werden. Ein weiteres Bauteil ist der so genannte Käfig, der dafür<br />
sorgt, dass die Kette stets gespannt bleibt. Zur Schaltgruppe gehören auch<br />
die Schalt-Bremshebel.<br />
Bremsen Mit den Bremsen ist der tatsächliche Bremskörper gemeint. Die Bremsbacken<br />
greifen an der Felge des Laufrades und verlangsamen so die Fahrt.<br />
Pedale Die Pedale werden an das Ende der Kurbeln vom Kurbelsatz geschraubt.<br />
Sie sind üblicherweise so genannte Klick-Pedale, mit denen dann der Radschuh<br />
fest an der Pedale befestigt ist. Das hat den Vorteil, dass nicht nur Vor-<br />
Diplomarbeit 13
KAPITEL 2. DAS RENN-/TRIATHLONRAD<br />
triebskraft beim Herunterdrücken der Pedale ausgeübt wird, sondern zusätzlich<br />
auch beim Hochziehen Vortrieb geleistet wird, da die Schuhe mit den<br />
Pedale fest verbunden sind.<br />
Sattelstütze Eine Sattelstütze ist nicht nur notwendig um einen Sattel zu befestigen,<br />
sondern sie sollte auch entsprechend der individuellen Körpergröße des<br />
Fahrers verstellbar sein. Da die Stütze dem Fahrtwind ausgesetzt ist, werden<br />
oft aerodynamische Ansprüche an diese Komponente gestellt.<br />
Sattel Auf dem Sattel sitzt der Fahrer die meiste Zeit, und ist somit optimal<br />
auf die menschliche Anatomie ausgerichtet. Es gibt sogar spezielle Sättel für<br />
Männer und Frauen, sowie je nach Fahrstil ausgerichtete Sättel.<br />
2.2 Abhängigkeiten der Komponenten<br />
In diesem Abschnitt werden die Abhängigkeiten der Komponenten untereinander<br />
aufgezählt bzw. welche Größen mit welchen Komponenten zusammenpassen. Auch<br />
hier gilt, dass ein gewisses Vorwissen von Namen und Bezeichnungen vorhanden<br />
sein sollte. Abbildung 2.1 kann dabei eine Hilfe sein.<br />
Rahmen An einen Rahmen werden viele weitere Bauteile angebracht. Weil der<br />
Rahmen die zentrale Komponente ist, sind viele andere Elemente von den<br />
Maßen des Rahmens abhängig. So gibt es verschiedene Größen für das Steuerrohr,<br />
das Tretlager, die Sattelstütze, und – je nach Rahmenhöhe 12 – die<br />
Laufräder.<br />
Das Steuerrohr kann einen Durchmesser von 1 ” oder 1 1 /8 ” haben. Das wirkt<br />
sich dann auf den Steuersatz, die Gabel und den Vorbau aus. Die Sattelstütze<br />
kann verschiedenste Maße zwischen 26 mm und 34 mm Durchmesser annehmen.<br />
Auch das Tretlager, das zum Kurbelsatz gehört, kann zwei unterschiedliche<br />
Maße haben: ITA (metrisch, 70 mm Durchmesser) und BSA (imperial,<br />
12 Die Rahmenhöhe leitet sich von der Schritthöhe des Fahrers ab.<br />
Diplomarbeit 14
KAPITEL 2. DAS RENN-/TRIATHLONRAD<br />
68 mm Durchmesser), um die traditionellen Größen-Bezeichnungen zu benutzen.<br />
Zuletzt hängen auch noch die Durchmesser der Laufräder, und damit<br />
auch die Größe bzw. Länge der Gabel, von dem Rahmen ab, denn unter<br />
einer Rahmenhöhe von 52 cm werden üblicherweise 26 ” anstatt 28 ” Räder<br />
verwendet.<br />
Steuersatz Hier ist es wichtig welche Größe das Steuerrohr des Rahmens, und<br />
somit der Gabelschaftdurchmesser hat. Beträgt das Maß nur 1 ” können nur<br />
Steuersätze mit dem gleichen Maß verwendet werden. Bei 1 1 /8 ” verhält es<br />
sich genau so.<br />
Gabel Bei dieser Komponente sind zwei Maße wichtig: der Gabelschaftdurchmesser<br />
und ob die Gabel für 26 ” oder 28 ” Räder geeignet ist. Beides ergibt sich<br />
aus der Rahmengeometrie, d.h. zum einen der Durchmesser des Steuerrohrs<br />
und zum anderen die Rahmenhöhe.<br />
Vorbau Der Vorbau hat drei Maße, die zu beachten sind, wobei eine zwar wichtig<br />
für den Fahrer ist, aber unerheblich für den Konfigurator. Es handelt sich<br />
hierbei um die Länge des Vorbaus. Diese ist je nach Vorlieben und Körpergröße<br />
des Fahrers unterschiedlich.<br />
Eines der beiden Maße, die für das Programm von Bedeutung sind, wäre<br />
der Durchmesser für das Loch, das auf den Gabelschaft montiert wird. Diese<br />
Größe hängt, wie der Steuersatz und die Gabel selber auch, von dem Durchmesser<br />
des Steuerrohrs am Rahmen ab. Hier gibt es die schon genannten<br />
Maße 1 ” und 1 1 /8 ”.<br />
An der anderen Seite des Vorbaus ist die Öffnung, an die der Lenker festgeklemmt<br />
wird. Hier werden die Maße wieder in Millimeter angegeben. Üblich<br />
sind 26.0 mm und 31.8 mm als Lenkerrohrdurchmesser. Je nach dem welche<br />
Größe dieser Durchmesser bei dem ausgewählten Vorbau hat, werden bei der<br />
Komponente Lenker nur die entsprechenden Artikel angezeigt.<br />
Lenker Wie oben erwähnt, sind die Lenkerrohrdurchmesser 26.0 mm und 31.8 mm<br />
üblich. Diese Maße sind auch später für den Aeroaufsatz wichtig, falls ein<br />
Triathlonrad gewählt wurde. Es sind noch andere Informationen über den<br />
Lenker von Bedeutung. So muss z. B. angegeben sein, ob dieser Lenker nicht<br />
Diplomarbeit 15
KAPITEL 2. DAS RENN-/TRIATHLONRAD<br />
schon vom Hersteller aus über einen Aeroaufsatz verfügt. Diese Art Lenker<br />
dürfen dann nicht angezeigt werden wenn ein <strong>Renn</strong>rad konfiguriert werden<br />
soll. Es kann auch vorkommen, dass ein Lenker nicht dafür geeignet ist, einen<br />
zusätzlichen Aeroaufsatz aufzunehmen. Dies muss auch berücksichtigt werden,<br />
und somit dürften diese Lenker nicht bei einem Triathlonrad angezeigt<br />
werden.<br />
Aeroaufsatz Diese Komponente steht nur zur Auswahl, wenn der Nutzer ein<br />
<strong>Renn</strong>rad konfigurieren möchte. Der Aeroaufsatz ist natürlich von den Vorgaben<br />
des Lenkers abhängig. Da der Aufsatz normalerweise auf den Lenker<br />
geklemmt wird, ist der Lenkerrohrdurchmesser hier von entscheidender Bedeutung.<br />
Allerdings bieten manche Hersteller so genannte Multi-Fit Systeme<br />
an, die bei (fast) allen Lenkern passen. Dies muss im Konfigurator ebenfalls<br />
berücksichtigt werden.<br />
Des Weiteren kann es vorkommen, dass ein Lenker schon vom Hersteller aus<br />
einen Aeroaufsatz fest montiert hat. Auch das ist ein Aspekt, der berücksichtigt<br />
werden muss.<br />
Laufräder Hier sind ebenso zwei übliche Maße zu beachten. Zum einen gibt es<br />
die 28 ” und die 26 ” Räder. Die Größe ist indirekt von der Körpergröße<br />
abhängig, denn diese bestimmt die Rahmenhöhe. Unterschreitet die Höhe<br />
einen bestimmten Betrag (üblich sind 52 cm), so werden automatisch im<br />
Konfigurator die kleineren Reifen gewählt. Zusätzlich gibt es noch, wie oben<br />
beschrieben, den Unterschied zwischen Draht- und Schlauchreifen. Diese Information<br />
ist für die Komponente Reifen wichtig.<br />
Eine weitere Eigenschaft, die später bei der Schaltgruppe und/oder dem Kurbelsatz<br />
wichtig wird, ist die Nabe des hinteren Laufrades. Auf diese Nabe<br />
wird die so genannte Kassette aufgesteckt, die aus bis zu zehn Kettenblättern<br />
besteht. Es gibt nur zwei marktbeherrschende Hersteller für Schaltgruppen<br />
im Radsport: Shimano und Campagnolo. Die Naben sind nicht untereinander<br />
kompatibel. Daher muss auch auf diese Eigenschaft beim Konfigurator<br />
geachtet werden.<br />
Diplomarbeit 16
KAPITEL 2. DAS RENN-/TRIATHLONRAD<br />
Reifen Die einzige Abhängigkeit, die hier besteht, ist der Unterschied zwischen<br />
den Schlauch- und Drahtreifen. Sie bestimmt welche Art der Reifen dargestellt<br />
wird. Eine weitere, aber für den Konfigurator nicht relevante Größe<br />
sind die Breite der Reifen.<br />
Kurbelsatz Bei der Vorauswahl <strong>eines</strong> Kurbelsatzes ist nicht nur zu beachten, dass<br />
die Tretlager dieser Komponente auch in das Tretlagergehäuse des Rahmens<br />
passen müssen. Es ist auch noch im Konfigurator zu prüfen, ob nicht schon<br />
die Laufräder gewählt wurden, und somit die Anzeige der Komponenten nicht<br />
weiter eingeschränkt wird. Abgesehen von der Kurbellänge, bestimmen die<br />
weiteren Maße und Eigenschaften <strong>eines</strong> Kurbelsatzes, welche Schaltgruppe<br />
später zur Auswahl steht.<br />
Da wäre die Art und Anzahl der Kettenblätter. Es gibt drei Variationen: die<br />
normale Ausführung mit zwei Blättern, die compact“ Version, mit ebenfalls<br />
”<br />
zwei Kettenblättern, aber kleinerem Durchmesser und weniger Zähnen, und<br />
die Variante mit drei Blättern. Die Anzahl der Zähne auf den Kettenblättern<br />
ist wichtig um die so genannte Kapazität des Schaltkäfigs bei der Schaltgruppe<br />
zu berechnen. Außerdem sind manche Schaltgruppen speziell auf compact<br />
oder dreifach-Antriebe ausgerichtet.<br />
Eine weitere Abhängigkeit besteht bei der Marke der Schaltgruppe. Da es<br />
nur die Marken Shimano oder Campagnolo gibt, und die einzelnen Teile nur<br />
bedingt bis gar nicht kompatibel untereinander sind, werden z. B. durch die<br />
Wahl <strong>eines</strong> Shimano-Kurbelsatzes auch nur Shimano-Komponenten bei der<br />
Kategorie Schaltgruppen angezeigt. Es gibt aber auch Anbieter von Kurbelsätzen,<br />
bei denen es möglich ist, Schaltgruppen von beiden Herstellern zu<br />
benutzten. Dies alles muss natürlich im Konfigurator berücksichtigt werden.<br />
Schaltgruppe Die Anzeige der Schaltgruppenkomponenten wird entweder durch<br />
die Wahl der Laufräder oder durch die Wahl des Kurbelsatzes eingeschränkt.<br />
Außerdem bewirkt die Berechnung der Kapazität der Kette eine weitere Vorauswahl.<br />
Andere Daten von vorherigen Komponenten dienen für die spätere<br />
Montage des Rades, und nicht mehr für die Funktionalität des <strong>Konfigurators</strong>.<br />
Weitere gespeicherte Eigenschaften der Schaltgruppe dienen noch zu<br />
Darstellungszwecken.<br />
Diplomarbeit 17
KAPITEL 2. DAS RENN-/TRIATHLONRAD<br />
Bremsen Hier gibt es keine Abhängigkeiten und keine Vorauswahl der Komponenten.<br />
Es kann sogar eine Campagnolo Bremse an ein Rad mit Shimano-<br />
Schaltgruppe montiert werden.<br />
Pedale Bei den Pedalen gibt es ebenfalls keine Abhängigkeiten mit anderen Bauteilen.<br />
Jede Pedale passt an jede Kurbel. Es gibt aber noch verschiedene<br />
Pedalsysteme 13 , die nur mit bestimmten Radschuhen kompatibel sind. Die<br />
sind allerdings nicht relevant für den Konfigurator – das muss der Nutzer<br />
selbst entscheiden, was für ein System er verwenden möchte.<br />
Sattelstütze Das einzige Maß auf das hierbei geachtet werden muss, ist der<br />
Durchmesser der Sattelrohraufnahme beim Rahmen. Weitere Eigenschaften,<br />
wie z. B. die Länge der Sattelstütze dienen nur zu Darstellungszwecken und<br />
sind nicht weiter relevant für die Vorauswahl von anderen Bauteilen.<br />
Sattel Auch hier gibt es keine Abhängigkeiten mit anderen Komponenten, denn<br />
auf jeder Sattelstütze lässt sich ein beliebiger Sattel montieren.<br />
13 Es gibt das so genannte Look-System und die SPD-Pedale von Shimano<br />
Diplomarbeit 18
Kapitel 3<br />
Das Programm aus Sicht des<br />
Nutzers<br />
3.1 Programmablauf<br />
Der Ablauf vom Zusammenstellen <strong>eines</strong> <strong>Renn</strong>rades sollte recht flexibel sein. Es<br />
wurde überlegt, welche Art von Nutzerführung am sinnvollsten erscheint. Zur Auswahl<br />
standen der so genannte Wizard-Mode“, in dem jede Komponente einzeln<br />
”<br />
und nacheinander durchgegangen wird, bis alle Bauteile ausgewählt sind. Dem gegenüber<br />
stand die freie Wahl der Reihenfolge, in der der Nutzer die Komponenten<br />
wählen kann. Natürlich ist wegen der Abhängigkeiten untereinander keine gänzlich<br />
freie Wahl möglich, aber in einem gewissen Rahmen ließe sich das realisieren.<br />
Für die assistierte Zusammenstellung sprach die relativ einfache Programmierung,<br />
aber auf der anderen Seite würde sich ein Nutzer zu sehr in seiner Wahlfreiheit<br />
eingeschränkt fühlen. Denn die Zielgruppe ist der schon fortgeschrittene Fahrer,<br />
der die einzelnen Komponenten an seinem Rad kennt, und der sich durch einen<br />
Assistenten-Modus eher bevormundet“ fühlen würde. Außerdem wäre der ganze<br />
”<br />
Prozess des Konfigurierens nicht sehr transparent.<br />
Für die (relativ) freie Wahl sprach eine bessere Benutzerfreundlichkeit, wie z. B.<br />
die Möglichkeit eine schon ausgewählte Komponente schnell zu entfernen, ohne<br />
Diplomarbeit 19
KAPITEL 3. DAS PROGRAMM AUS SICHT DES NUTZERS<br />
einige Male einen Zurück-Button im Wizard-Mode“ anzuklicken. Ein weiterer<br />
”<br />
Vorteil ist, dass durch eine Navigationsleiste die Übersicht behalten wird, und alles<br />
innerhalb einer <strong>Web</strong>seite passieren kann. Der große Nachteil war allerdings die<br />
komplizierte Implementierung und die ganzen Möglichkeiten, die sich dadurch einem<br />
Nutzer ergeben, abzufangen und in die gewünschten Bahnen zurückzulenken.<br />
Ein Beispiel hierfür wäre, dass der Nutzer nach der Wahl des Rahmens nicht sofort<br />
den Lenker wählen kann. Er könnte zwar in der Navigationsleiste auf die Rubrik<br />
Lenker klicken, aber durch entsprechende Mitteilungen müsste der Nutzer wieder<br />
die geforderte Reihenfolge einhalten.<br />
Abbildung 3.1: Pfade im Programmablauf<br />
Diplomarbeit 20
KAPITEL 3. DAS PROGRAMM AUS SICHT DES NUTZERS<br />
Schließlich wurde wegen der genannten Vorteile die freie Wahl implementiert. Der<br />
Nutzer kann zwar nicht in beliebiger Reihenfolge die Komponenten wählen, aber<br />
er kann so genannte Pfade entlang die Rad-Elemente aussuchen. Die Bauteile in<br />
den Pfaden sind unabhängig von einander, so dass nur innerhalb dieser Pfade der<br />
Nutzer auf eine bestimmte Reihenfolge in der Auswahl gebracht wird. Als Beispiel<br />
(siehe Abb. 3.1) wären der Pfad im Konfigurator mit den Komponenten Laufräder<br />
und Reifen, und der Pfad mit Sattelstütze und Sattel. Die Komponenten dieser<br />
Pfade sind unabhängig voneinander, während z. B. die Reifen von den Laufrädern<br />
abhängig sind, und der Sattel erst nach der Sattelstütze gewählt werden kann.<br />
3.2 Bildschirmausgabe<br />
In den folgenden Sektionen wird auf die einzelnen Elemente, die auf dem Bildschirm<br />
sichtbar sind, eingegangen und erklärt welche Funktion sie haben. Die meisten Elemente<br />
dienen dazu den Konfigurator zu bedienen, wie z. B. die Navigationsleiste<br />
oder die Tabelle mit den Komponenten. Der Rest ist für die Darstellung von Informationen<br />
zuständig. Dazu zählt die Anzeige vom Gesamtpreis, Gewicht oder<br />
ausgewählter Marke.<br />
3.2.1 Navigationsleiste<br />
Die Leiste zum Navigieren ist natürlich sehr wichtig. Ohne sie wäre das Steuern<br />
und Bedienen des <strong>Konfigurators</strong> unmöglich. Wie schon vorher erwähnt (Seite 19),<br />
ist das das Resultat der Entscheidung gegen einen völlig starren Ablauf im Konfigurieren<br />
<strong>eines</strong> Rades.<br />
In der Navigationsleiste sind die alle 13 Komponenten aufgelistet. Dies gilt aber<br />
nur für ein <strong>Renn</strong>rad, denn bei einer Zusammenstellung <strong>eines</strong> Triathlonrades sind<br />
es 14 Komponenten. Bei einem <strong>Renn</strong>rad wird die Komponente Aeroaufsatz nicht<br />
verwendet, und daher taucht dieses Element in der Navigationsleiste nicht auf.<br />
Klickt der Nutzer auf eine dieser Kategorien, werden ihm die zur Verfügung stehenden,<br />
und kompatiblen Bauteile in der Komponententabelle angezeigt. Muss vorher<br />
Diplomarbeit 21
KAPITEL 3. DAS PROGRAMM AUS SICHT DES NUTZERS<br />
noch eine andere Komponente gewählt werden, wird eine entsprechende Meldung<br />
dargestellt. Wird ein Artikel gewählt, so färbt sich das Feld dieser Komponente<br />
ein. Dieses dient dazu um dem Nutzer einen Überblick zu verschaffen welche Komponente<br />
er schon gewählt hat, denn bei einer nicht assistierten und freien Wahl<br />
der Bauteile kann die Übersicht schnell verloren gehen. Falls eine Entscheidung<br />
zurückgenommen wird, und die entsprechende Baugruppe entfernt werden soll, so<br />
werden auch in der Navigationsleiste dieses Feld, und alle damit zusammenhängenden<br />
Felder, wieder auf die Ursprungsfarbe zurückgesetzt.<br />
Abbildung 3.2: Navigatonsleiste<br />
3.2.2 Komponententabelle<br />
Auch diese Tabelle ist sehr wichtig. Hier kann der Nutzer die Komponenten anschauen,<br />
auswählen und ggf. löschen. Jedes angezeigte Bauteil ist kompatibel mit<br />
Diplomarbeit 22
KAPITEL 3. DAS PROGRAMM AUS SICHT DES NUTZERS<br />
den vorher ausgewählten Elementen, bzw. mit den angegeben Körpermaßen. Jedes<br />
Element der Komponententabelle ist gleich aufgebaut, unterscheidet sich aber in<br />
den Informationen. So sind in der ersten Zeile die Artikelnummer, der Name der<br />
Komponente und daneben der Preis zu finden. Darunter ist eine Zeile mit einer<br />
kurzen Beschreibung des Produkts und ein kl<strong>eines</strong> Bild zu finden. Die darunter liegende<br />
Zeile findet sich nicht bei jeder Komponente, sondern nur bei denen, die eine<br />
zusätzliche Information brauchen. Als Beispiel kann man die Sattelstütze nennen,<br />
bei dem diese Zeile angibt welchen Durchmesser und welche verstellbare Länge<br />
sie hat 14 . In der letzten Zeile, die wieder für alle Baugruppen gilt, sind dann das<br />
Gewicht und der Auswahl-Button zu finden. Gegebenenfalls erscheint auch hier<br />
eine Schaltfläche zum Entfernen der Komponente.<br />
Abbildung 3.3: Komponententabelle<br />
Eine Abwandlung der Komponententabelle besteht in der so genannten zusätzlichen<br />
Auswahl. Bei den Komponenten Vorbau und Kurbelsatz bieten die Hersteller<br />
das gleiche Produkt in verschiedenen Längen an. Da sonst die Komponententabelle<br />
zu lang und zu unübersichtlich wäre, wenn alle Produkt- und Längenkombinationen<br />
dort aufgelistet wären, wurde diese zusätzliche Auswahl implementiert.<br />
14 In der Abbildung bezieht sich die zusätzliche Info auf die Rahmenhöhe.<br />
Diplomarbeit 23
KAPITEL 3. DAS PROGRAMM AUS SICHT DES NUTZERS<br />
Wählt der Nutzer z. B. einen Vorbau, erscheint automatisch eine weitere Tabelle<br />
an der Stelle, an der auch die Komponententabelle war, und der Nutzer wird<br />
aufgefordert eine passende Länge zu dem Vorbau auszuwählen. Hierbei wird die<br />
Navigationsleiste ausgeblendet, damit der Nutzer erst diese Wahl treffen muss.<br />
Diese Vorgehensweise wäre ein Beispiel für die Lenkung der Entscheidungen des<br />
Nutzers, damit dieser nichts falsch machen“ kann.<br />
”<br />
3.2.3 Übersichtstabelle<br />
Diese Tabelle dient, wie der Name schon aussagt, zur Übersicht. Während der<br />
Nutzer anhand der Navigationsleiste erkennen kann welche Komponenten er schon<br />
gewählt hat, so sind in der Übersichtstabelle genauere Informationen zu finden. In<br />
jeder Zeile der Tabelle ist eine Komponente aufgelistet. In der zweiten Spalte ist der<br />
jeweilige Name des ausgewählten Fahrradelements zu finden. In der dritten Spalte<br />
ist dann noch einmal der Preis der Komponente aufgezeigt. Sollte es vorkommen,<br />
dass z. B. bei dem Rahmen die Gabel schon im Lieferumfang enthalten ist, so wird<br />
dies mit einem entsprechenden Eintrag in der Tabelle bei der Zeile Gabel vermerkt.<br />
Der angegebene Preis wäre dann natürlich 0,00e. Für den Fall, dass ein <strong>Renn</strong>rad<br />
zusammengestellt werden soll, zeigt die Übersichtstabelle des <strong>Konfigurators</strong> ein<br />
N/A“ bei der Komponente Aeroaufsatz an, da bei einem <strong>Renn</strong>rad keine solchen<br />
”<br />
Elemente zum Einsatz kommen.<br />
3.2.4 Sonstige Anzeigen<br />
Zu den sonstigen Anzeigen zählen z. B. der Gesamtpreis und das Gesamtgewicht.<br />
Da beide Angaben für einen Radfahrer sehr wichtige Daten sind, dürfen sie bei<br />
einem <strong>Renn</strong>- und Triathlonkonfigurator nicht fehlen. Das Feld mit diesen Informationen<br />
ist unter der Übersichtstabelle positioniert. Je nachdem ob eine Komponente<br />
ausgewählt, oder wieder entfernt wird, ändern sich der Preis und das Gewicht<br />
automatisch.<br />
Eine weitere Anzeige ist die der ausgewählten Marke für die Komponente Schaltgruppe.<br />
Diese wird nicht von Anfang an dargestellt, da die Wahl der Marke bei<br />
Diplomarbeit 24
KAPITEL 3. DAS PROGRAMM AUS SICHT DES NUTZERS<br />
Abbildung 3.4: Übersichtstabelle<br />
den Laufrädern, dem Kurbelsatz oder erst bei der Schaltgruppe fällt. Sollten alle<br />
Komponenten, für die die Kompatibilität mit Shimano oder Campagnolo wichtig<br />
ist, entfernt werden, so wird auch diese Anzeige nicht mehr dargestellt. Diese Information<br />
wird ebenfalls unter der Übersichtstabelle angezeigt.<br />
Zu manchen Komponenten wird auch ein Infotext angezeigt, der den Nutzer z. B.<br />
darüber aufklärt aus welchen einzelnen Elementen die Schaltgruppe besteht. Auch<br />
wird darauf hingewiesen, bei welcher Komponente die Schaltgruppenmarke festgelegt<br />
wird. Dieser Infotext ist ebenfalls dynamisch, so dass der eben genannte<br />
Hinweis nur angezeigt wird, wenn die Marke noch nicht gewählt wurde. Die Hinweise<br />
sind an dem unteren Rand des Bildschirms zu finden.<br />
Ein weiterführender Link erscheint über der Navigationsleiste wenn alle Komponenten<br />
gewählt wurden. Dieser Verweis führt den Nutzer zu dem so genannten<br />
Showroom“, in dem er sich bis zu drei selbst erstellte Räder anschauen, und die<br />
”<br />
einzelnen Bauteile, den Gesamtpreis und das Gesamtgewicht vergleichen kann.<br />
Diplomarbeit 25
KAPITEL 3. DAS PROGRAMM AUS SICHT DES NUTZERS<br />
Die letzte, der so genannten sonstigen Anzeigen, ist eine Schaltfläche am oberen<br />
linken Bildschirmrand. Der Knopf dient zum Neustart des aktuell zu konfigurierenden<br />
Rades. Wird dieser angeklickt, so werden alle bisher ausgewählten Komponenten<br />
entfernt. Allerdings kann nur das aktuelle Rad neu konfiguriert werden<br />
– schon fertig zusammengestellte Räder, die im Showroom“ betrachtet wurden,<br />
”<br />
sind nicht mehr löschbar, es sei denn, der Nutzer fängt wieder mit der Startseite<br />
wieder an.<br />
3.2.5 Showroom<br />
Der Showroom ist eine eigene php-Datei. Das heißt, es wird nicht mehr alles von der<br />
Main.php gesteuert. Hier werden das aktuelle Rad und vorher konfigurierte Räder<br />
dargestellt. Diese Seite besteht aus drei Tabellen, die ähnlich der Übersichtstabelle<br />
auf der Hauptseite sind. Es werden hier auch der Komponentenname, der<br />
Artikelname und der Einzelpreis je Komponente nebeneinander angezeigt. Unter<br />
der Tabelle ist dann noch einmal der jeweilige Gesamtpreis und das Gesamtgewicht<br />
dargestellt.<br />
Diese Übersicht ist bisher bei noch keinem der schon im Internet verfügbaren Fahrradkonfiguratoren<br />
vorhanden. So kann der Nutzer von seinem Wunschrad mehrere<br />
Ausführungen oder Ausstattungen erstellen und so auf einen Blick entscheiden,<br />
welche Konfiguration ihm am geeignetsten erscheint.<br />
Es ist möglich bis zu drei <strong>Renn</strong>- bzw. Triathlonräder zusammenzustellen. Sind<br />
noch nicht alle Räder konfiguriert, so erscheint unter den Tabellen noch ein Link,<br />
der den Nutzer wieder zu der Hauptseite führt. Dort kann dann ein weiteres Rad<br />
erstellt werden. Die Komponentendaten sind natürlich wieder alle gelöscht, so dass<br />
keine Bauteilgruppe ausgewählt ist. Es werden die Daten, die der Nutzer auf der<br />
Startseite angegeben hat, wie Körper- und Schritthöhe, sowie die daraus resultierenden<br />
anderen Maße, beibehalten. Falls andere Körpermaße oder ein anderer<br />
Radtyp gewünscht ist, muss der Nutzer wieder von vorne beginnen.<br />
Diplomarbeit 26
Kapitel 4<br />
MySQL Datenbank<br />
4.1 Aufbau der Tables<br />
Als Datenbank wurde eine normale MySQL Datenbank verwendet, da zumindest<br />
in der Phase <strong>eines</strong> Prototyps nicht so viele Daten und Benutzerzahlen zusammenkommen,<br />
dass andere, kommerzielle Datenbanksysteme wie Oracle [Ora06] oder<br />
DB2 [IBM06] in Betracht gezogen werden müssten.<br />
Die Datenbank ist der essentielle Teil des <strong>Konfigurators</strong>, denn darin sind alle relevanten<br />
Daten zu den einzelnen Komponenten gespeichert. Unter relevanten Daten<br />
sind Informationen zur Darstellung innerhalb es <strong>Konfigurators</strong>, wie z. B. Komponentenname<br />
oder die Beschreibung zu verstehen. Die wichtigeren Daten innerhalb<br />
der Datenbank sind Informationen über die Komponenten, damit die Abhängigkeiten<br />
zwischen anderen Bauteilgruppen erkannt werden können. So ist, um ein<br />
Beispiel zu nennen, im Rahmen-Table der Durchmesser der Gabelaufnahme hinterlegt.<br />
Ebenso ist diese Größe bei jeder Komponente im Gabel-Table erfasst, damit<br />
im Konfigurator nur die Gabeln angezeigt werden, die mit der Gabelaufnahme des<br />
Rahmens zusammenpassen.<br />
Diplomarbeit 27
KAPITEL 4. MYSQL DATENBANK<br />
4.1.1 Gemeinsame Eigenschaften<br />
Da jede Komponente verschiedene Abhängigkeiten mit anderen <strong>Renn</strong>radteilen besitzt,<br />
hat jedes Table eine unterschiedliche Anzahl von Spalten und Eigenschaften.<br />
Allerdings sind einige Spalten bei allen Tables gleich, da sie unter anderem für die<br />
Darstellung im Konfigurator gebraucht werden. Damit die Daten aus den Spalten<br />
später einfach extrahiert werden können, sind diese immer die Ersten <strong>eines</strong> Tables<br />
und damit immer an der gleichen Stelle und Reihenfolge.<br />
Es handelt es sich dabei um folgende Spalten:<br />
Artikelnummer Ein eindeutiger Schlüssel, der gleichzeitig auch der Primary Key<br />
ist. Die Artikelnummer besteht aus sechs Zeichen, wovon das erste Zeichen<br />
ein Buchstabe ist, der die Komponente bezeichnet. A‘ wäre in diesem Fall der<br />
’<br />
Rahmen, B‘ der Steuersatz usw. Die nächsten beiden Zeichen bestehen aus<br />
’<br />
Zahlen und stellen einen Code für den Hersteller/die Marke dar. Die nächsten<br />
beiden Ziffern bezeichnen die wievielte Komponente des Herstellers es in der<br />
Datenbank ist. Das letzte Zeichen sollte wieder ein Buchstabe sein, und steht<br />
für verschiedene Ausführungen bei dem gleichen Artikel. Ein Beispiel wäre<br />
hierfür, wenn es einen Lenker in drei verschiedenen Breiten gibt.<br />
Gewicht Hier wird das Gewicht der jeweiligen Artikel eingetragen, da es für einen<br />
<strong>Renn</strong>- und Triathlonfahrer sehr wichtig ist, wie viel sein Rad wiegt. Der<br />
Eintrag in der Datenbank dient zum Darstellen im Konfigurator und zur<br />
Errechnung des Gesamtgewichts.<br />
Preis Der Betrag, den eine Komponente kostet, wird in dieser Spalte eingetragen.<br />
Auch diese Daten dienen zur Darstellung im Konfigurator und zur Errechnung<br />
des Endpreises.<br />
Name Der Name der Komponente. Dieser Eintrag wird nur zur Darstellung in<br />
dem Konfigurator und der Übersichtstabelle verwendet.<br />
Beschreibung Ein kurzer Text zur Beschreibung der Komponente, in dem für<br />
den Benutzer, aber nicht für die Funktion des <strong>Konfigurators</strong>, relevante Daten<br />
stehen können.<br />
Diplomarbeit 28
KAPITEL 4. MYSQL DATENBANK<br />
Abbildung 4.1: Aufbau der Artikelnummer<br />
Bild Eine URL zu einem kleinen Bild. Dies dient nur zu Darstellungszwecken. Allerdings<br />
ist diese Funktion im Prototyp nur durch ein Beispiel-Bild realisiert,<br />
das bei jedem Artikel gleich ist. Es wird aber später notwendig sein, dass der<br />
Dateiname des Bildes gleich dem der Artikelnummer (und gleichzeitig auch<br />
des Primary Keys) ist.<br />
Allein durch diese Daten in der Datenbank wäre es möglich den Konfigurator mittels<br />
PHP und HTML darzustellen. Alle zusätzlichen Spalten sind notwendig damit<br />
die Abhängigkeiten zwischen den Komponenten erkannt und die kompatiblen Bauteilgruppen<br />
dargestellt werden können.<br />
4.1.2 Einzelne Tabellen<br />
Die folgende Beschreibung zeigt die einzelnen Tables auf, und gibt eine kurze Erklärung<br />
warum diese Spalte erstellt wurde, und wie/ob sie notwendig für andere<br />
Komponenten ist. (Vgl. Anhang A ab Seite 83)<br />
TABLE Rahmen<br />
Diplomarbeit 29
KAPITEL 4. MYSQL DATENBANK<br />
• rahmenhoehe: das Maß wird aus den auf der Startseite angegebenen Daten<br />
des Benutzers berechnet. Die Rahmen mit der übereinstimmenden Größe<br />
werden angezeigt. Außerdem ist das Maß für die Größe der Laufräder relevant.<br />
• gabelaufnahme: hier ist gespeichert welcher Gabelschaftdurchmesser mit<br />
diesem Rahmen zusammenpassen wird.<br />
• gabelvorhanden: der Wert in dieser Spalte kann nur 0 oder 1 annehmen,<br />
und gibt an ob der Rahmen schon mit einer Gabel ausgeliefert wird.<br />
• steuersatz: ebenfalls können hier nur die Werte 0 und 1 angenommen werden.<br />
Die Spalte gibt an, ob der Steuersatz mit dem Rahmen geliefert wird.<br />
• sattelrohr: gibt an, welcher Durchmesser (in mm) das Rohr für die Sattelstütze<br />
hat. Ist ein Wert über 100 angegeben, impliziert das eine schon<br />
beim Rahmen vorhandene Sattelstütze.<br />
• tretlager: da es hier zwei Standardmaße gibt, ist diese Spalte wichtig um<br />
anzugeben, welche Tretlagergröße der Kurbelsatz haben muss.<br />
TABLE Steuersatz<br />
• gabelschaft: der gespeicherte Wert gibt an zu welchen Gabelschaft- bzw.<br />
Gabelaufnahmegrößen der Steuersatz passt.<br />
TABLE Gabel<br />
• gabelschaft: auch hier wird die Größe des Gabelschafts angegeben, damit<br />
die Gabel auch mit dem Rahmen und dem Steuersatz zusammenpasst.<br />
• laenge: die Größe der Laufräder, also 28 ” oder 26 ”, die an diese Gabel<br />
montiert werden können, sind in dieser Spalte hinterlegt.<br />
Diplomarbeit 30
KAPITEL 4. MYSQL DATENBANK<br />
TABLE Vorbau<br />
• gabelaufnahme: die Spalte gibt ebenso den Durchmesser des Gabelschafts<br />
an, so dass im Konfigurator nur die Vorbauten angezeigt werden, die mit<br />
dem ausgewählten Rahmen bzw. der Gabel zusammenpassen.<br />
• lenkeraufnahme: hier wird der Wert gespeichert, der angibt was für ein<br />
Durchmesser das Lenkerrohr haben muss, damit der Lenker sich an diesem<br />
Vorbau montieren lässt.<br />
• laenge1: die Hersteller von Vorbauten bieten verschiedene Längen an. Hier<br />
wir die kleinste verfügbare Länge gespeichert.<br />
• laenge2: an dieser Spalte wird die nächst-größere Vorbaulänge eingetragen.<br />
• . . .<br />
• laenge9: bis zu neun verschiedene Längen können gespeichert werden, was<br />
aber nicht notwendig ist, da viele Hersteller nur vier oder fünf Vorbaulängen<br />
zur Auswahl haben.<br />
• winkel: gibt an, mit was für einen Winkel der Vorbau von der Gabel abstehen<br />
wird. Das dient zur weiteren Lenker-Erhöhung/Herabsetzung.<br />
• flip: der Wert kann nur 0 oder 1 annehmen und beschreibt ob der Vorbau<br />
um 180 ◦ drehbar ist, so dass der Fahrer zwischen zwei Winkeln wählen kann.<br />
TABLE Lenker<br />
• lenkerdurchm: alle Lenker, die den gleichen Lenkerdurchmesser haben, wie<br />
von dem Vorbau vorgegeben, werden angezeigt.<br />
• breite: individuelle Größe, die sich nach dem Fahrer richtet. Diese Spalte<br />
dient nur zu Darstellungszwecken, und zum späteren Überprüfen, welche<br />
Komponenten ausgewählt wurden.<br />
Diplomarbeit 31
KAPITEL 4. MYSQL DATENBANK<br />
• lenkerart: in dieser Spalte ist festgehalten um was für eine Art Lenker es<br />
sich handelt: reiner <strong>Renn</strong>radlenker, reiner Triathlonlenker (üblicherweise mit<br />
Aeroaufsatz) oder ob der Lenker mit beiden Fahrradarten kompatibel ist.<br />
• aeroaufsatz: der Inhalt der Spalte beschreibt, ob an dem Lenker ein Aeroaufsatz<br />
angebaut werden kann, ob dies nicht möglich ist, oder ob schon ein<br />
solcher Aufsatz mit dabei ist.<br />
TABLE Aeroaufsatz<br />
• lenkerklemm da der Aeroaufsatz auf den Lenker geklemmt wird, ist es<br />
wichtig zu wissen, für welche Lenkerdurchmesser der Aufsatz passt.<br />
TABLE Laufraeder<br />
• durchmesser: diese wichtige Spalte gibt an welche Größe die Laufräder<br />
haben. Es werden die traditionellen Maße angegeben: 700 (also 700C) für<br />
28 ” Räder, 650 (also 650C) für 26 ” Räder.<br />
• reifenart: hier ist festgehalten ob es sich um Draht- oder Schlauchreifen<br />
handelt.<br />
• nabe: ebenfalls ein wichtiger Wert wird in dieser Spalte angegeben. Hier<br />
ist hinterlegt mit welchem der beiden Hersteller für Schaltgruppen die Nabe<br />
kompatibel ist.<br />
Näheres siehe auch Seite 16.<br />
TABLE Reifen<br />
• durchmesser: in dieser Spalte ist vermerkt für welche Laufraddurchmesser<br />
die Reifen passen. Auch hier wurden die traditionellen Maße angegeben: 700<br />
(C) und 650 (C)<br />
• breite: dieser Wert dient nur zu Darstellungszwecken und beschreibt für<br />
welche Laufradbreiten der Reifen geeignet ist.<br />
Diplomarbeit 32
KAPITEL 4. MYSQL DATENBANK<br />
• reifenart: da es zwei verschiedene Reifensysteme gibt, ist es wichtig die Art<br />
des Reifens festzuhalten.<br />
TABLE Kurbelsatz<br />
• kettenblatt: der hier hinterlegte Wert gibt an wie viele Kettenblätter an der<br />
Kurbel sind, bzw. ob es sich um eine so genannte Compact-Kurbel handelt.<br />
• zaehne vorne: gibt die Anzahl der Zähne auf dem größten Kettenblatt an.<br />
Dieser Wert dient nicht nur zu Darstellungszwecken sondern ist auch wichtig<br />
um die Kapazität“ des Schaltkäfigs bei der Schaltgruppe zu berechnen.<br />
”<br />
• zaehne mitte: dieser Wert ist nur für die Darstellung wichtig, und wird<br />
auch nur mit einem Inhalt versehen falls es sich um ein 3-fach Kettenblatt<br />
handelt.<br />
• zaehne hinten: die Anzahl der Zähne des kleinsten Kettenblattes werden<br />
hier gespeichert. Auch dieser Wert wird später zur Berechnung der Kapazität<br />
benötigt.<br />
• laenge1: gibt an wie lang die Kurbel von der Mitte zu den Pedalen ist.<br />
Die Angabe ist in mm und da die Hersteller normalerweise mehrere Längen<br />
anbieten, wie hier die kleinste verfügbare Größe gespeichert.<br />
• . . .<br />
• laenge7: bis zu sieben verschiedene Längen können eingetragen werden, was<br />
aber meistens nicht notwendig ist, da viele Hersteller nur zwei oder drei<br />
Kurbellängen zur Auswahl haben.<br />
• kompatibel: auch hier ist angegeben, mit welchem der beiden Hersteller<br />
für Schaltgruppen der Kurbelsatz kompatibel ist. Es ist auch möglich, dass<br />
ein Anbieter einen Kurbelsatz anbietet, der für Shimano und Campagnolo<br />
kompatibel ist.<br />
• innenlager: da diese Komponente unter anderem aus einem Innenlager besteht,<br />
für das es zwei Größen gibt, ist es wichtig diesen Wert festzuhalten,<br />
damit nur kompatible Kurbelsätze angezeigt werden.<br />
Diplomarbeit 33
KAPITEL 4. MYSQL DATENBANK<br />
TABLE Schaltgruppe<br />
• kettenblatt: die Anzahl der Kettenblätter des zuvor ausgewählten Kurbelsatzes<br />
ist für die Schaltgruppe in so fern relevant, dass für verschiedene<br />
Kettenblätter verschieden lange Schaltkäfige benötigt werden.<br />
• hersteller: dies gibt an mit welcher Marke die Schaltgruppe kompatibel ist.<br />
• kassette min: die Anzahl der Zähne der kleinsten Scheibe am Ritzel. Ein<br />
notwendiger Wert zur Berechnung der Kapazität“ der Schaltung.<br />
”<br />
• kassette max: hier wird die Anzahl der Zähne der größten Scheibe am<br />
Ritzel angegeben. Das dient auch zur Berechnung der Kapazität“.<br />
”<br />
TABLE Bremsen<br />
• Keine weiteren Spalten notwendig.<br />
TABLE Pedale<br />
• Keine weiteren Spalten notwendig.<br />
TABLE Sattelstuetze<br />
• laenge: ein Wert der nur zu Darstellungszwecken dient.<br />
• durchmesser: diese Angabe ist notwendig, damit Sattelstützen mit dem<br />
richtigen Rohrdurchmesser angezeigt werden.<br />
TABLE Sattel<br />
• Keine weiteren Spalten notwendig.<br />
Diplomarbeit 34
Kapitel 5<br />
Die Progamm-Dateien<br />
5.1 Programmablauf<br />
Zuerst werden die eingegebenen Daten auf der Startseite berechnet und diese dann<br />
abgeschickt. Zuvor werden jedoch mit Hilfe von JavaScript die Angaben überprüft,<br />
ob sie in einem zulässigen Bereich liegen. Nach dem Abschicken des Formulars wird<br />
die Main.php aufgerufen, bei der es sich um die zentrale Datei handelt.<br />
Verschiedene Variablen und Klassen werden initialisiert, damit am Anfang die<br />
Navigationsleiste, die zur Verfügung stehenden Rahmen, die noch nicht ausgefüllte<br />
Übersichtstabelle und auch schon der Preis/Gewicht-Bereich zu sehen sind. Der<br />
gesamte Konfigurator wird über die angeklickten Links, die eigentlich immer so<br />
genannte Submit-Buttons von Formularen sind, gesteuert.<br />
Wird ein solcher Button angeklickt, wird dieses in der Main.php registriert, indem<br />
die entsprechenden Post-Variablen abgefragt werden. Je nachdem welcher Verweis<br />
aktiviert wurde (oder auch: je nach dem welches Ereignis auftritt), ruft die<br />
Main.php eine andere Funktion der EventHandler Klasse auf. Diese Klasse erkennt<br />
bei welcher Komponente des <strong>Renn</strong>rades der Konfigurator sich gerade befindet, und<br />
aktiviert die zum Event passende Funktion der zugehörigen Komponentenklasse.<br />
In dieser Klasse werden nun die nötigen Session-Variablen gesetzt, bzw. wieder<br />
gelöscht.<br />
Diplomarbeit 35
KAPITEL 5. DIE PROGAMM-DATEIEN<br />
Abbildung 5.1: Klassendiagramm<br />
Diplomarbeit 36
KAPITEL 5. DIE PROGAMM-DATEIEN<br />
Manche Aufgaben, wie z. B. das Darstellen der Tabelle, oder das Entfernen von<br />
Komponenten geschehen in der Eltern-Klasse. In den Komponentenklassen werden<br />
nur die spezifisch für diese Baugruppe notwendigen Aufgaben erledigt. Darunter<br />
fällt das Setzen von Session-Variablen für die eigene und andere Komponenten, das<br />
Herausfiltern von inkompatiblen Bauteilen oder auch das Füllen der Tabelle mit<br />
den spezifischen Daten. Die Eltern-Klasse, bezeichnenderweise ComponentParent<br />
genannt, ist dagegen für Aufgaben zuständig, die allgemein für alle Komponenten<br />
gleich ist. Dazu zählen das schon erwähnte Darstellen der Tabelle und die Remove-<br />
Routine. In dieser Klasse werden auch die Daten für Preis und Gewicht aktualisiert.<br />
So werden die Ereignisse, die die einzelnen Komponenten betreffen, auf den Bildschirm<br />
gebracht. Allerdings ist die EventHandler Klasse noch für mehr zuständig.<br />
Sie stellt die Navigationsleiste, die Übersichtstabelle und den Preis/Gewichts-<br />
Bereich dar; es wird geprüft ob alle Komponenten ausgewählt wurden, damit ein<br />
weiterführender Link zum Showroom erscheint; und es wird der Primary Key aller<br />
ausgewählten Baugruppen der verschiedenen <strong>Renn</strong>räder in einem zweidimensionalen<br />
Array gespeichert.<br />
5.2 Darstellung<br />
In diesem Abschnitt werden die php Dateien behandelt, die sich mit der Darstellung<br />
des <strong>Konfigurators</strong> befassen. Hierbei soll es sich um alles handeln, was auf dem<br />
Bildschirm zu sehen ist, wie die Komponententabelle, die Navigationsleiste oder die<br />
Übersichtstabelle. Zwar bringen z. B. die einzelnen Komponentenklassen auch Informationen<br />
auf den Bildschirm, aber deren primäre Funktion ist es die Regeln der<br />
Abhängigkeit zwischen den Komponenten anzuwenden. Die EventHandler Klasse<br />
selbst stellt auch viele Informationen dar. Diese werden aber durch die Main.php<br />
oder Showroom.php aufgerufen.<br />
Diplomarbeit 37
KAPITEL 5. DIE PROGAMM-DATEIEN<br />
5.2.1 index.php<br />
Das ist die erste Seite, die der Nutzer zu sehen bekommt. Hier werden die Informationen<br />
abgefragt, die für den Start des <strong>Konfigurators</strong> wichtig sind. Notwendige<br />
Angaben sind nur die Körpergröße und die Schritthöhe. Die anderen Angaben<br />
werden mittels JavaScript automatisch berechnet. Die ganze index.php besteht im<br />
Grunde aus JavaScript, bis auf die Initialisierung der Session.<br />
Beim ersten Aufrufen der Seite wird mit dem JavaScript Befehl navigator.<br />
cookieEnabled überprüft, ob der Browser Cookies zulässt. Durch eine if-Abfrage<br />
wird dann bei positivem Ergebnis die eigentliche Seite dargestellt. Sind keine Cookies<br />
erlaubt, wird dieses angezeigt, und ein Link zum erneuten Laden der Seite<br />
bereitgestellt.<br />
Die dargestellte Seite ist ein Formular, das beim Abschicken erst die eingegebenen<br />
Werte überprüft, und ggf. einen Fehler ausgibt. In der CheckFormular() Funktion<br />
werden die Angaben für Körpergröße, Schritthöhe und Rahmenhöhe kontrolliert.<br />
Da alle drei Prüfungen nach dem gleichen Muster ablaufen, hier als Beispiel nur<br />
den Programmcode für die Körpergröße:<br />
var ZahlCheckFlag = 1;<br />
if(document.datainput.height.value == "")<br />
{<br />
alert("Bitte Deine Körpergröße eingeben!");<br />
document.datainput.height.focus();<br />
return false;<br />
}<br />
if(document.datainput.height.value >=221 ||<br />
document.datainput.height.value
KAPITEL 5. DIE PROGAMM-DATEIEN<br />
}<br />
return false;<br />
for(i=0;i "9")<br />
ZahlCheckFlag = -1;<br />
if(ZahlCheckFlag == -1)<br />
{<br />
alert("Körpermaß ist keine Zahl!");<br />
document.datainput.height.focus();<br />
return false;<br />
}<br />
Die erste if-Abfrage testet, ob überhaupt etwas eingeben wurde. Die nächste Abfrage<br />
prüft ob sich der eingebende Wert in einem bestimmten Bereich befindet. In<br />
diesem Beispiel sollte das Körpermaß zwischen 1,30m und 2,21m liegen. Der letzte<br />
Test kontrolliert, ob alle Zeichen auch Zahlen sind, da es wenig Sinn ergibt eine<br />
Köpergröße oder Rahmenhöhe mit Buchstaben zu versehen. Bei jeder Falscheingabe<br />
wird das fehlerhafte Feld mit document.datainput.height.focus() hervorgehoben,<br />
um dem Nutzer die Suche nach diesem Feld zu ersparen.<br />
In der index.php kann der Nutzer auch zwischen <strong>Renn</strong>- und Triathlonrad wählen.<br />
Dies hat Auswirkungen auf die angezeigte Rahmenhöhe, da dieses Maß beim Triathlonrad<br />
einige Zentimeter kleiner ist. Diese Größe wird auch dynamisch geändert<br />
sobald der Nutzer einen anderen Radio-Button anklickt. Bewerkstelligt wird dies<br />
mit updateFramesize() und ist ebenfalls mit JavaScript realisiert. Diese Funktion<br />
ruft getBikeType() auf, um festzustellen welcher Radio-Button gerade aktiv ist.<br />
Da diese Buttons die ersten beiden Elemente des Formulars sind, ist es mit Hilfe<br />
von der Abfrage if(document.datainput.elements[X].checked) recht einfach<br />
dies herauszufinden. Wobei X entweder 0 für das erste Element oder 1 für das<br />
zweite Element ist. In der Funktion updateFramesize() wird auch updateStem()<br />
Diplomarbeit 39
KAPITEL 5. DIE PROGAMM-DATEIEN<br />
aufgerufen, die schon im Vorfeld die Auswahlmöglichkeiten der Vorbaulänge einschränkt.<br />
5.2.2 Main.php<br />
Diese Datei ist dafür zuständig, dass alle Klassen, weitere Dateien, und die Bildschirmausgabe<br />
verlinkt“ werden. Deshalb auch der Name Main, da diese php-<br />
”<br />
Datei alles zusammenfügt. Hier werden auch die nötigen Klassen eingefügt und<br />
die Anfangsbedingungen initialisiert. Zuerst werden die aus der index.php übergebenen<br />
Daten in Session-Variablen gespeichert, so dass diese für spätere Berechnungen<br />
oder Darstellungen verwendet werden können. Die Initialisierung ist notwendig,<br />
damit der Konfigurator immer einen bestimmten Startpunkt hat. So wird<br />
z. B. durch den folgenden Code die Navigationsvariable auf die erste Komponente<br />
(hier: der Rahmen) gesetzt, wobei es egal ist ob die Main.php von der index-Datei<br />
oder von der Showroom.php aufgerufen wird.<br />
if (!empty ($_POST[’size’]) or empty($_SESSION[’nav’]))<br />
{<br />
$navigation = $xm->get_component_from_xml(1);<br />
$sh->register_session(nav, $navigation);<br />
$ev->navbar;<br />
}<br />
Ein anderes Beispiel wäre, da es möglich ist bis zu drei Fahrräder zu konfigurieren<br />
und anzeigen zu lassen, dass es notwenig ist am Anfang eine Session-Variable zu<br />
initialisieren, welche speichert wie viele Räder schon konfiguriert wurden.<br />
Anderer Code ist dafür zuständig, dass je nach Event eine andere Funktion aus der<br />
EventHandler Klasse zum Einsatz kommt. Da alles auf dem Bildschirm Anklickbare<br />
ein HTML-Formular ist, werden diese Events durch Abfrage der entsprechenden<br />
POST-Variablen erfasst.<br />
In der Main.php werden auch alle anderen Funktionen aufgerufen, die Informationen<br />
auf dem Bildschirm darstellen. Meistens sind diese Funktionen ebenfalls in der<br />
Diplomarbeit 40
KAPITEL 5. DIE PROGAMM-DATEIEN<br />
Abbildung 5.2: Diagramm zur index.php<br />
Diplomarbeit 41
KAPITEL 5. DIE PROGAMM-DATEIEN<br />
EventHandler Klasse untergebracht. Zu diesen Aufgaben gehört unter anderem das<br />
Anzeigen der Navigationsleiste, und das Ausblenden dieser, wenn eine zusätzliche<br />
Auswahl zu einer Komponente getroffen werden soll. Die Übersichtstabelle und die<br />
Preis-/Gewichtsinformationen werden ebenfalls in der Main.php aufgerufen. Des<br />
Weiteren wird in der Main.php überprüft, ob alle Komponenten ausgewählt wurden<br />
(indem wieder eine Funktion aus der EventHandler Klasse aufgerufen wird)<br />
und erst dann ein Link zum so genannten Showroom angezeigt wird.<br />
5.2.3 Showroom.php<br />
Diese php stellt die schon zusammengestellten Fahrräder dar. Sie kann erst vom<br />
Nutzer aufgerufen werden wenn alle Komponenten ausgewählt wurden. Es werden<br />
drei Tabellen angezeigt, die der Übersichtstabelle auf der Hauptseite gleichen.<br />
Um diese Tabellen mit Daten zu füllen wird ein zweidimensionales Array ausgelesen,<br />
in dem der Unique-Key jedes Rades und jeder ausgewählten Komponente<br />
gespeichert ist. Dieses Array wird in der EventHandler Klasse gefüllt und nach<br />
jeder Auswahl aktualisiert. Ebenso gibt es für den Gesamtpreis und das Gewicht<br />
ein separates zweidimensionales Array in dem diese Daten gespeichert werden.<br />
Das Array wird auch in der Showroom.php ausgelesen und entsprechend auf dem<br />
Bildschirm präsentiert.<br />
Die Daten aus dem Array mit dem Unique-Key der Komponenten werden dann<br />
in der Datei benutzt, um den Namen und Preis aus der Datenbank auszulesen.<br />
Bei Gesamtpreis und -gewicht ist dies nicht notwendig, das es sich hierbei nur um<br />
Session-Variablen handelt.<br />
So lange noch nicht alle drei <strong>Renn</strong>- oder Triathlonräder konfiguriert sind, wird ein<br />
Link dargestellt, mit dem der Nutzer wieder zurück zur Hauptseite gelangen kann,<br />
um ein weiteres Rad zu konfigurieren. Wurden alle drei Räder zusammengestellt,<br />
wird dieser Link nicht mehr angezeigt, und der Prototyp des <strong>Konfigurators</strong> endet<br />
hier.<br />
Diplomarbeit 42
KAPITEL 5. DIE PROGAMM-DATEIEN<br />
5.3 XML<br />
5.3.1 XML-Datei<br />
Beim Erstellen der Form der XML-Datei, wie sie im Konfigurator gewünscht ist,<br />
traten mehr Probleme auf, als vorhergesehen war. Zum einen mussten die nötigen<br />
Informationen untergebracht werden, und zum anderen musste die Struktur der<br />
Abhängigkeiten berücksichtigt werden. Ein Beispiel für diese Struktur ist, dass es<br />
einen Zusammenhang von den Komponenten Gabel, Vorbau, Lenker und Aeroaufsatz<br />
gibt. Möchte ein Nutzer, nachdem er diese vier Komponenten ausgewählt hat,<br />
z. B. die Gabel ändern, so muss gleichzeitig die Auswahl der anderen drei Komponenten<br />
rückgängig gemacht werden, da durch eine andere Gabel evtl. der Vorbau<br />
und dadurch evtl. der Lenker usw. nicht mehr zusammenpassen. Diese im Beispiel<br />
genannte Struktur muss in die XML übertragen werden. Allerdings sollte das Auslesen<br />
der Daten nicht zu kompliziert werden. Das heißt, die Ebenen sollten nicht<br />
zu sehr in die Tiefe gehen, da sonst der Code zum Extrahieren zu unübersichtlich<br />
werden würde.<br />
Nach ersten Überlegungen wurde eine XML-Datei erstellt, die zwar genau die<br />
Struktur des <strong>Konfigurators</strong> wiedergab, aber, wie sich im Nachhinein herausstellte,<br />
dennoch Informationen fehlten. Dieses hier ist ein Codefragment aus dem ersten<br />
Entwurf:<br />
...<br />
<br />
ArtNrFork<br />
<br />
ArtNrStem<br />
<br />
ArtNrBar<br />
<br />
ArtNrAero<br />
<br />
<br />
<br />
<br />
...<br />
Diplomarbeit 43
KAPITEL 5. DIE PROGAMM-DATEIEN<br />
Also wurden nach dem ersten Entwurf die Daten ergänzt, die wichtig erschienen.<br />
Dies beschränkte sich zunächst darauf, dass zur besseren Extrahierung der Komponenten<br />
und Pfade, die Tags mit einer ID versehen wurden. Danach sah es in der<br />
XML-Datei so aus:<br />
...<br />
<br />
ArtNrFork<br />
<br />
ArtNrStem<br />
...<br />
Doch nach einigem Arbeiten mit dem Code, das die Daten auslesen sollte, stand<br />
fest, dass es zum einen zu viele Ebenen gab, und somit der Code unübersichtlich<br />
und kompliziert wurde, und zum anderen, dass dort noch weitere Daten eingefügt<br />
werden können und sollen. Der nächste Entwurf hatte also dementsprechend wenige<br />
Ebenen und versuchte auch die geforderte Struktur widerzuspiegeln:<br />
<br />
<br />
0<br />
ArtNrFame<br />
<br />
<br />
1<br />
ArtNrHeadset<br />
<br />
<br />
2<br />
ArtNrFork<br />
<br />
<br />
2<br />
ArtNrStem<br />
<br />
...<br />
Im finalen Entwurf, wurde die XML nicht vereinfacht, aber dennoch so gehalten,<br />
dass die Daten relativ leicht ausgelesen werden konnten. Zusätzlich wurde die<br />
geforderte Struktur noch hervorgehoben und weitere Daten hinzugefügt, die sich<br />
Diplomarbeit 44
KAPITEL 5. DIE PROGAMM-DATEIEN<br />
letztendlich als sehr hilfreich, wenn nicht sogar als unverzichtbar herausgestellt<br />
haben. Ein Teil dieser XML sieht nun so aus:<br />
<br />
<br />
<br />
Rahmen<br />
ArtNrFrame<br />
<br />
<br />
<br />
<br />
Steuersatz<br />
ArtNrHeadset<br />
<br />
<br />
<br />
<br />
<br />
Gabel<br />
ArtNrFork<br />
<br />
<br />
<br />
Vorbau<br />
ArtNrStem<br />
StemLength<br />
<br />
...<br />
<br />
Aeroaufsatz<br />
ArtNrAero<br />
<br />
<br />
<br />
...<br />
<br />
<br />
Wie sich erkennen lässt, umfasst der Pfad mit der ID-Nummer 00 alle Baugruppen.<br />
Die anderen Pfade beinhalten lediglich die entsprechende Gruppe von Komponenten,<br />
was - wie schon Eingangs erwähnt - das Entfernen von Komponenten relativ<br />
einfach macht. Die Inhalte der Tags mit dem Namen Unique können natürlich frei<br />
Diplomarbeit 45
KAPITEL 5. DIE PROGAMM-DATEIEN<br />
gewählt werden, sollten aber nicht doppelt vorkommen, da dieser Name in den<br />
php-Skripten als Session-Variable zum speichern des Primary Keys aus der Datenbank<br />
verwendet wird. Der dritte Tag innerhalb <strong>eines</strong> Component mit dem Namen<br />
Additional ist für zusätzliche Informationen gedacht, die nicht bei jeder Komponente<br />
vorkommen. Im Fall dieses <strong>Konfigurators</strong> wird nur bei dem Vorbau und bei<br />
dem Kurbelsatz der Additional-Tag gebraucht, um die Vorbau- bzw. Kurbellänge<br />
in Session-Variablen zu speichern.<br />
5.3.2 XML-Handler Klasse<br />
Die Klasse ist nicht nur für das Extrahieren von Daten aus der XML-Datei zuständig,<br />
sie führt auch ein paar Operationen zum Testen durch. Aufgerufen wird die Klasse<br />
mit einem Parameter, der den gewünschten Dateinamen enthält. Im Konstruktor<br />
wird dann mittels der Funktion simple load xml() die XML-Datei als mehrdimensionales<br />
assoziatives Array geladen, und so sind die darin enthaltenen Daten<br />
relativ leicht zu lesen.<br />
Eine der oben angesprochenen Test-Funktionen ist die test set. Sie überprüft<br />
ob alle vorherigen Komponenten in dem Pfad (vgl. Abschnitt 3.1 auf Seite 19)<br />
gesetzt sind, so dass die Komponententabelle mit den kompatiblen Bauteilen angezeigt<br />
werden kann. Dieser Funktion werden zwei Werte übergeben: die Nummer<br />
des Pfades, in der sich die zu testende Komponente befindet und an welcher<br />
Stelle innerhalb des Pfades sie steht. Durch verschiedene foreach-Schleifen und<br />
if-Abfragen wird dann mit dem Programm fortgefahren oder eine entsprechende<br />
Meldung auf dem Bildschirm erscheint, die besagt dass eine andere Komponente<br />
vorher gewählt werden muss.<br />
Die restlichen Methoden sind zum Auslesen der Daten aus der XML-Datei. Es gibt<br />
jeweils Funktionen zum extrahieren des Komponentenamens, der Komponenten-<br />
ID, des Unique-Wertes (also der Artikelnummer) oder der Pfad-ID. Eine dieser<br />
Funktionen ist die get component from xml, die den Komponentennamen aus der<br />
XML liest. Die zu übergebenen Werte sind die Nummer des Bauteils und optional<br />
einen Parameter der angibt in welcher Form dieser Name zurückgegeben werden<br />
soll. Um den gewünschten Namen zu finden wird ebenfalls mit foreach-Schleifen<br />
Diplomarbeit 46
KAPITEL 5. DIE PROGAMM-DATEIEN<br />
und if-Abfragen das Array der eingelesenen XML-Datei durchlaufen. Der optionale<br />
Parameter gibt an, ob der Name mit oder ohne Umlaute zurückgegeben wird.<br />
Zum Beispiel könnte Laufräder oder Laufraeder ausgegeben werden. Dieses zu implementieren<br />
war notwendig, da die MySQL Datenbank keine deutschen Umlaute<br />
in den Table-Namen erlaubt. So werden alle XML-Funktionen, die Table-Namen<br />
verarbeiten, mit diesem optionalen Parameter aufgerufen, um der Namenskonvention<br />
von MySQL gerecht zu werden.<br />
Eine Funktion durchsucht den Pfad (dessen Pfad-ID übergeben werden muss) und<br />
gibt als Array die in diesem Pfad enthaltenen Komponentennummern zurück. Diese<br />
Operation ist notwendig damit bei dem Entfernen einer Komponente auch alle<br />
nachfolgenden Bauteile gelöscht werden. Die weiteren Funktionen sind alle ähnlich<br />
aufgebaut, da die Struktur der XML sich natürlich nicht ändert. Es gibt verschiedene<br />
Funktionen, die die gleichen Daten extrahieren, aber andere Parameter haben.<br />
So lesen die beiden Funktionen get key from xml und get key from name jeweils<br />
den Unique-Key einer Komponente aus, bei der einen wird jedoch die Komponentennummer<br />
übergeben, bei der anderen der Komponentenname (vgl. Abschnitt<br />
6.4.1 auf Seite 70.<br />
Als Beispiel folgt nun der Code einer dieser Funktionen:<br />
public function get_id_from_name ($name) {<br />
foreach ($this->XML->Path as $path)<br />
{<br />
foreach ($path->Component as $component)<br />
{<br />
if ($name == utf8_decode($component->Name))<br />
{<br />
return utf8_decode($component->attributes());<br />
}<br />
}//end-foreach<br />
foreach ($path->Path as $innerpath)<br />
{<br />
foreach ($innerpath->Component as $component)<br />
Diplomarbeit 47
KAPITEL 5. DIE PROGAMM-DATEIEN<br />
{<br />
if ($name == utf8_decode($component->Name))<br />
{<br />
return utf8_decode($component->attributes());<br />
}<br />
}<br />
}//end-foreach<br />
}//end-foreach<br />
}//end-function<br />
Die hier dargestellte Funktion sucht die dazugehörige Nummer des angegebenen<br />
Komponentennamens. In den ersten beiden foreach-Schleifen wird die oberste<br />
Ebene der Pfade durchlaufen. In dem Fall der XML-Datei des <strong>Renn</strong>rad-<strong>Konfigurators</strong><br />
ist es nur die Komponente Rahmen, die in der obersten Ebene zu finden ist (siehe<br />
Seite 44 für den XML-Aufbau). In den nächsten beiden foreach-Schleifen werden<br />
die unteren Ebenen der Pfade durchsucht. Da es in dieser XML nur zwei Ebenen<br />
von Pfaden gibt, ist es meiner Ansicht nach nicht notwendig gewesen, diese rekursiv<br />
zu realisieren. Sollten weitere Pfad-Ebenen erforderlich sein, so wäre es bestimmt<br />
übersichtlicher diese Funktion rekursiv zu programmieren. Wurde der gewünschte<br />
Komponentenname gefunden, so wird die entsprechende Nummer zurückgegeben.<br />
Die Operation utf8 decode wäre hier nicht unbedingt notwendig, aber bei Namen<br />
ist dies unerlässlich, da sonst die Zeichen nicht richtig dargestellt werden.<br />
5.4 Event-Handler Klasse<br />
Die Event-Handler Klasse war ursprünglich nur dazu gedacht die Ereignisse zu verarbeiten.<br />
Mit Ereignissen sind z. B. Klicks auf die Navigationsleiste, den Auswahl-<br />
Button oder die Entfernen-Schaltfläche gemeint. Allerdings sind im Laufe der Entwicklung<br />
mehrere Funktionen hinzugekommen, die auch zur Darstellung auf dem<br />
Bildschirm oder Verarbeitung von Daten dienen.<br />
Diplomarbeit 48
KAPITEL 5. DIE PROGAMM-DATEIEN<br />
5.4.1 Die Ereignisse<br />
Es gibt insgesamt 5 Ereignisse, die auftreten können, und jedes mal einen Klick<br />
auf einen so genannten Submit-Button bedeuten. Diese Events wären ein Klick<br />
auf die Navigationsleiste, auf den Neustart Link und auf den Auswählen- oder<br />
Entfernen Knopf. Bei zwei Komponenten gibt es noch ein Ereignis, bei der eine<br />
zusätzliche Auswahl erscheint. Jedes Event wird in der Main.php registriert und<br />
an die EventHandler Klasse weitergeleitet. Dort wird mittels der get-Funktion<br />
dieses Ereignis an die entsprechende Funktion verteilt und ausgeführt. Als Beispiel<br />
folgt ein Teil des Programmcodes. Zuerst wird ein Event in der Main.php erfasst:<br />
if (isset($_POST[’navigation’]))<br />
$ev->navbar;<br />
Dadurch wird die EventHandler Klasse aufgerufen und somit auch die<br />
Funktion:<br />
get-<br />
public function __get($event)<br />
{<br />
$method = "handle_".$event."_click";<br />
if (is_callable(array($this, $method)))<br />
{<br />
$this->{$method}();<br />
}<br />
}<br />
So werden alle Events zu den entsprechenden Funktionen weitergeleitet. Jedes<br />
dieser Funktionen ist nach dem Muster handle (der Eventname) click benannt. In<br />
diesen Fall wäre es: public function handle navbar click().<br />
Eine Beschreibung wie diese Funktionen im Einzelnen programmiert wurden und<br />
wie sie arbeiten würde den Rahmen dieses Unterpunktes sprengen. Sie werden im<br />
Abschnitt 6.1 näher erklärt.<br />
Diplomarbeit 49
KAPITEL 5. DIE PROGAMM-DATEIEN<br />
5.4.2 Weitere Funktionen<br />
Unter den weiteren Funktionen sind all die zusammengefasst, die sich um Datenauswertung<br />
oder Darstellung auf dem Bildschirm kümmern. Eine sehr wichtige<br />
Funktion ist navibar, die für die <strong>Erstellung</strong> der Navigationsleiste zuständig ist.<br />
Hier werden zwei Werte übergeben: einmal bei welcher Position die Leiste starten<br />
soll, und einmal die Anzahl nach der die rekursive Funktion abgebrochen werden<br />
soll. Innerhalb der Funktion wird abgefragt, ob es sich um ein <strong>Renn</strong>rad, oder<br />
um ein Triathlonrad handelt, das konfiguriert werden soll, damit bei Ersterem die<br />
Komponente Aeroaufsatz nicht angezeigt wird. Des Weiteren wird überprüft ob<br />
die entsprechende Komponente schon ausgewählt wurde. Falls dies der Fall ist,<br />
wird das Feld für dieses Bauteil farblich hinterlegt.<br />
Eine Funktion innerhalb der EventHandler Klasse ist für das Darstellen der Übersichtstabelle<br />
zuständig und heißt bezeichnenderweise auch overview table. Sie<br />
wird auch aus der Main.php aufgerufen, und geht alle Komponenten der Reihe<br />
nach durch, um zu überprüfen ob diese ausgewählt wurden. Ist das der Fall, wird<br />
anhand der Artikelnummer, die auch gleichzeitig der Primary Key ist, der Artikelname<br />
und Preis aus der Datenbank gelesen und in der Tabelle angezeigt. Es<br />
sind noch weitere Überprüfungen notwendig, wie etwa der Test ob es sich um ein<br />
<strong>Renn</strong>- oder Triathonrad handelt und dem entsprechend die Komponente Aeroaufsatz<br />
gehandhabt wird, oder ob eine Komponente durch die Auswahl <strong>eines</strong> anderen<br />
Bauteils schon vorhanden ist.<br />
overview price ist eine ähnliche Funktion, die allerdings nur für den Gesamtpreis<br />
und -gewicht zuständig ist. Da bei der Speicherung des Sessionwertes keine 0<br />
(Null) übergeben werden kann, muss in dieser Funktion dieses berücksichtigt und<br />
überprüft werden. So wird bei einem nicht gesetzten Sessionwert explizit 0.00e<br />
bzw. 0 g angegeben.<br />
Eine weitere Aufgabe, die die Klasse EventHandler übernimmt, ist nachzuprüfen<br />
ob alle Komponenten ausgewählt wurden, damit ein weiterführender Verweis zu<br />
dem Showroom (vgl. Seite 26 bzw. Seite 42) erscheint. Auch diese Funktion hat<br />
einen entsprechenden Namen, der verdeutlicht wozu sie gebraucht wird: check if all<br />
set(). Hierzu werden alle vorhandenen Komponenten mit dem Befehl $this-><br />
Diplomarbeit 50
KAPITEL 5. DIE PROGAMM-DATEIEN<br />
xml->get ids in path(’00’) in ein Array geladen, um dann alle Elemente mit<br />
einer foreach-Schleife durchzugehen. Sobald eine Komponente nicht gewählt wurde,<br />
wird die Schleife abgebrochen und ein false zurückgegeben. Wenn die Schleife<br />
aber komplett durchlaufen wird, so erscheint auf dem Bildschirm der weiterführende<br />
Link, da ein true zurückgegeben wurde.<br />
Die letzte Funktion, die keine Ereignisse verarbeitet, heißt save item. Es werden<br />
hier die Artikelnummern der ausgewählten Komponenten gespeichert. Da<br />
es möglich ist, bis zu drei Fahrräder zu konfigurieren, und alle später in dem<br />
Showroom dargestellt werden sollen, werden alle Artikelnummern in ein zweidimensionales<br />
Array gespeichert, damit diese Informationen auch später noch<br />
verfügbar sind. Wie dies geschieht soll hier verdeutlicht werden:<br />
public function save_item() {<br />
$num = ($_SESSION[’number’]-1);<br />
$ids = $this->xml->get_ids_in_path(’00’);<br />
foreach ($ids as $single_id)<br />
{<br />
$all[$num][$single_id] =<br />
$_SESSION[$this->xml->get_key_from_xml($single_id)];<br />
}<br />
if ($num > 0)<br />
{<br />
$all = $all + $_SESSION[’all’];<br />
}<br />
$this->session->register_session(all, $all);<br />
...<br />
}<br />
Die Sessionvariable number beinhaltet die Nummer des aktuell konfigurierten Rades.<br />
Da keine 0 (Null) gespeichert werden kann, fängt number bei eins an. Die Variable<br />
$num sollte allerdings wegen dem Array bei 0 (Null) anfangen. In der nächsten<br />
Zeile werden wieder alle vorhanden Komponenten-IDs in ein (ein-dimensionales)<br />
Diplomarbeit 51
KAPITEL 5. DIE PROGAMM-DATEIEN<br />
Array gespeichert. Mit der foreach-Schleife werden nun alle Bauteile nacheinander<br />
durchgegangen und mittels der Komponenten-ID die Artikelnummer aus den<br />
jeweiligen Sessionvariablen im zwei-dimensionalen Array gespeichert. Die nächste<br />
Abfrage ob $num größer Null sei, ist notwendig, da sonst Fehlermeldungen vom<br />
php-Parser auftreten, weil dort zwei Arrays zusammengefügt werden. Schließlich<br />
wird das Array in einer Sessionvariable gespeichert, damit die Informationen erhalten<br />
bleiben.<br />
In der Funktion werden auch Gesamtpreis und Gesamtgewicht in ein separates<br />
zwei-dimensionales Array gespeichert, da auch diese Angaben für alle Fahrräder<br />
im Showroom benötigt werden.<br />
Diplomarbeit 52
Kapitel 6<br />
Das Programm aus Sicht des<br />
Entwicklers<br />
In diesem Kapitel soll näher und detaillierter auf den Programmcode eingegangen<br />
werden. Es werden die Zusammenhänge zwischen den Klassen und einzelnen<br />
Funktionen erläutert, und teilweise wie der Code genau funktioniert.<br />
6.1 Events<br />
In diesem Unterkapitel geht es um die Ereignisse, die bei dem Konfigurator auftreten<br />
können. Insgesamt sind es fünf Events die den gesamten Konfigurator steuern.<br />
Ihre groben Funktionen wurden schon in Abschnitt 5.4.1 angesprochen. Dort wurde<br />
auch gezeigt, wie die Ereignisse in der EventHandler Klasse aufgerufen werden.<br />
Hier soll noch einmal in detaillierter Form darauf eingegangen werden, was genau<br />
in den einzelnen Funktionen passiert, da die Ereignisse ein unverzichtbarer Bestandteil<br />
des <strong>Konfigurators</strong> sind.<br />
Diplomarbeit 53
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
6.1.1 Navigation<br />
Nachdem der Nutzer auf die Navigationsleiste klickt, wird in der EventHandler<br />
Klasse die handle navbar click-Funktion aufgerufen (vgl. Seite 49). Innerhalb<br />
dieser Funktion wird dann die entsprechende Komponentenklasse aufgerufen. Die<br />
Komponentenklassen wurden in der Main.php mit den Variablen $c01, $c02, . . .<br />
für jede Komponente initialisiert.<br />
function handle_navbar_click()<br />
{<br />
if(empty($_SESSION[’nav’]))<br />
$num = ’01’;<br />
else<br />
$num = $this->xml->get_id_from_name ($_SESSION[’nav’]);<br />
}<br />
eval(’global ${c.$num};’);<br />
${c.$num}->display();<br />
Die erste Abfrage überprüft, ob die Session-Variable, die die aktuelle Komponente<br />
speichert, überhaupt gesetzt ist. Falls es nicht so ist, dann wird die Variable<br />
$num auf 01 gesetzt, damit die Daten für die erste Komponente dargestellt werden<br />
können.<br />
Beinhaltet die Session-Variable nav einen Wert, so wird die zugehörige Komponenten-ID<br />
aus der XML-Datei gelesen. Da der gespeicherte Wert in der Session-<br />
Variable stets mit den Komponentennamen in der XML übereinstimmt, ist dieses<br />
Vorgehen ohne Probleme möglich.<br />
Durch den Befehl eval(’global ${c.$num};’); ist es möglich auf die Methoden<br />
der Komponentenklasse innerhalb der EventHandler Klasse zuzugreifen, da die<br />
Instanz der Komponentenklasse global verfügbar gemacht wird. So ist dann auch<br />
die display()-Funktion problemlos aufrufbar [Tut05].<br />
Das ${c.$num} ist eine so genannte variable Variable“. Je nach der aus der XML<br />
”<br />
ausgelesenen Komponenten-ID, wird eine andere Komponentenklasse aufgerufen.<br />
Diplomarbeit 54
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
6.1.2 Entfernen<br />
Zuerst wird die handle remove click-Funktion aufgerufen, und danach die entsprechende<br />
Komponentenklasse. Dies geschieht nach dem gleichen Mechanismus,<br />
wie bei der handle navbar click-Funktion. Mit dem Befehl ${c.$num}-><br />
remove(); wird die entsprechende Funktion in der Komponentenklasse aufgerufen,<br />
die je nach Komponente sofort in der Elternklasse die Remove-Routine aufruft,<br />
oder vorher noch bestimmte Session-Variablen entfernt, wie z. B. die Schaltgruppen-<br />
Marke. Durch ${c.$num}->display(); werden dann sofort die kompatiblen Komponenten<br />
wieder angezeigt. Mit dem anschließenden Befehl $this->save item();<br />
werden die aktuellen Daten in ein zwei-dimensionales Array gespeichert (siehe Seite<br />
51).<br />
6.1.3 Auswahl<br />
Auch die handle choice click-Funktion ist ähnlich aufgebaut und wird genau<br />
so wie die anderen Methoden aufgerufen. Es wird erst die entsprechende Komponentenklasse<br />
aus der Navigations-Session-Variable ermittelt und global verfügbar<br />
gemacht. Danach wird die Funktion ${c.$num}->set session() aufgerufen, die<br />
innerhalb der Komponentenklasse die Session-Variable für die Komponente und<br />
andere Variablen setzt. Um zu verhindern, dass ein mehrmaliges Klicken auf den<br />
Auswahl-Button einen Effekt hat, muss eine if-Abfrage dieses testen. Außerdem<br />
darf es nicht passieren, dass ein anderer Artikel gewählt werden kann, ohne dass<br />
vorher der Entfernen-Button angeklickt wurde. Durch diese Abfrage wird das realisiert:<br />
if (empty($_SESSION[$this->xml->get_key_from_xml($num)]) or<br />
$_POST[$this->xml->get_key_from_xml($num)] !=<br />
$_SESSION[$this->xml->get_component_from_xml($num)])<br />
{<br />
${c.$num}->set_session();<br />
}<br />
Diplomarbeit 55
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
Es werden hier zwei Dinge überprüft. Zum einen ob die Session-Variable überhaupt<br />
gesetzt ist, denn ist das nicht der Fall, so wurde diese Komponente vorher noch<br />
nicht ausgewählt und es ist somit zulässig die entsprechenden Variablen zu setzen.<br />
Die zweite Überprüfung nach dem or testet, ob der gerade ausgewählte Artikel<br />
nicht identisch mit der schon gespeicherten Komponente ist. Dadurch wird<br />
gewährleistet, dass alle Klicks auf den Auswahl-Button dieser Komponente ignoriert<br />
werden, solange nicht vorher dieses Bauteil wieder entfernt wird.<br />
6.1.4 Zusätzliche Auswahl<br />
Damit die Komponententabelle nicht zu lang und unübersichtlich wird, war es<br />
notwendig eine zusätzliche Auswahl für die Längen bestimmter Komponenten zu<br />
implementieren (vgl. Abschnitt 3.2.2 auf Seite 23).<br />
Grundsätzlich unterscheidet sich die handle additional click nicht von der<br />
handle choice click-Funktion. Es wird ebenfalls die gleiche if-Abfrage benutzt<br />
um mehrmaliges Anklicken des Auswahl-Buttons zu verhindern. Der einzige Unterschied<br />
besteht darin, dass nach dem Befehl ${c.$num}->set session() noch<br />
ein ${c.$num}->additional() folgt, in dessen Funktion dann die zusätzliche Auswahl<br />
in der dazugehörigen Komponentenklasse abgehandelt wird.<br />
6.1.5 Reset<br />
Diese Funktion ist dafür zuständig, dass nach dem Klicken des Neustart-Buttons<br />
alle relevanten Session-Variablen gelöscht werden. Auch hier läuft der Aufruf der<br />
Methode nach diesem Event nach dem gleichen Muster ab, wie bei den Anderen.<br />
Im Grunde ist der Vorgang des Neustarts ähnlich dem des Löschens des Rahmens:<br />
Alle Komponenten-Session-Variablen werden gelöscht. Dennoch werden hier noch<br />
zusätzliche Variablen, wie Gesamtpreis und -gewicht gelöscht, während diese Daten<br />
beim Entfernen des Rahmens nur neu berechnet werden.<br />
Der Aufruf aus der Main.php lautet hier im Übrigen $ev->reset und somit die<br />
Funktion in der EventHandler Klasse handle reset click(), da das Wort reset<br />
schon für eine andere Funktion reserviert ist.<br />
Diplomarbeit 56
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
public function handle_reset__click()<br />
{<br />
eval(’global $c01;’);<br />
$ids = $this->xml->get_ids_in_path(’00’);<br />
foreach ($ids as $single_id)<br />
{<br />
if (1 session->unregister_session(<br />
$this->xml->get_key_from_xml($single_id));<br />
}<br />
}<br />
$this->session->unregister_session(brand);<br />
$this->session->reset_sessionvalue(weight);<br />
$this->session->reset_sessionvalue(price);<br />
$this->session->unregister_session(nav);<br />
$navigation = $this->xml->get_component_from_xml(1);<br />
$this->session->register_session(nav, $navigation);<br />
$c01->display();<br />
}<br />
$this->save_item();<br />
Zuerst wird die Instanz der Komponentenklasse global verfügbar gemacht, so dass<br />
auf die Funktionen dieser Klasse innerhalb der EventHandler Klasse darauf zugegriffen<br />
werden kann. Hier wird nur die Komponentenklasse des Rahmens aufgerufen,<br />
da nach einem Neustart in jedem Fall der Rahmen als erstes benötigt<br />
wird. Dann werden alle vorhandenen Komponenten-IDs in ein Array geladen, damit<br />
sie mit einer foreach-Schleife bequem abgearbeitet werden können. In der<br />
darauf folgenden Schleife werden die gesamten Komponenten-Session-Variablen<br />
Diplomarbeit 57
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
gelöscht, und in den nächsten vier Zeilen die anderen relevanten Variablen, wie<br />
Preis, Gewicht oder Navigation. Danach wird in den beiden folgenden Zeilen die<br />
Navigation auf dem Rahmen gesetzt und mit dem Befehl $c01->display() wird<br />
die Komponententabelle dargestellt. Anschließend wird noch das Ganze im zweidimensionalen<br />
Array aktualisiert durch die $this->save item()-Instruktion.<br />
6.2 Komponentenklassen<br />
Jede Komponente hat ihre eigene Klasse, da jedes Bauteil verschiedene Anforderungen<br />
mit sich bringt, bzw. verschiedenste Abhängigkeiten haben. Dies konnte am<br />
besten und am übersichtlichsten gestaltet werden, indem jede Komponente ihre eigene<br />
Klasse bekam, in der die Bauteilspezifischen Eigenheiten bearbeitet werden<br />
können. Wie schon in Abschnitt 6.1.1 beschrieben, haben die Klassen, wegen der<br />
einfacheren Bearbeitung, eine bestimmte Objektvariable. Die Erzeugung der vierzehn<br />
Komponenten-Objekte geschieht in der Main.php und sieht folgendermaßen<br />
aus:<br />
for ($i = 1; $i < 15; $i++)<br />
{<br />
$num = sprintf("%02d", $i);<br />
$com_function = "Component".$num;<br />
}<br />
${c.$num} = new $com_function($db,$sh,$xm);<br />
Hier wird eine Schleife durchlaufen, in der z. B. bei der Erzeugung des Objekts für<br />
Component01 die Variable $c01 zugewiesen wird. Das geschieht bei allen vierzehn<br />
Komponenten. An den Constructor (in der Elternklasse) werden die Referenzen<br />
zu den Objekten des DBHandlers, des SessionHandlers und des XMLHandlers<br />
übergeben, damit die Funktionen dieser Klasse auch innerhalb der Komponentenklassen<br />
verfügbar sind.<br />
Diplomarbeit 58
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
Aufgrund der vielen verschiedenen Anforderungen jeder Komponente, beinhaltet<br />
jede Klasse zwar Funktionen, die bei jedem Bauteil gleich sind, aber andere Fahrradelemente<br />
haben zusätzliche Funktion, die für besondere Aufgaben benötigt werden.<br />
Als Beispiel sei die additional info-Funktion genannt, die nur bei ein paar<br />
Komponenten gebraucht wird, und einen kleinen Infotext auf dem Bildschirm anzeigt.<br />
Natürlich ist der Inhalt der gemeinsamen Funktion je nach Anforderung der Komponente<br />
verschieden. Da es den Umfang einer Diplomarbeit übersteigen würde,<br />
wird aber darauf verzichtet den Code jeder einzelnen Funktion jeder Komponentenklasse<br />
eingehend zu beschreiben. Nur auf die generellen Aufgaben mit kleinen<br />
Code-Beispielen so hier eingegangen werden.<br />
6.2.1 Funktion set session<br />
Innerhalb dieser Funktion wird dafür gesorgt, dass die eindeutige Artikelnummer<br />
in den entsprechenden Session-Variablen gespeichert wird. Des Weiteren werden<br />
bei Bedarf weitere Session-Variablen gesetzt, so z. B. wenn der Rahmen schon<br />
mit einer Gabel geliefert wird. Bei jedem Klick auf den Auswahl-Button wird die<br />
eindeutige Artikelnummer als POST-Variable übergeben. Durch diese Befehlsfolge<br />
wird zuerst abgefragt ob die POST-Variable überhaupt gesetzt ist, um dann in der<br />
Session-Variable gespeichert zu werden. In diesem Beispiel wird die Artikelnummer<br />
der ersten Komponente, also des Rahmens, gespeichert.<br />
$component01 = isset($_POST[$this->xml->get_component_from_xml(1)])<br />
? $_POST[$this->xml->get_component_from_xml(1)]<br />
: ’’;<br />
$this->session->register_session($this->xml->get_key_from_xml(1),<br />
$component01);<br />
Dieser Teil wird in jeder Komponentenklasse ausgeführt. Das Folgende wird nur<br />
angewendet, wenn eine Komponente Auswirkungen auf andere Bauteile hat.<br />
Diplomarbeit 59
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
Die nächste Instruktion dient dazu anhand der Artikelnummer den gesamten Datensatz<br />
aus der Datenbank zu lesen und lautet $choice = $this->db-><br />
GetComponentArray($ SESSION[$this->xml->get key from xml(1)],<br />
$this->xml->get component from xml(1)). Der Befehl GetComponentArray hat<br />
zwei Argumente. Das Erste ist der Name, den die Session-Variable erhält, also die<br />
eindeutige Artikelnummer. Das zweite Argument ist der Name der Table, in dem<br />
der Artikel gespeichert ist. Das zurückgegebene Ergebnis ist ein Array, in dem die<br />
Werte aus der Datenbank nacheinander abgelegt sind.<br />
Danach werden, je nach Komponente und Artikel, die anderen Session-Variablen<br />
gesetzt. Um bei dem Beispiel des Rahmens zu bleiben, wird dann abgefragt ob<br />
andere Komponenten bei diesem Rahmen schon vorhanden sind. Dafür werden die<br />
aus der Datenbank ausgelesenen Informationen verwertet.<br />
if ($choice[8] == 1)<br />
{<br />
$this->session->register_session(<br />
$this->xml->get_key_from_xml(3), ’Vorhanden’);<br />
}<br />
else if ($choice[8] == 0 and<br />
$_SESSION[$this->xml->get_key_from_xml(3)] === ’Vorhanden’)<br />
{<br />
$this->session->reset_sessionvalue(<br />
$this->xml->get_key_from_xml(3));<br />
}<br />
Hier wird in der if-Abfrage überprüft ob der ausgewählte Rahmen schon eine Gabel<br />
besitzt. Falls das so ist, wird die Session-Variable für die Gabel mit dem Wert<br />
Vorhanden“ besetzt.<br />
”<br />
Die nächste Abfrage gilt dafür wenn ein Rahmen, der eine Gabel besitzt, ausgewählt,<br />
dann aber gelöscht wird, und danach ein Rahmen ohne Gabel gewählt<br />
wird. Das ”<br />
Vorhanden“ wird aus der Session-Variable gelöscht wenn der gewählte<br />
Rahmen keine Gabel besitzt und wenn diese Variable mit ”<br />
Vorhanden“ belegt ist.<br />
So ähnlich funktioniert es bei jeder Komponente, die Auswirkungen auf andere<br />
Diplomarbeit 60
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
Bauteile hat. Dabei muss es nicht nur darum gehen, ob eine andere Komponente<br />
vorhanden ist oder nicht, sondern auch welche Schaltgruppenmarke verwendet<br />
wird.<br />
Der nächste Befehl parent::update it($this->xml->get id from name<br />
($ SESSION[’nav’]), 1) wird auch in jeder Komponentenklasse verwendet, denn<br />
er aktualisiert den Gesamtpreis bzw. -gewicht. Die Ausführung wird durch die Elternklasse<br />
erledigt. Die beiden Argumente, die übergeben werden, sind zum einen<br />
die Komponenten-ID, und zum anderen das Vorzeichen. D.h. das Vorzeichen bestimmt<br />
ob der Betrag zum Gesamtergebnis addiert oder davon subtrahiert wird.<br />
6.2.2 Funktion display<br />
Dieses ist wohl die wichtigste Funktion im Programm des <strong>Konfigurators</strong>. Nicht<br />
nur, weil hier die Komponententabelle mit den Auswahl- und Entfernen-Buttons<br />
erzeugt wird, sondern auch weil in dieser Funktion die nicht kompatiblen Bauteile<br />
ausgefiltert werden. Deshalb mag der Funktionsname etwas in die Irre führen, da<br />
hier mehr geleistet wird als nur das Darstellen. Als Beispiel, an dem die Funktionen<br />
erklärt werden sollen, sei hier die Komponente 13 (die Sattelstütze) aufgeführt, da<br />
dort zwar alle wichtigen Aufgaben vorkommen, aber dennoch diese Funktion nicht<br />
zu kompliziert ist, und zu viel Code enthält.<br />
Bei jedem Klick auf die Navigationsleiste wird, bevor die Komponententabelle<br />
dargestellt wird, eine Überprüfung gestartet, ob die vorangegangenen Komponenten<br />
dieses Pfades schon ausgewählt wurden. Dieses geschieht durch eine einfache<br />
if-Abfrage und lautet in diesem Beispiel if ($this->xml->test set(4,1)). Die<br />
beiden Argumente in der Funktion zeigen an, dass dies der vierte Pfad, und die Sattelstütze<br />
darin die erste Komponente ist. Also muss hier nur der Rahmen gewählt<br />
sein, damit die Komponententabelle für dieses Bauteil angezeigt wird.<br />
Als nächstes werden die Daten des ausgewählten Rahmens mittels der schon bekannten<br />
Funktion GetComponentArray in ein Array geladen. Die Sattelstütze ist<br />
von den Vorgaben des Rahmens abhängig (vgl. Abschnitt 2.2) und deshalb ist es<br />
notwendig diese Daten zu ermitteln. Der Rest der display-Funktion besteht aus<br />
Diplomarbeit 61
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
einer if-else-Abfrage, in der geprüft wird, ob der vorher ausgewählte Rahmen<br />
nicht schon eine Sattelstütze besitzt, in dem der Ausdruck if ($FrameRow[10] ><br />
90) verwendet wird. In der Datenbank ist an dieser Stelle normalerweise der Durchmesser<br />
vermerkt. Ist dieser Wert aber über 90, so interpretiert das Programm es<br />
aber als eine schon vorhandene Sattelstütze. Ähnliche Abfragen gibt es auch für<br />
den Aeroaufsatz, die Gabel oder den Steuersatz. Ist diese if-Abfrage wahr, so wird<br />
der Text Sattelstütze schon vorhanden“ ausgegeben.<br />
”<br />
Der restliche Code befindet sich im else-Teil der Abfrage. Der einfacheren Beschreibung<br />
halber ist er hier abgebildet:<br />
$dbquery = "SELECT * FROM ".$this->xml->get_component_from_xml(13,1)<br />
. "WHERE durchmesser between ".($FrameRow[10]-0.01)<br />
. " and " . ($FrameRow[10] + 0.01);<br />
$SeatpostResultSet = $this->db->query_db($dbquery);<br />
echo "";<br />
while ($SeatpostRow = mysql_fetch_row($SeatpostResultSet))<br />
{<br />
$artnr = $_SESSION[$key13];<br />
parent::display_head($SeatpostRow);<br />
echo "<br />
Durchmesser: ".$SeatpostRow[7]."mm<br />
Länge: ".$SeatpostRow[6]."mm<br />
";<br />
parent::display_footer($SeatpostRow, $artnr);<br />
}<br />
echo "";<br />
Der $dbquery-String ist die Anfrage an die Datenbank, nur diejenigen Datensätze<br />
herauszusuchen, die gleich dem Durchmesser der Sattelstütze des Rahmens ist.<br />
Der Ausdruck between ".($FrameRow[10]-0.01). " and ".($FrameRow[10] +<br />
Diplomarbeit 62
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
0.01)" ist notwendig, da MySQL Probleme mit der Genauigkeit von Nachkommastellen<br />
hat. In der nächsten Zeile wird diese Anfrage abgeschickt, und das Ergebnis<br />
wird in $SeatpostResultSet gespeichert.<br />
Nun beginnt die eigentliche <strong>Erstellung</strong> der Komponententabelle. Solange noch Datensätze<br />
vorhanden sind, wird die while-Schleife ausgeführt. Der obere Teil der<br />
Tabelle <strong>eines</strong> Artikels wird in der Elternklasse durchgeführt, da immer Preis, Name,<br />
Artikelnummer usw. dort dargestellt werden. In der Funktion display footer<br />
wird der untere Teil der Tabelle angezeigt, der das Gewicht, den Auswahl-Button<br />
und ggf. den Entfernen-Button beinhaltet.<br />
Dazwischen können weitere, komponentenspezifische Informationen, eingefügt werden,<br />
so wie es in dem Beispiel zu sehen ist.<br />
6.2.3 Weitere Funktionen<br />
Bei den weiteren Funktionen handelt es sich, bis auf remove, um Funktionen<br />
die nicht in jeder Komponentenklasse vorkommen. Da wäre additional und die<br />
additional info-Funktion, die eine Informationsbox darstellt.<br />
Bei remove handelt es sich, wie der Name vermuten lässt, um eine Funktion,<br />
die die Aufgabe des Entfernens von Komponenten hat. Bei vielen Komponentenklassen<br />
wird einfach der Befehl parent::remove components($this->xml-><br />
get path id from name($ SESSION[’nav’]), $this->xml->get id from name<br />
($ SESSION[’nav’])) ausgeführt. Doch bei Bauteilen, die mit der Schaltgruppenmarke<br />
zusammenhängen, müssen in dieser Funktion noch zusätzlich einige Abfragen<br />
vorhanden sein, bei denen getestet wird, ob die Session-Variable der Marke<br />
gelöscht werden kann. Das sieht dann, wie z. B. bei den Laufrädern, so aus:<br />
$var = $this->db->GetComponentArray(<br />
$_SESSION[$this->xml->get_key_from_xml(9)],<br />
$this->xml->get_component_from_xml(9,1));<br />
if ( (empty($_SESSION[$this->xml->get_key_from_xml(9)]) or<br />
$var[17] == 2) and<br />
Diplomarbeit 63
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
{<br />
}<br />
empty($_SESSION[$this->xml->get_key_from_xml(10)]))<br />
$this->session->reset_sessionvalue(brand);<br />
Die Funktion additional ist ähnlich der display. Nur werden hier nicht vorher<br />
die nicht kompatiblen Artikel herausgefiltert und dann angezeigt, sondern die verschiedenen<br />
Längen der ausgewählten Komponente aus der Datenbank ausgelesen<br />
und dann als eigene Komponententabelle dargestellt. Diese Funktion wird aber<br />
nur bei dem Vorbau und bei den Kurbelsätzen gebraucht.<br />
Zum Darstellen wird einfach der Datensatz des ausgewählten Artikels aus der Datenbank<br />
extrahiert und die verschiedenen Längen nacheinander mittels einer for-<br />
Schleife angezeigt. Die Funktionen der Elternklasse display head und display<br />
footer kommen auch zum Einsatz, damit erstens diese zusätzliche Tabelle sich<br />
nicht vom Aussehen her viel von der Komponententabelle unterscheidet, und zweitens<br />
wird der Code wieder verwendet.<br />
Abschließend ist in diesem Abschnitt noch die Funktion additional info zu nennen,<br />
die gegebenenfalls aus der display aufgerufen wird, denn nicht jede Komponente<br />
bedarf einer zusätzlichen Information oder Erklärung. Das Ganze ist auch<br />
dynamisch gestaltet, so dass machen Information nicht mehr erscheinen wenn z. B.<br />
die Schaltgruppenmarke schon gewählt wurde.<br />
6.3 Elternklasse<br />
Alle verwendeten Komponentenklassen sind von der Elternklasse abgleitet. Der<br />
Name der php ist bezeichnenderweise ComponentParent. Hier sind alle Methoden<br />
zusammengefasst, die von allen Komponenten benutzt werden. Hier werden<br />
auch über den Konstruktor die Funktionen der Klassen, die XML-, Datenbankoder<br />
Sessionangelegenheiten erledigen, verfügbar gemacht. Die Elternklasse hat<br />
drei Aufgaben: Das Entfernen von Komponenten, das Darstellen der Komponententabelle<br />
und die Berechnung von Gesamtpreis und -gewicht.<br />
Diplomarbeit 64
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
Im Folgenden wird auf die Methoden detailliert eingegangen und erklärt wie sie<br />
aufgebaut sind und funktionieren.<br />
6.3.1 Komponentendarstellung<br />
Dieser Teil des Programms ist sehr wichtig und auch etwas kompliziert, da hier<br />
nicht nur die Komponententabelle erstellt wird, sondern auch noch die Klicks auf<br />
den Auswahl- bzw. gegebenenfalls auch den Entfernen-Button gehandhabt werden<br />
müssen.<br />
Die Darstellung ist in zwei Teile gegliedert. Dies wurde so realisiert damit noch<br />
komponentenspezifische Informationen in der Tabelle aufgenommen werden können,<br />
wie z. B. die Breite bei den Reifen. Der obere Teil enthält immer die gleichen Daten,<br />
wie Preis oder Artikelname. Der unter Abschnitt beinhaltet nur die Information<br />
über das Gewicht und die beiden wichtigen Schaltflächen.<br />
display head<br />
Hier wird, wie der Name schon aussagt, der obere Teil der Komponententabelle<br />
erzeugt. Der Methode wird nur ein Parameter übergeben, das hier $field genannt<br />
ist. $field ist ein Array, das die aus der Datenbank ausgelesenen Daten für den<br />
gerade darzustellenden Artikel enthält. Da die Informationen hier angezeigt werden<br />
sollen, die in der Datenbank für jede Komponente an der gleichen Stelle gespeichert<br />
sind, stehen diese Daten auch im übergebenen Array immer am selben Ort. Daher<br />
beinhaltet z. B. $field[0] immer die Artikelnummer, oder $field[4] immer den<br />
Preis usw. (vgl. Abschnitt 4.1.1). Somit ist es sehr leicht die obere Sektion der<br />
Tabelle zu erzeugen, da hier hauptsächlich nur HTML-Code gebraucht wird, in<br />
dem die einzelnen Elemente des Array eingebettet werden.<br />
display footer<br />
In dieser Methode werden, neben dem Gewicht, die unverzichtbaren Schaltflächen<br />
für die Auswahl bzw. das Entfernen einer Komponente angezeigt, und so erstellt,<br />
Diplomarbeit 65
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
Abbildung 6.1: Aufteilung zwischen Footer und Head<br />
dass der Event des Anklickens registriert werden kann. Dieser Funktion können drei<br />
Parameter übergeben werden, wobei zwei davon optional sind. Das oben schon beschriebene<br />
Array $field muss jedes Mal übergeben werden. Optional sind die Informationen<br />
über die Artikelnummer <strong>eines</strong> eventuell schon ausgewählten Bauteils,<br />
und der Parameter, der aussagt, ob es sich nun um eine normale Komponententabelle,<br />
oder um eine zusätzliche Auswahl handeln soll. Wird Letzteres weggelassen,<br />
so wird automatisch eine normale Komponententabelle erstellt, da dies der vorgegebene<br />
Wert ist.<br />
Der normale Ablauf, ohne eine nachträgliche zusätzliche Auswahl, wird folgendermaßen<br />
durchgeführt: In der jeweilige Komponentenklasse wird diese Funktion<br />
in der Elternklasse aufgerufen. Das aus der Datenbank gelesene Array und die<br />
Artikelnummer <strong>eines</strong> evtl. schon ausgewählten Bauteils werden übergeben und<br />
dann der untere Teil der Tabelle dargestellt. Dieser Teil beginnt mit dem Gewicht.<br />
Danach wird eine Abfrage ausgeführt, die testen soll, ob die Artikelnummer des<br />
gerade darzustellenden Artikels, mit der gepeicherten Nummer in der entsprechenden<br />
Session-Variablen übereinstimmt. Ist das der Fall, so wird die Schaltfläche zum<br />
Entfernen bei diesem Bauteil angezeigt. Dann wird der Auswahl-Button angezeigt,<br />
Diplomarbeit 66
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
der natürlich wieder bei jedem Artikel dargestellt wird.<br />
Die beiden Schaltflächen zum Auswählen oder Entfernen sind HTML-Formulare,<br />
und haben jeweils versteckte Felder, damit z. B. der eingetretene Event in der<br />
Main.php registriert werden kann.<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "";<br />
Dies hier ist das Formular für das Entfernen, was nur bei dem Bauteil erscheint,<br />
das vorher ausgewählt wurde. Der Name lautet remove, so dass das Ereignis in<br />
der Main.php als remove“ erkannt wird. Der Wert der Artikelnummer, die in<br />
”<br />
$field[0] gespeichert ist, wird bei der jetzigen Version des Prototypen nicht<br />
mehr verwendet, und wurde während der Entwicklungszeit zu Überprüfungszwecken<br />
gebraucht.<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "";<br />
Diplomarbeit 67
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
Das Formular für den Auswahl-Button hat zwei versteckte Felder. Außerdem ist<br />
der Name des sichtbaren und <strong>eines</strong> versteckten Feldes variabel. Der Grund dafür<br />
ist, dass unterscheiden werden muss, ob es nun die Auswahl-Schaltfläche bei einer<br />
normalen Komponententabelle, oder ein Button bei einer zusätzlichen Auswahl<br />
handelt. Das zweite versteckte Feld ist notwendig, damit später auch der ausgewählte<br />
Artikel in der Session-Variable abgespeichert werden kann.<br />
Die Variable $name kann die Werte additional oder auswahl annehmen. Also<br />
kann je nach Namen eine andere POST-Variable abgefragt, und somit ein anderes<br />
Ereignis registriert werden. Dazu muss in der Komponentenklassenmethode<br />
display der dritte Parameter explizit übergeben werden, so dass, nachdem der<br />
Artikel ausgewählt wurde, die Funktion zur Darstellung der zusätzlichen Auswahl<br />
aufgerufen werden kann.<br />
6.3.2 Komponenten entfernen<br />
In dieser Funktion der Elternklasse wird das Entfernen der Komponenten in einem<br />
Pfad gehandhabt. Die Methode ist in dieser Klasse, da das Löschen bei jedem<br />
Bauteil der gleiche Vorgang ist.<br />
Hier werden zwei Parameter beim Aufruf übergeben. Zum einen die ID des Pfades,<br />
die $comp id genannt wird, und zum anderen $path id, die Position an der sich<br />
die zu löschende Komponente innerhalb des Pfades befindet. Dies ist notwendig,<br />
damit die nachfolgenden Bauteile auch gelöscht werden um Inkompatibilitäten der<br />
Elemente zu vermeiden.<br />
Zunächst wird der Befehl $ids = $this->xml->get ids in path($path id) ausgeführt,<br />
damit aus der XML alle Komponenten <strong>eines</strong> Pfades in ein Array gespeichert<br />
werden. Der eigentliche Löschvorgang ist eine einfache foreach-Schleife.<br />
foreach ($ids as $single_id)<br />
{<br />
if ($comp_id update_it($single_id, -1);<br />
Diplomarbeit 68
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
}<br />
}<br />
$this->session->unregister_session<br />
($this->xml->get_key_from_xml($single_id));<br />
In der Schleife werden erst einmal alle in dem Array befindlichen Komponenten<br />
durchgegangen. Falls nun die Nummer des Indexes (also $single id höher oder<br />
gleich der angegebenen Position innerhalb des Arrays ist, so werden die Komponenten<br />
entfernt. Das bedeutet, dass alle nachfolgenden Bauteile innerhalb des<br />
Pfades ebenfalls gelöscht werden. Das eigentliche Entfernen geschieht durch die Anweisung<br />
$this->session->unregister session, in dem als Argument der Name<br />
der Session-Variable steht. Dieser wird ebenfalls mittels der $single id) aus der<br />
XML gelesen.<br />
Die Session-Variable mit dem Namen brand, die keine Komponente ist, muss unter<br />
bestimmten Umständen ebenfalls gelöscht werden. Das geschieht wenn keine der<br />
Bauteile Laufräder, Kurbelsatz oder Schaltgruppe ausgewählt sind bzw. wenn eine<br />
gelöscht, und keine der anderen Komponenten gewählt wurde. Das Ganze wird<br />
durch eine einfache if-Abfrage realisiert, in der das Vorhandensein der Bauteile<br />
geprüft und mittels UND verknüpft werden.<br />
6.3.3 Preis- und Gewichtsaktualisierung<br />
Der Zweck dieser Methode ist es, den angezeigten Gesamtpreis und das Gesamtgewicht<br />
aktuell zu halten. Dazu wird beim Aufrufen der Funktion als Parameter die<br />
ID der Komponente, dessen Gewicht und Preis addiert bzw. subtrahiert werden<br />
soll, übergeben. Als zweiter Wert wird das Vorzeichen (also eine 1 oder eine -1)<br />
angegeben.<br />
Es wird als erstes innerhalb der Funktion die Daten der Komponente aus der<br />
Datenbank gelesen und in ein Array gespeichert. Dies geschieht wieder mit der<br />
Methode GetComponentArray. An Position 1 im Array befindet sich immer der<br />
Wert des Gewichts und an Position 4 immer der Preis. Diese Werte werden dann<br />
zu der entsprechenden Session-Variable hinzuaddiert bzw. abgezogen.<br />
Diplomarbeit 69
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
$weight = $_SESSION[’weight’] + ($info[1] * $sign);<br />
$price = $_SESSION[’price’] + ($info[4] * $sign);<br />
Falls Gewicht oder Preis gleich 0 (null) ist, wird die Session-Variable zurückgesetzt,<br />
da bei einer Speicherung der Wert 0 (null) nicht zulässig ist, und ignoriert wird.<br />
Das wird durch eine if-Abfrage für die jeweiligen Variablen realisiert. Zu letzt<br />
werden dann $price und $weight in den Session-Variablen gespeichert, wobei<br />
$price vorher auf zwei Nachkommastellen gerundet wird.<br />
6.4 Weitere Klassen<br />
In diesem Abschnitt soll es um die Beschreibung der restlichen Klassen gehen.<br />
Zum Teil, weil sie schon recht ausführlich behandelt wurden (wie die XML Handler<br />
Klasse), oder aus dem Grund, weil die Funktionen nicht so umfangreich sind, dass<br />
ein ganzer Abschnitt dafür gerechtfertigt wäre.<br />
6.4.1 XML Handler Klasse<br />
Diese Klasse wurde in Abschnitt 5.3.2 schon recht ausführlich beschrieben. Auch<br />
der Aufbau wurde in der Sektion 5.3.1 schon behandelt. Hier sollen einmal alle<br />
Methoden der Klasse aufgeführt werden, damit ein Überblick geschaffen wird, was<br />
diese Klasse alles auslesen und bearbeiten kann.<br />
construct Der Konstruktor hat einen String als Parameter, der den Dateinamen<br />
angibt. So kann beim instanzieren schon die Datei geladen werden, ohne noch<br />
einen zusätzlichen Befehl auszuführen.<br />
test set Diese Methode wurde schon in Abschnitt 5.3.2 ausführlich erklärt. Sie<br />
dient zum Testen, ob eine an der Navigationsleiste angeklickte Komponente<br />
schon an der Reihe ist.<br />
get component from xml Hier werden zwei Parameter übergeben: Der Name der<br />
Komponente (üblicherweise in der Session-Variable nav enthalten) und ein<br />
Diplomarbeit 70
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
Operator, der bestimmt, ob Umlaute normal oder MySQL-konform zurückgegeben<br />
werden.<br />
umlaute In dieser Funktion werden die Umlaute ersetzt, so dass beispielsweise aus<br />
einem ä ein ae wird.<br />
get key from xml Der Name, den eine Session-Variable für eine bestimmte Komponente<br />
haben soll, wird durch diese Methode ausgelesen. Der Übergabeparameter<br />
ist die Nummer der Komponente.<br />
get key from name Hier wird ebenfalls der Name der Session-Variable für eine<br />
Komponente extrahiert. Allerdings ist der Parameter der Komponentenname.<br />
get id from name Die Id-Nummer einer Komponente wird hier ausgelesen, und<br />
es wird der Name der Komponente übergeben.<br />
get path id from name Eine ähnliche Funktion wie get id from name, nur dass<br />
hier die ID-Nummer des Pfades zurückgegeben wird.<br />
get additional from xml Hier wird der Name der Session-Variable ausgelesen,<br />
die zusätzliche Attribute speichert. Im Fall des <strong>Konfigurators</strong> sind das die<br />
Länge vom Vorbau bzw. die Länge der Kurbel am Kurbelsatz. Hier muss als<br />
Parameter die Komponenten ID angegeben werden. . .<br />
get additional from name . . . während hier der Name der Komponente übergeben<br />
werden sollte. Ansonsten sind die Funktionen ähnlich.<br />
get ids in path In dieser Methode werden alle Komponenten-IDs in einem Array<br />
zurückgegeben, die in einem bestimmten Pfad sind. Hierzu muss als Übergabewert<br />
natürlich die Pfad-ID angegeben werden.<br />
Diese Methoden extrahieren also alle benötigten Daten aus der XML-Datei, die<br />
zur Funktion des <strong>Konfigurators</strong> verwendet werden. Es gibt noch weitere Kombinationen<br />
um Daten aus der XML auszulesen, wie beispielsweise anhand des Session-<br />
Variablen-Namens die Komponenten-ID zu erfassen. Allerdings macht das nicht<br />
viel Sinn, und findet auch keine Verwendung im Konfigurator.<br />
Diplomarbeit 71
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
6.4.2 Session Handler Klasse<br />
In dieser Klasse werden alle Funktionen, die die Session-Variablen und dessen<br />
Inhalte manipulieren, zusammengefasst. Die wichtigsten und am häufigsten gebrauchten<br />
Methoden sind register session, unregister session und reset<br />
sessionvalue.<br />
Bei register session wird, wie der Name schon vermuten lässt, eine Session-<br />
Variable registriert. Zwei Parameter werden übergeben. Einmal der Name, den<br />
diese Variable bekommen soll, und einmal der Wert dieser Variable. Es wird aber<br />
noch überprüft, ob der Wert eine 0 (null) oder ob der false ist. Falls dem nicht so<br />
ist, wird die Variable registriert. Daher muss bei Werten, die eine 0 (null) besitzen<br />
dürfen, wie z. B. der Gesamtpreis, eine andere Lösung gefunden werden.<br />
Die Methode unregister session bewirkt das Gegenteil. Hier muss allerdings<br />
nur der Name der Session-Variablen beim Aufruf angegeben werden. Es wird noch<br />
getestet, ob die angegebene Variable überhaupt einen Wert besitzt.<br />
Der Unterschied zu unregister session liegt bei reset sessionvalue darin,<br />
dass die Variable selbst nicht gelöscht wird, sondern nur der Inhalt auf NULL. Die<br />
ist manchmal hilfreich, wenn z. B. nach einem Neustart ein paar Session-Variablen<br />
sofort abgefragt werden, wie es bei Gesamtpreis und -gewicht der Fall ist.<br />
In der Klasse befinden sich noch andere Funktionen wie get session id oder<br />
is registered, die nur während der Entwicklungszeit benutzt wurden, um die<br />
Funktionalität zu testen oder um Fehler zu finden.<br />
6.4.3 Datenbank Handler Klasse<br />
Alles was, sich um die Benutzung der Datenbank und dessen Funktionen dreht,<br />
befindet sich in dieser Klasse. Auch hier gibt es Methoden, die ständig benutzt<br />
werden, und es gibt Methoden, die nur während der Entwicklung des <strong>Konfigurators</strong><br />
gebraucht wurden.<br />
Eine der häufig verwendeten Funktionen ist query db. Es gibt natürlich die vorgefertigte<br />
Funktion mysql query, doch bei der Benutzung von query db wird im<br />
Fehlerfall der Errorcode und der Fehler ausgegeben.<br />
Die Methode GetComponentArray ist ebenfalls eine sehr oft benutzte Funktion.<br />
Diplomarbeit 72
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
Mit ihr ist es möglich den kompletten Datensatz <strong>eines</strong> Artikels auszulesen. Dazu<br />
müssen zwei Parameter übergeben werden. Der Eine ist der Name des Tables,<br />
und der Andere ist die Artikelnummer, was auch gleichzeitig den Primary Key<br />
darstellt. Zurückgegeben wird ein Array, das alle in der Datenbank gespeicherten<br />
Informationen über diesen Artikel enthält.<br />
Erwähnenswert ist noch der Konstruktor. Ihm wir bei der Instanzierung ein String<br />
übergeben, der dann bestimmt, ob eine Verbindung zum Server der lokalen Entwicklungsumgebung,<br />
oder zum <strong>Web</strong>server hergestellt werden soll. So muss, wenn<br />
der Konfigurator auf den <strong>Web</strong>server hochgeladen wird, nur der String geändert<br />
werden. Eine relativ komfortable Lösung, wenn man in Betracht zieht, dass die<br />
MySQL und PHP Versionen von den beiden Umgebungen nicht hundertprozentig<br />
kompatibel sind.<br />
Die restlichen Methoden wie create db, select db, delete db, oder auch<br />
select table, finden nur Verwendung im recht rudimentären Backend, das sich<br />
darauf beschränkt, dass man die gesamte Datenbank löschen, dessen Inhalt anschauen,<br />
oder mit den Testdaten befüllen kann.<br />
6.5 Interaktionen<br />
Nachdem nun die gesamten Klassen detailliert durchgesprochen und erklärt wurden,<br />
sind nun die Interaktionen zwischen den Klassen das Thema dieses Abschnitts.<br />
Es werden nicht alle möglichen Zusammenspiele angesprochen, da das den Rahmen<br />
sprengen würde.<br />
Der Konfigurator wird, wie schon mehrmals erwähnt, durch Ereignisse gesteuert,<br />
und in Gang gesetzt. Es werden hier exemplarisch drei Events besprochen und<br />
erklärt. Das geschieht jeweils anhand <strong>eines</strong> Diagramms, dem ein paar erklärende<br />
Sätze folgen, zu Stellen, an denen die Darstellung nicht ganz klar sein könnte.<br />
6.5.1 Event: Navigation<br />
Nach dem Klick auf die Navigationsleiste wird die Main.php erneut aufgerufen,<br />
und die POST-Variable navigation wird gesetzt. Das wird dann registriert und<br />
Diplomarbeit 73
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
die Funktion handle navbar click in der EventHandler-Klasse aufgerufen. Der<br />
Inhalt der POST-Variable navigation wird in der Session-Variablen nav gespeichert,<br />
und mit dessen Hilfe und der XML-Funktion get id from name die Methode<br />
display der entsprechenden Komponentenklasse aufgerufen. In dieser Funktion<br />
wird dann durch die Methode test set der XMLHandler-Klasse geprüft, ob diese<br />
Komponente überhaupt schon auswählbar ist. Falls das nicht der Fall ist, kommt<br />
eine Fehlermeldung, die aussagt, welche Komponente zuerst gewählt werden soll.<br />
Ist das Bauteil aber an der Reihe, so werden in der display-Funktion die entsprechenden<br />
Informationen, basierend auf schon vorher ausgewählten Komponenten,<br />
aus der Datenbank ausgelesen. Mit den Methoden der Elternklasse display head<br />
und display footer werden dann nur kompatible Bauteile dargestellt.<br />
6.5.2 Event: Auswahl<br />
Nachdem alle kompatiblen Bauteile auf dem Bildschirm angezeigt werden, klickt<br />
der Nutzer auf die Schaltfläche Auswählen“. Die Main.php wird auch hier wieder<br />
”<br />
neu geladen, und die POST-Variable auswahl ist gesetzt. Dadurch wird die Methode<br />
handle choice click in der EventHandler Klasse aufgerufen. Hier wird dann<br />
durch eine if-Abfrage getestet, ob der Artikel ausgewählt werden darf. Ist das<br />
nicht der Fall, so passiert nichts weiter. Ist es erlaubt das Bauteil zu wählen, so<br />
wird wieder die entsprechende Komponentenklasse aufgerufen, dessen Name immer<br />
noch in der Session-Variable nav gespeichert ist. In der Funktion set session<br />
wird die Session-Variable für die eigene Komponente gesetzt und, falls notwendig,<br />
auch andere Variablen. Die nächste aufgerufene Funktion ist dann wieder display,<br />
in der aufgrund der aktuellen Session-Variablen der Inhalt dargestellt wird. Ein<br />
Beispiel hier für ist die Komponente Laufräder. Zu Anfang werden die beiden<br />
Schaltgruppenmarken, Shimano und Campagnolo, angezeigt. Wird nun ein Laufradsatz<br />
gewählt, der mit Shimano kompatibel ist, so sind nach dem Klick auf die<br />
Auswahl-Schaltfläche nur noch Shimano-kompatible Laufräder zu sehen.<br />
Diplomarbeit 74
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
Abbildung 6.2: Ablauf beim Event Navigation<br />
Diplomarbeit 75
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
Abbildung 6.3: Ablauf beim Event Auswahl<br />
Diplomarbeit 76
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
6.5.3 Event: Auswahl mit Zusatz<br />
Diese Interaktion zwischen den Klassen ist etwas komplizierter als der normale<br />
Auswahl-Ablauf. Allerdings gilt dies nur für die Komponenten Vorbau und Kurbelsatz.<br />
Wird also in der Navigationsleiste einer der beiden Bauteile angeklickt, so<br />
wird zwar auch die Komponententabelle dargestellt, allerdings mit einem Unterschied.<br />
Der Name des Formulars, das die Auswahl-Schaltfläche beinhaltet, heißt<br />
nicht mehr auswahl, sondern additional. So kann beim Anklicken des Auswahl-<br />
Buttons in der Main.php registriert werden, dass nun die zusätzliche Tabelle mit<br />
den jeweiligen Längen dargestellt werden soll. Der Ablauf vom Anklicken bis zum<br />
Setzen der Variablen ist der gleiche wie bei der Auswahl, was in dem Diagramm die<br />
Buchstaben A und B darstellen sollen. Nur wird nach der Auswahl nicht wieder<br />
die Komponententabelle dargestellt, sondern die zusätzliche Tabelle. In der Event-<br />
Handler Klasse kommt die Methode handle additional click zum Einsatz, die<br />
ebenfalls die entsprechende Komponentenklasse aufruft. Dort wird dann mit Hilfe<br />
der Funktionen display head und display footer die Tabelle mit den Längen<br />
dargestellt. Hier heißen dann die Formulare der Auswahlfelder wieder auswahl, so<br />
dass alles wieder den gewohnten Ablauf annehmen kann.<br />
Diplomarbeit 77
KAPITEL 6. DAS PROGRAMM AUS SICHT DES ENTWICKLERS<br />
Abbildung 6.4: Ablauf beim Event zusätzliche Auswahl<br />
Diplomarbeit 78
Kapitel 7<br />
Zusammenfassung und Ausblick<br />
In den vorherigen Kapiteln wurden ausführlich die Klassen, die PHP Dateien, die<br />
MySQL Datenbank und deren Inhalt, und dessen Zusammenspiel vorgestellt. Außerdem<br />
gab es in einem Kapitel einen Überblick, wie der Nutzer den Konfigurator<br />
sieht. In einem weiteren Kapitel wurde das <strong>Renn</strong>- bzw. Triathlonrad besprochen,<br />
so wie die Abhängigkeiten zwischen den Komponenten. Zu Beginn gab es noch die<br />
Überlegung, ob die Programmiersprache Java oder PHP für ein solches Projekt<br />
geeigneter wären.<br />
In diesem Kapitel möchte ich noch einmal zusammenfassen, was der Konfigurator<br />
leistet, und inwieweit das vorgegebene Ziel erreicht wurde. Im nächsten Abschnitt<br />
wird angesprochen was an dem Konfigurator zusätzlich implementiert werden<br />
muss, damit daraus ein kommerzielles Produkt werden kann. Schließlich wird<br />
noch ein persönliches Fazit gezogen.<br />
7.1 Zusammenfassung<br />
Wie in der Einleitung beschrieben, war es vorgegeben so kostengünstig wie möglich<br />
einen Konfigurator für <strong>Renn</strong>- und Triathlonräder zu erstellen. Die Mittel, die zum<br />
Programmieren verwendet wurden, entsprachen diesem Kriterium, da hauptsächlich<br />
Open Source und/oder freie Programme verwendet wurden. Der Rechner, auf dem<br />
Diplomarbeit 79
KAPITEL 7. ZUSAMMENFASSUNG UND AUSBLICK<br />
der Konfigurator entwickelt wurde, war ein handelsüblicher Desktop Computer<br />
mit Windows R○ XP als Betriebssystem. Darauf wurde dann ein Apache Server installiert,<br />
ebenso wie ein PHP Interpreter, die beide frei im Internet verfügbar sind.<br />
Auch die MySQL Datenbank lässt sich kostenlos herunterladen. Somit entfallen<br />
die Kosten für Lizenzgebühren der essentiellen Programme. Auch die Lizenz für<br />
die PHP Entwicklungsumgebung PHPEdit ist unter Angabe des Namens und einer<br />
E-Mail Adresse kostenfrei erhältlich.<br />
Probleme gab es allerdings mit dem <strong>Web</strong>server, der den Konfigurator unter der<br />
URL http://www.radtraum.de im Internet verfügbar machen sollte. Offensichtlich<br />
gab es Kompatibilitätsprobleme zwischen den verschiedenen PHP und<br />
MySQL Versionen. Doch diese konnten jedoch durch kleinere Workarounds“ behoben<br />
werden.<br />
”<br />
Ein weiteres gefordertes Kriterium war, dass ein Nutzer nur Komponenten wählen<br />
kann, die sich tatsächlich zusammenbauen lassen. So soll am Ende sichergestellt<br />
sein, dass der Kunde ein funktionsfähiges Wunsch-Rad erstellt. Diese Forderung<br />
war erwartungsgemäß die am schwierigsten umzusetzende. Nicht nur, dass zuerst<br />
Komponentengruppen identifiziert werden mussten (vgl. Seite 10), sondern auch<br />
deren Zusammenspiel und Abhängigkeiten untereinander herausgearbeitet werden<br />
sollten. Das nahm einen nicht unerheblichen Teil des Projektes ein. Danach mussten<br />
die erarbeiteten Daten mittels PHP in eine benutzerfreundliche Form gebracht<br />
werden.<br />
Dies war ein Grund, warum gegen eine assistierte Konfiguration, und für eine (relativ)<br />
freie Wahl der Reihenfolge entschieden wurde. Allerdings verkomplizierte<br />
diese, im Nachhinein gefällte Entscheidung, die <strong>Erstellung</strong> des <strong>Konfigurators</strong>. Es<br />
mussten alle möglichen Fehler“ des Nutzers erkannt und abgefangen werden, damit<br />
der virtuelle Zusammenbau des Wunschrades in gewünschte Bahnen gelenkt<br />
”<br />
wird.<br />
Vergleicht man diesen Konfigurator mit anderen im Internet befindlichen Rad-<br />
Konfiguratoren, so muss festgestellt werden, dass der in diesem Projekt Erstellte<br />
recht fortschrittlich ist, da es auf manchen Seiten z.B. möglich ist, wahllos<br />
Komponenten einzutragen, ohne darauf zu achten, ob diese auch zusammenpassen<br />
[NR05]. Dennoch sollte zusätzlich eine Funktion implementiert werden, die nicht<br />
Diplomarbeit 80
KAPITEL 7. ZUSAMMENFASSUNG UND AUSBLICK<br />
einmal führende Automobilhersteller in ihren Konfiguratoren zur Verfügung stellen.<br />
Ein so genannter Showroom“ sollte erstellt werden, so dass es für den Nutzer<br />
”<br />
möglich ist, bis zu drei verschiedene Fahrräder zu erstellen, und dann die einzelnen<br />
Zusammenstellungen nebeneinander zu betrachten. Auch dieses wurde erfolgreich<br />
realisiert, nachdem ein paar Probleme überwunden wurden, z.B. wie diese Daten<br />
die ganze Zeit erhalten bleiben, ohne die Datenbank zu nutzen.<br />
Eine weitere Eigenschaft des Programms, die aber nicht vorgegeben war, ist der<br />
relativ generische Aufbau, mit dem ein Programmierer innerhalb kurzer Zeit einen<br />
neuen Konfigurator für ein komplett anderes Produkt erstellen kann. Der arbeitsintensivere<br />
Teil wäre natürlich das Identifizieren der Komponenten und der<br />
Abhängigkeiten zwischen diesen. Ebenso müsste schon eine entsprechend erstellte<br />
Datenbank vorhanden sein, bevor sich das Programm umgestalten lässt. Dazu<br />
muss aber im Grunde nur eine vergleichbare XML-Datei erstellt und die dann<br />
bekannten Abhängigkeiten in den Komponentenklassen implementiert werden.<br />
Zusammengefasst bleibt zu sagen, dass das Projekt erfolgreich abgeschlossen wurde,<br />
so dass der Auftraggeber, die Firma all4triathlon.com, sehr zufrieden mit dem<br />
Ergebnis ist.<br />
7.2 Ausblick<br />
Da dieser Konfigurator zurzeit nur einen Prototypen darstellt, sind selbstverständlich<br />
noch Verbesserungen möglich und notwendig, bevor dieser einen kommerziellen<br />
Einsatz hat. Dennoch ist der Konfigurator voll funktionsfähig. Das heißt, alle<br />
Funktionen, über die das Programm auch im kommerziellen Einsatz verfügen sollte,<br />
sind schon vorhanden. Die Verbesserungen beziehen sich in erster Linie auf den<br />
Bereich, der für den Nutzer relativ unerheblich ist.<br />
Die wohl größte und wichtigste zukünftige Implementierung ist die <strong>Erstellung</strong> <strong>eines</strong><br />
Backends. Das derzeit eingesetzte System ist sehr rudimentär und diente dazu die<br />
Datenbank zu füllen, oder zu löschen. In einem kompletten Backend sollen nicht<br />
nur komfortable Datenbankfunktionen enthalten sein, sondern auch ein System<br />
zum Einpflegen und Warten von neuen Komponenten. Doch diese <strong>Erstellung</strong> war<br />
Diplomarbeit 81
KAPITEL 7. ZUSAMMENFASSUNG UND AUSBLICK<br />
nicht die Aufgabe des Projekts, und das vorhandene Backendsystem erfüllte alle<br />
Funktionen, die während der Entwicklung des <strong>Konfigurators</strong> notwendig waren.<br />
Ein weiteres, während der Entwicklung nicht behandeltes Problem, ist die Kompatibilität<br />
zwischen den verschiedenen Browsern. Zurzeit ist das Programm auf<br />
Mozilla Firefox und Opera optimiert. Entsprechende Anpassungen für den Microsoft<br />
Internet Explorer, Konqueror oder auch Safari müssten folgen. Weitere Verbesserungen<br />
in der Darstellung sind generell gefragt, aber insbesondere muss die<br />
Anzeige für kleinere Bildschirme angepasst werden, da während der Entwicklungszeit<br />
eine relativ hohe Auflösung benutzt wurde. Schließlich könnte das Programm<br />
so geändert werden, dass Templates benutzt werden, und die Gestaltung somit<br />
unabhängig von der Rule-Engine“ ist.<br />
”<br />
7.3 Schlusswort<br />
Um ein Fazit zu ziehen, möchte ich zuerst anmerken, dass das Diplomarbeitsprojekt<br />
eine Herausforderung war, in dem Sinne, dass ohne auf einer Grundlage aufzubauen,<br />
ein funktionierender Prototyp entstanden ist. Manches Problem während<br />
der Entwicklung war nicht so einfach zu lösen, doch es hat immer Spaß gemacht, an<br />
diesem Projekt zu arbeiten. Außerdem konnte ich durch die <strong>Erstellung</strong> des <strong>Konfigurators</strong><br />
meine Fähigkeiten in PHP, HTML und auch JavaScript weiter vertiefen,<br />
was sich im Berufsleben als nützlich erweisen wird. Hinzu kommt, dass ich nun Gewissheit<br />
habe ein Projekt dieser Größe eigenständig organisieren und realisieren<br />
zu können.<br />
Diplomarbeit 82
Anhang A<br />
Tables der Datenbank<br />
In diesem Teil des Anhangs werden alle Tables der Datenbank abgebildet. Der<br />
Spaltenname ist in den Tabellen so wiedergegeben, wie er auch in der Datenbank<br />
abgelegt ist. Deshalb sind auch keine Umlaute zu finden, da die Namenskonvention<br />
von MySQL diese nicht erlaubt. Die Tabellen enthalten jeweils eine Spalte für den<br />
Spaltennamen, die Eigenschaften dieser, und eine kleine erklärende Bemerkung.<br />
Diplomarbeit 83
ANHANG A. TABLES DER DATENBANK<br />
TABLE Rahmen<br />
Spaltenname Eigenschaften Bemerkung<br />
artikelnummer CHAR(6) PRIMARY KEY künstlicher eindeutiger Schlüssel<br />
gewicht SMALLINT UNSIGNED NOT NULL DEFAULT 0 das Gewicht der Komponente<br />
name VARCHAR(100) NOT NULL der Name der Komponente<br />
beschreibung TEXT NOT NULL eine schöne Beschreibung<br />
preis FLOAT NOT NULL DEFAULT 0 das Wichtigste<br />
bild VARCHAR(40) NOT NULL URL zu einem Artikelbild<br />
rahmenhoehe TINYINT(2) UNSIGNED NOT NULL DEFAULT 0 wichtiges Maß<br />
gabelaufnahme FLOAT NOT NULL DEFAULT 0 Maße in mm, ≥100=schon vorhanden<br />
steuersatz TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 0=vorhanden, 1=nicht vorhanden<br />
sattelrohr FLOAT NOT NULL DEFAULT 0 Maße in mm, ≥100=schon vorhanden<br />
tretlager FLOAT NOT NULL DEFAULT 0 Maße in mm<br />
TABLE Steuersatz<br />
Spaltenname Eigenschaften Bemerkung<br />
artikelnummer CHAR(6) PRIMARY KEY künstlicher eindeutiger Schlüssel<br />
gewicht SMALLINT UNSIGNED NOT NULL DEFAULT 0 das Gewicht der Komponente<br />
name VARCHAR(100) NOT NULL der Name der Komponente<br />
beschreibung TEXT NOT NULL eine schöne Beschreibung<br />
preis FLOAT NOT NULL DEFAULT 0 das Wichtigste<br />
bild VARCHAR(40) NOT NULL URL zu einem Artikelbild<br />
gabelschaft FLOAT NOT NULL DEFAULT 0 üblich in Zoll, hier in mm<br />
Diplomarbeit 84
ANHANG A. TABLES DER DATENBANK<br />
TABLE Gabel<br />
Spaltenname Eigenschaften Bemerkung<br />
artikelnummer CHAR(6) PRIMARY KEY künstlicher eindeutiger Schlüssel<br />
gewicht SMALLINT UNSIGNED NOT NULL DEFAULT 0 das Gewicht der Komponente<br />
name VARCHAR(100) NOT NULL der Name der Komponente<br />
beschreibung TEXT NOT NULL eine schöne Beschreibung<br />
preis FLOAT NOT NULL DEFAULT 0 das Wichtigste<br />
bild VARCHAR(40) NOT NULL URL zu einem Artikelbild<br />
gabelschaft FLOAT NOT NULL DEFAULT 0 üblich in Zoll, hier in mm<br />
laenge SMALLINT UNSIGNED NOT NULL DEFAULT 0 relevant f. Rahmenhöhe<br />
TABLE Vorbau<br />
Spaltenname Eigenschaften Bemerkung<br />
artikelnummer CHAR(6) PRIMARY KEY künstlicher eindeutiger Schlüssel<br />
gewicht SMALLINT UNSIGNED NOT NULL DEFAULT 0 das Gewicht der Komponente<br />
name VARCHAR(100) NOT NULL der Name der Komponente<br />
beschreibung TEXT NOT NULL eine schöne Beschreibung<br />
preis FLOAT NOT NULL DEFAULT 0 das Wichtigste<br />
bild VARCHAR(40) NOT NULL URL zu einem Artikelbild<br />
gabelaufnahme FLOAT NOT NULL DEFAULT 0 Durchmesser des Gabelschafts, in mm<br />
lenkeraufnahme FLOAT NOT NULL DEFAULT 0 Durchmesser des Lenkers, in mm<br />
laenge1 TINYINT UNSIGNED NOT NULL DEFAULT 0 zw. 70 u. 140 mm<br />
. . . . . . . . .<br />
laenge9 TINYINT UNSIGNED NOT NULL DEFAULT 0 zw. 70 u. 140 mm<br />
winkel TINYINT NOT NULL DEFAULT 0 zw. -17 ◦ und 17 ◦<br />
flip TINYINT(1) NOT NULL DEFAULT 0 0 = nicht drehbar, 1 = drehbar<br />
Diplomarbeit 85
ANHANG A. TABLES DER DATENBANK<br />
TABLE Lenker<br />
Spaltenname Eigenschaften Bemerkung<br />
artikelnummer CHAR(6) PRIMARY KEY künstlicher eindeutiger Schlüssel<br />
gewicht SMALLINT UNSIGNED NOT NULL DEFAULT 0 das Gewicht der Komponente<br />
name VARCHAR(100) NOT NULL der Name der Komponente<br />
beschreibung TEXT NOT NULL eine schöne Beschreibung<br />
preis FLOAT NOT NULL DEFAULT 0 das Wichtigste<br />
bild VARCHAR(40) NOT NULL URL zu einem Artikelbild<br />
lenkerdurchm FLOAT NOT NULL DEFAULT 0 Durchmesser des Lenkers, in mm<br />
breite TINYINT UNSIGNED NOT NULL DEFAULT 0 Breite (Mitte-Mitte)<br />
lenkerart TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 0=<strong>Renn</strong>rad, 1=Tri, ≥2=beide<br />
aeroaufsatz TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 0=N/A, 1=möglich, ≥2=dabei<br />
TABLE Aeroaufsatz<br />
Spaltenname Eigenschaften Bemerkung<br />
artikelnummer CHAR(6) PRIMARY KEY künstlicher eindeutiger Schlüssel<br />
gewicht SMALLINT UNSIGNED NOT NULL DEFAULT 0 das Gewicht der Komponente<br />
name VARCHAR(100) NOT NULL der Name der Komponente<br />
beschreibung TEXT NOT NULL eine schöne Beschreibung<br />
preis FLOAT NOT NULL DEFAULT 0 das Wichtigste<br />
bild VARCHAR(40) NOT NULL URL zu einem Artikelbild<br />
lenkerklemm FLOAT NOT NULL DEFAULT 0 Durchmesser des Lenkers, in mm<br />
Diplomarbeit 86
ANHANG A. TABLES DER DATENBANK<br />
TABLE Laufraeder<br />
Spaltenname Eigenschaften Bemerkung<br />
artikelnummer CHAR(6) PRIMARY KEY künstlicher eindeutiger Schlüssel<br />
gewicht SMALLINT UNSIGNED NOT NULL DEFAULT 0 das Gewicht der Komponente<br />
name VARCHAR(100) NOT NULL der Name der Komponente<br />
beschreibung TEXT NOT NULL eine schöne Beschreibung<br />
preis FLOAT NOT NULL DEFAULT 0 das Wichtigste<br />
bild VARCHAR(40) NOT NULL URL zu einem Artikelbild<br />
durchmesser SMALLINT UNSIGNED NOT NULL DEFAULT 0 Durchmesser des Laufrads in mm<br />
reifenart TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 0=Schlauch-, ≥1=Drahtreifen<br />
nabe TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 0=Shimano, ≥1=Campa kompatibel<br />
TABLE Reifen<br />
Spaltenname Eigenschaften Bemerkung<br />
artikelnummer CHAR(6) PRIMARY KEY künstlicher eindeutiger Schlüssel<br />
gewicht SMALLINT UNSIGNED NOT NULL DEFAULT 0 das Gewicht der Komponente<br />
name VARCHAR(100) NOT NULL der Name der Komponente<br />
beschreibung TEXT NOT NULL eine schöne Beschreibung<br />
preis FLOAT NOT NULL DEFAULT 0 das Wichtigste<br />
bild VARCHAR(40) NOT NULL URL zu einem Artikelbild<br />
durchmesser SMALLINT UNSIGNED NOT NULL DEFAULT 0 Durchmesser des Laufrades, in mm<br />
breite TINYINT UNSIGNED NOT NULL DEFAULT 0 Breite des Reifens: 19mm - 25mm<br />
reifenart TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 0=Schlauch-, ≥1=Drahtreifen<br />
Diplomarbeit 87
ANHANG A. TABLES DER DATENBANK<br />
TABLE Kurbelsatz<br />
Spaltenname Eigenschaften Bemerkung<br />
artikelnummer CHAR(6) PRIMARY KEY künstlicher eindeutiger Schlüssel<br />
gewicht SMALLINT UNSIGNED NOT NULL DEFAULT 0 das Gewicht der Komponente<br />
name VARCHAR(100) NOT NULL der Name der Komponente<br />
beschreibung TEXT NOT NULL eine schöne Beschreibung<br />
preis FLOAT NOT NULL DEFAULT 0 das Wichtigste<br />
bild VARCHAR(40) NOT NULL URL zu einem Artikelbild<br />
kettenblatt TINYINT UNSIGNED NOT NULL DEFAULT 2 1=compact, 2=normal, 3=3er Blatt<br />
zaehne vorne TINYINT UNSIGNED NOT NULL DEFAULT 0 Anzahl Zähne auf dem großen Blatt<br />
zaehne mitte TINYINT UNSIGNED Nur bei 3er Kettenblätter<br />
zaehne hinten TINYINT UNSIGNED NOT NULL DEFAULT 0 Anzahl Zähne auf dem kleinen Blatt<br />
laenge1 FLOAT NOT NULL DEFAULT 0 kürzeste Länge der Kurbel<br />
. . . . . . . . .<br />
laenge7 FLOAT NOT NULL DEFAULT 0 längste Länge der Kurbel<br />
kompatibel TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 0=Shimano, 1= Campa, ≥2=beide<br />
TABLE Bremsen<br />
Spaltenname Eigenschaften Bemerkung<br />
artikelnummer CHAR(6) PRIMARY KEY künstlicher eindeutiger Schlüssel<br />
gewicht SMALLINT UNSIGNED NOT NULL DEFAULT 0 das Gewicht der Komponente<br />
name VARCHAR(100) NOT NULL der Name der Komponente<br />
beschreibung TEXT NOT NULL eine schöne Beschreibung<br />
preis FLOAT NOT NULL DEFAULT 0 das Wichtigste<br />
bild VARCHAR(40) NOT NULL URL zu einem Artikelbild<br />
Diplomarbeit 88
ANHANG A. TABLES DER DATENBANK<br />
TABLE Schaltgruppe<br />
Spaltenname Eigenschaften Bemerkung<br />
artikelnummer CHAR(6) PRIMARY KEY künstlicher eindeutiger Schlüssel<br />
gewicht SMALLINT UNSIGNED NOT NULL DEFAULT 0 das Gewicht der Komponente<br />
name VARCHAR(100) NOT NULL der Name der Komponente<br />
beschreibung TEXT NOT NULL eine schöne Beschreibung<br />
preis FLOAT NOT NULL DEFAULT 0 das Wichtigste<br />
bild VARCHAR(40) NOT NULL URL zu einem Artikelbild<br />
kettenblatt TINYINT UNSIGNED NOT NULL DEFAULT 2 1=compact, 2=normal, 3=3er Blatt<br />
hersteller TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 1=Shimano, ≥1=Campagnolo<br />
lenkerart TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 0=normal, ≥1=Aerolenker<br />
kassette min TINYINT UNSIGNED NOT NULL DEFAULT 0 Anz. Zähne kleinstes Ritzel<br />
kassette max TINYINT UNSIGNED NOT NULL DEFAULT 0 Anz. Zähne größtes Ritzel<br />
TABLE Pedale<br />
Spaltenname Eigenschaften Bemerkung<br />
artikelnummer CHAR(6) PRIMARY KEY künstlicher eindeutiger Schlüssel<br />
gewicht SMALLINT UNSIGNED NOT NULL DEFAULT 0 das Gewicht der Komponente<br />
name VARCHAR(100) NOT NULL der Name der Komponente<br />
beschreibung TEXT NOT NULL eine schöne Beschreibung<br />
preis FLOAT NOT NULL DEFAULT 0 das Wichtigste<br />
bild VARCHAR(40) NOT NULL URL zu einem Artikelbild<br />
Diplomarbeit 89
ANHANG A. TABLES DER DATENBANK<br />
TABLE Sattelstuetze<br />
Spaltenname Eigenschaften Bemerkung<br />
artikelnummer CHAR(6) PRIMARY KEY künstlicher eindeutiger Schlüssel<br />
gewicht SMALLINT UNSIGNED NOT NULL DEFAULT 0 das Gewicht der Komponente<br />
name VARCHAR(100) NOT NULL der Name der Komponente<br />
beschreibung TEXT NOT NULL eine schöne Beschreibung<br />
preis FLOAT NOT NULL DEFAULT 0 das Wichtigste<br />
bild VARCHAR(40) NOT NULL URL zu einem Artikelbild<br />
laenge SMALLINT UNSIGNED NOT NULL DEFAULT 0 verstellbare Länge der Stütze, in mm<br />
durchmesser FLOAT UNSIGNED NOT NULL DEFAULT 0 Durchmesser des Sattelrohrs, in mm<br />
TABLE Sattel<br />
Spaltenname Eigenschaften Bemerkung<br />
artikelnummer CHAR(6) PRIMARY KEY künstlicher eindeutiger Schlüssel<br />
gewicht SMALLINT UNSIGNED NOT NULL DEFAULT 0 das Gewicht der Komponente<br />
name VARCHAR(100) NOT NULL der Name der Komponente<br />
beschreibung TEXT NOT NULL eine schöne Beschreibung<br />
preis FLOAT NOT NULL DEFAULT 0 das Wichtigste<br />
bild VARCHAR(40) NOT NULL URL zu einem Artikelbild<br />
Diplomarbeit 90
Anhang B<br />
Screenshots<br />
Abbildung B.1: Die Startseite<br />
Diplomarbeit 91
ANHANG B. SCREENSHOTS<br />
Abbildung B.2: Konfigurator für Triathlonräder<br />
Diplomarbeit 92
ANHANG B. SCREENSHOTS<br />
Abbildung B.3: Konfigurator für <strong>Renn</strong>räder<br />
Diplomarbeit 93
Quellenverzeichnis<br />
[Bik06]<br />
MAXX Bikes. Bike Configurator.<br />
http://www.maxx.de/fr inhalt bikes road.htm, 2006.<br />
[Bra05] Christian Braun. PHP5 für Dummies. Wiley-VCH, 2005.<br />
[Cat06]<br />
[Con04]<br />
[Gle03]<br />
[Hat02]<br />
Java Catalog. Java Enterprise System Lizenz.<br />
http://catalog.sun.com/, 2006.<br />
Contentmanager.de. Case study: Der wechsel von Java zu PHP bei der<br />
Augsburger Allgemeinen Zeitung.<br />
http://www.contentmanager.de/community/forum/4/1901/1912.html,<br />
2004.<br />
Daniel Gleim. Multimedia-Sprachen und Standarts im Internet.<br />
www-ra.informatik.uni-tuebingen.de/lehre/ws02/pro internet<br />
ausarbeitung/proseminar gleim ws02.pdf, 2003.<br />
Jens Hatlak. PHP Hypertext Preprocessor.<br />
http://jens.hatlak.de/php.php4, 2002.<br />
[Hom06a] Java Homepage. Connected Limited Device Configuration.<br />
http://java.sun.com/products/cldc/overview.html, 2006.<br />
[Hom06b] Java Homepage. Java SE Hotspot.<br />
http://java.sun.com/javase/technologies/hotspot.jsp, 2006.<br />
[IBM06]<br />
IBM. Ibm Software - DB2 Product Family.<br />
http://www-306.ibm.com/software/data/db2/, 2006.<br />
Diplomarbeit 94
LITERATURVERZEICHNIS<br />
[ID06]<br />
[Ihn06]<br />
[Ind06]<br />
[Mor02a]<br />
[Mor02b]<br />
[Nor03]<br />
[NR05]<br />
IST-Dresden. Java Technologie.<br />
http://www.ist-dresden.de/technology/java.html, 2006.<br />
Oliver Ihns. Umkehr der Beweislast.<br />
JavaMagazin.de, 2006.<br />
Indexpage.ch. <strong>Web</strong>-sprachen.<br />
http://www.indexpage.ch/web-codes/html/praxis/websprachen.php,<br />
2006.<br />
Rene Morschhauser. Nachteile von PHP.<br />
http://www.mathematik.uni-ulm.de/sai/ws01/portalsem/rene/<br />
internetportale/node27.html, 2002.<br />
Rene Morschhauser. Vorteile von PHP.<br />
http://www.mathematik.uni-ulm.de/sai/ws01/portalsem/rene/<br />
internetportale/node26.html, 2002.<br />
D’Arcy Norman. PHP vs. Java commentary from Raible.<br />
http://www.darcynorman.net/2003/08/24/php-vs-java-commentaryfrom-raible,<br />
2003.<br />
Neon-Radsport. <strong>Renn</strong>rad Konfigurator.<br />
http://www.neon-radsport.de/konfigurator.php?type=<strong>Renn</strong>rad, 2005.<br />
[Ora06] Oracle. Oracle Database 10g.<br />
http://www.oracle.com/technology/products/database/oracle10g/<br />
index.html, 2006.<br />
[osC06]<br />
[Tut05]<br />
osCommerce. Deutsche osCommerce Homepage.<br />
http://www.oscommerce.de/, 2006.<br />
Tutorials.de. Zugriff auf eine Klasseninstanz.<br />
http://www.tutorials.de/forum/php/212138-zugriff-auf-eineklasseninstanz-innerhalb-einer-funktion-einer-anderen-klasse.html,<br />
2005.<br />
Diplomarbeit 95
LITERATURVERZEICHNIS<br />
[Typ06]<br />
[WC04]<br />
[Wik06a]<br />
Typo3. What is Typo3?<br />
http://typo3.com/About.1231.0.html, 2006.<br />
<strong>Web</strong>work-Community.net. Java und <strong>Web</strong>.<br />
http://www.webwork-community.net/posting4895 47 0.html, 2004.<br />
Wikipedia.de. Geschichte Javas.<br />
http://de.wikipedia.org/wiki/Java (Technologie)#Geschichte Javas,<br />
2006.<br />
[Wik06b] Wikipedia.de. Geschichte von PHP.<br />
http://de.wikipedia.org/wiki/PHP/FI#Geschichte, 2006.<br />
[XF04]<br />
XHTML-Forum. Vorteile Java gegenüber PHP?<br />
http://xhtmlforum.de/288066-post14.html, 2004.<br />
Für die Entwicklung verwendete Literatur<br />
[Ögg05] Michael Kofler ; Bernd Öggl. PHP 5 & MySQL 5. Addison-Wesley, 2005.<br />
[Hir04] Jens Ferner ; Elena Hirte. PHP5 Rezepte. Data Becker, 2004.<br />
[Hir05] Elena Hirte. PHP5 & MySQL. Data Becker, 2005.<br />
[Kra04] Jörg Krause. PHP 5 - Grundlagen und Profiwissen. Hanser, 2004.<br />
[Käu04] Mechthild Käufer. (X)HTML. Data Becker, 2004.<br />
[McC04] Bill McCarty. PHP-Grundlagen. mitp, 2004.<br />
[Nef03] Stefan Münz ; Wolfgang Nefzger. JavaScript - Referenz. Franzis, 2003.<br />
[Sel06]<br />
SelfHTML. SelfHTML - HTML-Dateien selbst erstellen. de.selfhtml.org,<br />
2006.<br />
[Tra05] David Sklar ; Adam Trachtenberg. PHP-Kochbuch. O’Reilly, 2005.<br />
[Zed02] Dirk Zedler. Das <strong>Renn</strong>rad im Selbstaufbau. Delius Klasing, 2002.<br />
Diplomarbeit 96