25.04.2014 Aufrufe

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 ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!