Bakkalaureatsarbeit 2009
Martin Grossegger
1
Abbildungsverzeichnis
Abbildung 1: Screenshot mit zwei aktiven "stickies"..............................................................6
Abbildung 2: Screen - Beispiel für eine "Tada"-Liste.............................................................7
Abbildung 3: Screen - Gmail Tasks........................................................................................8
Abbildung 4: Die Definition des Internets
Quelle: http://www.netplanet.org/geschichte/internet.shtml..................................................9
Abbildung 5: Klassisches Modell und AJAX Modell
Quelle: http://www.adaptivepath.com/ideas/essays/archives/000385.php.........................13
Abbildung 6: Kommunikationsdiagramm.............................................................................18
Abbildung 7: Tabellenrelationen...........................................................................................19
Abbildung 8: Scripten für die Benutzerverwaltung...............................................................20
Abbildung 9: Visitenkarte eines Benutzers..........................................................................21
Abbildung 10: Suchfeld mit Autovervollständigung..............................................................22
Abbildung 11: Scripten für die Gruppenverwaltung.............................................................23
Abbildung 12: Einladung für eine Gruppe versenden..........................................................25
Abbildung 13: erstes Design................................................................................................28
Abbildung 14: aktuelles Design............................................................................................28
Abbildung 15: Div-Container eines Postits..........................................................................29
Abbildung 16: Scripten für die Postitverwaltung..................................................................30
Abbildung 17: Scripten für die Verwaltung von Items..........................................................30
Abbildung 18: Titel ändern...................................................................................................31
Abbildung 19: Div für die Größenänderung ....................................................................32
Abbildung 20: Postit mit aktivierter Frabauswahl.................................................................33
Abbildung 21: Container für das Verschieben des Postits...................................................34
Abbildung 22: Items in Bearbeitung.....................................................................................34
Abbildung 23: Virtuelle Pinnwand im Web Client.................................................................36
Abbildung 24: Postits in einer Gruppe.................................................................................38
Abbildung 25: Postit mit einzeInen Items.............................................................................38
Abbildung 26: Item in Bearbeitung.......................................................................................38
Tabellenverzeichnis
Tabelle 1: SQL Tabelle "users".............................................................................................20
Tabelle 2: SQL-Tabelle "groups"..........................................................................................24
Tabelle 3: SQL-Tabelle "user_groups".................................................................................24
Tabelle 4: SQL-Tabelle "user_groups".................................................................................26
Tabelle 5: SQL-Tabelle "user_groups"; Beispieleintrag.......................................................26
2
Inhaltsverzeichnis
Postits System.......................................................................................................................1
1 Abstract..............................................................................................................................4
2 Aufgabenstellung................................................................................................................5
3 Software für Postits, Listen................................................................................................6
3.1 http://stickies.softonic.de/............................................................................................6
3.2 http://tadalist.com/.......................................................................................................7
3.3 Google Tasks..............................................................................................................8
4 Verwendete Technologie....................................................................................................9
4.1 HTML..........................................................................................................................9
4.2 CSS...........................................................................................................................10
4.3 PHP ..........................................................................................................................11
4.4 Javascript..................................................................................................................12
4.5 AJAX.........................................................................................................................13
4.6 Prototype...................................................................................................................14
4.7 Script.aculo.us .........................................................................................................14
4.8 MySql........................................................................................................................15
5 Devices............................................................................................................................17
5.1 iPhone.......................................................................................................................17
5.2 Personal Digital Assistant, Smartphone...................................................................17
6 Das „Postit“-System.........................................................................................................18
6.1 Struktur.....................................................................................................................18
6.1.1 Backend: MySQL..............................................................................................19
6.2 Benutzerverwaltung..................................................................................................20
6.2.1 Benutzer anlegen..............................................................................................20
6.2.2 Benutzer ändern - Visitenkarte..........................................................................21
6.2.3 Login..................................................................................................................22
6.2.4 Benutzer suchen...............................................................................................22
6.3 Gruppenverwaltung..................................................................................................23
6.3.1 Gruppen erstellen..............................................................................................23
6.3.2 Gruppe verlassen..............................................................................................24
6.3.3 Gruppeneinladungen.........................................................................................25
6.4 Postits.......................................................................................................................28
6.4.1 Design...............................................................................................................29
6.5 Verwaltung von Postits und Items............................................................................30
6.5.1 Postit erstellen...................................................................................................30
6.5.2 Titel ändern........................................................................................................31
6.5.3 Größenänderung...............................................................................................32
6.5.4 Farbänderung....................................................................................................33
6.5.5 Positionen..........................................................................................................34
6.6 Items.........................................................................................................................34
7 Anwendung......................................................................................................................36
7.1 Webclient..................................................................................................................36
7.2 Mobiler Client............................................................................................................37
8 Diskussion........................................................................................................................39
9 Ausblick............................................................................................................................39
10 Literaturverzeichnis........................................................................................................41
11 Anhang...........................................................................................................................42
11.1 Datenbankschema..................................................................................................42
3
1 Abstract
Das „Postit“-System ist ein „Ideensammlungssystem“, um Einfälle und Notizen mit
anderen zu teilen und zu verwalten.
Einerseits existiert eine Weboberfläche, wo in intuitiver Art und Weise mit den virtuellen
Notizblättern verfahren wird, andererseits gibt es auch eine Version für mobile Endgeräte
wie Handys (iPhone) oder PDAs (Personal Digital Assistants).
Diese mobile Version ist der Grundgedanke der Anwendung. Es soll die Eingabe von
Ideen zu jeder Zeit ermöglichen. Mit einem internetfähigen mobilen Endgerät hat man
Zugriff auf das Programm und kann Ideen und Vorschläge eintragen. Diese Vorschläge
können dann später in der Weboberfläche sortiert werden.
Programmiert wurde das Projekt in der Sprache PHP in Verbindung mit einer MySQL
Datenbank.
Als Fortführung ist die Integration von zusätzlichen Inhalten, wie zum Beispiel Bilder und
Videos angedacht. Eine nützliche Anpassung könnte die Umsetzung von Desktop Widgets
sein, wo das Programm dann als Widget ohne Browserfenster am Desktop arbeitet.
4
2 Aufgabenstellung
5
3 Software für Postits, Listen
3.1 http://stickies.softonic.de/
Auf dieser Webseite findet sich eine Anwendung für den Desktop. Die Software läuft lokal
auf dem Rechner, mit einem Klick auf ein Icon wird ein neues „Sticky“ am Desktop erstellt,
welches gleich direkt bearbeitet werden kann. Farb- und Größenänderungen sind auch
möglich.
Als Zusatzfunktion können bestimmte Notizen zu einer bestimmten Zeit oder bei
Ausführung eines bestimmten Programmes geöffnet werden.
Die Notizen versendet "Stickies" bei Bedarf per E-Mail oder als Sofortnachricht über das
Netzwerk.
Der Schwerpunkt dieser Anwendung liegt auf der lokalen Komponente, die Notizen sind
eher als Gedächtnisstütze gedacht.1
6
3.2 http://tadalist.com/
Ta-da-List ist eine Websoftware für das Erstellen von einfachen ToDo-Listen. Nach der
Erstellung eines Accounts kann man sofort die erste Liste anlegen. Das Design ist sehr
einfach gehalten, es besteht zum Großteil aus farbigen Textlinks.
Der frisch erstellten ToDo-Liste kann man nun einzelne Einträge oder Aufgaben, die man
zu erledigen hat, hinzufügen. Erledigte Dinge kann man mit einem Klick "abhaken", sie
wandern sogleich ans Ende der Liste. Zusätzlich gibt es noch die Möglichkeit die Items der
Liste per "Drag and Drop" neu zu arrangieren und die Liste mit anderen zu teilen.
Ta-da-List hat eher den Charakter eines Webformulars und eignet sich nur bedingt als
Postitersatz.2
7
3.3 Google Tasks
Google bietet zusätzlich zum Email Service „gmail“ auch einen Aufgabenplaner an: die
„Gmail Tasks“. Im Menü des Gmail-Accounts findet sich der Punkt „Aufgabenplaner“.
Dieser Link öffnet eine ToDo-Liste am Bildschirm, wo neue Punkte erstellt werden können.
Erledigte Dinge werden einfach abgehakt. Diese erscheinen dann durchgestrichen.
Der große Vorteil dieser Liste ist das Zusammenspiel mit dem Gmail-Kalender, wo
Listeneinträge, die mit Datum versehen sind, gleich eingetragen werden.
Aufgabenlisten können auch ausgedruckt und auch auf mobilen Geräten abgerufen
werden. 3
8
4 Verwendete Technologie
4.1 HTML
HTML ist die Abkürzung für HyperText Markup Language.
Am 24. Oktober 1995 veröffentlichte das Federal Networking Council (FNC) eine
Definition des Internet aus der (durchaus abstrakten) Sicht einer Bundesbehörde:
Diese auch heute noch geltende Definition wird wiederum von vielen Experten als
Geburtsstunde des Internet gesehen, weil mit dieser Definition ein Beratergremium der
US- Regierung offiziell das Internet formulierte, das bis dato aus offizieller Sicht
weitgehend auf einer Vielzahl von Absichtserklärungen, Vereinbarungen, ungeschriebenen
Regeln und einfach vorhandenen Tatsachen gelagert war.4
HTML ist eine einfache Sprache, die aus einzelnen Tags (Etikett, Anhänger) besteht. Diese
Tags haben eine hierachische Ordnung, sodass eine Webseite als Baumstruktur
9
dargestellt werden kann.
Die einzelnen Tags werden von spitzen Klammern umschlossen (z.B. <body> ). Das Ende
des Wirkungsbereiches eines Tags wird mit einem Schrägstrich angezeigt (</body>), d.h.
alles was sich zwischen dem öffnenden und dem schließenden Tag befindet, ist eine
Ebene tiefer in der Hierachie angesiedelt.
Die Sturkturierung des Textes kann mittels Tabellen vorgenommen werden. Der Vorteil
darin ist, dass Tabellen wiederum Tabellen beinhalten können und somit auch
kompliziertere Designs umsetzbar sind.
Doch die Verwendung von Tabellen bringt andererseits auch die Gefahr der
Unübersichtlichkeit mit sich. Sobald man eine ausereichend tiefe Verschachtelung der
einzelnen Tags erreicht, kann man vom Code nicht mehr auf die visuelle Ausgabe
schließen. Das Designen von solchen Internetseiten ist nur mehr mit sogenannten
"WYSIWYG" - Editoren (steht für "What You See Is What You Get") möglich, die das
Bearbeiten einer Internetseite vereinfachen, indem sie den Code übersetzen und die Seite
direkt anzeigen, ähnlich einer Textverarbeitungssoftware.
Mit der Entwicklung von CSS (siehe Abschnitt CSS) wurden die Tabellen als
Gestaltungselement weitgehend abgelöst. Die einzelnen Inhalte der Webseite konnten
nun in sogenannte Container verpackt werden, in der HTML Sprache "div" genannt. Diese
"div-Container" erlaubten eine freie Positionierung und Gestaltung von Inhalten.
Die Syntax von HTML ist sehr fehlertolerant, was vor allem in Verbindung mit Tabellen zu
unerwünschtem Verhalten führen kann. Ob eine Webseite standardkonform programmiert
wurde, kann mit einem Validator überprüft werden. 5
4.2 CSS
Der nächste Schritt in der Evolution der Gestaltung von Webseiten wurde mit den
"Cascading Style Sheets" - kurs CSS - getan. Diese ermöglichten es erstmals Design von
Inhalt zu trennen.
Es war nun möglich eine Seite mit verschiedenen Designs zu verknüpfen, zum Beispiel je
nach Ausgabegerät, also ein Design für den Bildschirm und eine Druckansicht, wo nicht
benötigte Menüs und Elemente ausgeblendet wurden.
CSS kann als seperate Datei eingebunden werden, oder direkt im HTML Dokument
definiert werden. Grunsätzlich ist dabei erstere Variante zu bevorzugen, da sich dann alle
5 Link: http://validator.w3.org/
10
Formatierungen in einer Datei befinden und schnell gefunden werden können, falls eine
Änderung notwendig sein sollte.
Bei den Formatierungen gibt es zwei Grundtypen - eindeutige Formatierungen für
Elemente die nur einmal vorkommen (sogenannte "ids") - diese beginnen in der CSS
Sprache mit einer Raute # - und Formatierungen für Elementgruppen (sogenannte
"Klassen") - diese beginnen mit einem Punkt.
Ein weiterer Vorteil besteht darin, dass mehrere Formatierungen kombiniert werden
können, mit anderen Worten, ein Element kann viele Klassen haben, die dann aufeinander
aufbauen ("cascading").
4.3 PHP
PHP ist der Nachfolger von PHP/FI ("Personal Home Page / Forms Interpreter"). PHP/FI
wurde 1995 von Rasmus Lerdorf geschaffen. Ursprünglich war PHP/FI ein Set von Perl
Skripten zur Erfassung der Zugriffe eines Webauftrittes. Er nannte dieses Set von Skripten
'Personal Home Page Tools'. Als dann mehr Funktionalität benötigt wurde, schrieb
Rasmus eine viel größere Umsetzung in C, welche auch mit Datenbanken kommunizieren
konnte, und den Benutzern die Entwicklung einfacher dynamischer Webapplikationen
ermöglichte. Rasmus entschloss sich, den Sourcecode von PHP/FI zu veröffentlichen,
sodass ihn jeder benutzen, von Fehlern bereinigen, und weiterentwickeln konnte.
Die Sprache PHP wurde dann sukzessive ausgebaut und verändert um den steigenden
Anforderungen gerecht zu werden, wie zum Beispiel der Unterstützung einer großen
Auswahl von Datenbanken und APIs ("Application Programming Interface") von
Drittanbietern.
PHP 5 wurde im Juli 2004 nach langer Entwicklung und mehreren Vorabversionen
veröffentlicht.6
PHP eignet sich sehr gut zur Programmierung von Datenbankanbindungen. Es werden
viele Funktionen mitgeliefert, die den Umgang mit diversen Datenbanksystemen sehr
erleichtern und eine effiziente Programmierung ermöglichen.
Für Webseiten besonders wertvoll ist das "session management", also das Verwalten von
einzelnen Sitzungen. Am Webserver werden Variablen angelegt, die nur für den aktuellen
11
Benutzer zugänglich sind. Damit ist es möglich den Zustand einer Webseite oder
benutzerspezifische Daten, wie zum Beispiel Warenkörbe in Webshops, für jeden
einzelnen Benutzer abzuspeichern. PHP stellt für dieses "session management" eigene
Funktionen zur Verfügung.
Einer der größten Stärken von PHP ist es, dass der Programmcode an jeder Stelle in einer
Webseite eingebaut werden kann. Mit anderen Worten, man kann HTML und PHP
gemeinsam verwenden. Der Server interpretiert die Teile der Webseite, die PHP Code
beinhalten und generiert dann je nach Ergebnis die endgülte HTML Seite, die an den
Browser gesendet wird.
4.4 Javascript
Gegen Ende des Jahres 1995 stellte die Firma Netscape die neueste Version ihres
Internet-Browsers vor. Unter anderem war auch eine Sprache namens "LiveScript"
eingebaut, mit der man auf HTML-Seiten Einfluss nehmen konnte. Die Syntax dieser
Sprache lehnte sich an Java an, und aus marketingtechnischen Gründen wurde die
Programmiersprache schließlich in "JavaScript" umbenannt.7
Javascript ist wie der Name schon vermuten lässt, eine Scriptsprache. Das heißt der Code
wird bei jedem Aufruf vom Webserver intrepretiert.
Innerhalb einer HTML Seite wird Javascript mittels <script type="text/javascript"></script>
Tags (Etikett, Anhänger) gekennzeichnet. Alles was innerhalb zweier solcher Tags steht,
wird als Javascript interpretiert und ausgeführt.
Die große Stärke von Javascript ist es, den DOM-Tree (Document Object Model, Tree
bezeichnet die baumartige Struktur einer Webseite) verändern zu können. Es ist möglich
die Eigenschaften einzelner Knoten zu ändern, Knoten zu entfernen oder auch
einzufügen.
Eine eindeutige Identifizierung einzelner Seitenelemente wird mit der "id" - Eigenschaft der
HTML Tags erreicht, welche den Elementen eine einzigartige Kennzeichnung, sozusagen
ein Namensschild, verleiht. Über dieses "Namensschild" können die einzelnen Elemente
gefunden und verändert werden.
12
4.5 AJAX
AJAX steht für „Asynchronous JavaScript and XML". Die folgende Abbildung zeigt das
asynchrone Modell der Kommunikation zwischen Server und Client. Dieses Modell
ermöglicht es Anfragen an den Server zu stellen und diese auszuwerten, ohne dass der
Benutzer der Webseite etwas davon merkt. Die linke Seite der Abbildung stellt das
traditionelle Modell der Datenübertragung zwischen Server und Client dar, wo die
Webseite nach jeder Anfrage neu geladen wird. Auf der rechten Seite wird das AJAX
Modell dargestellt, wo die Anfragen und Antworten des Servers vom AJAX Modul
gesteuert werden. 8
Die Architektur von AJAX basiert auf der Kombination folgender Komponenten:
– (X)HTML und CSS, die eine standardkonforme Seitenstruktur und Präsentation
sicher stellen.
– DOM (Document Object Model) zur dynamischen Anzeige, Interaktion und
Manipulation von Seitenstrukturen
8 http://www.adaptivepath.com/ideas/essays/archives/000385.php, 3.8.2009
13
– XML (eXtensible Markup Language) zum Nachladen, Austauschen und Ändern von
lokal und extern gespeicherten Daten (dies kann auch HTML oder einfacher Text
sein)
– XMLHttpRequest-Objekten zur Generierung und Vermittlung von Anfragen sowie
Asynchroner Datenübermittlung zwischen der Client- und der Serverseite.
– JavaScript, mit dem alle aufgelisteten Techniken miteinander in einer Ajax Engine
verknüpft werden.9
AJAX stellt sozusagen die Brücke zwischen den Technologien dar und sorgt für eine große
Verbesserung und Flexibilität der Webseiten. Einfach die Möglichkeit, dass Anfragen an
den Server im Hintergrund ausgeführt werden können, bietet große
Gestaltungsmöglichkeiten.
Dadurch kann man die Inhalte von einzelnen Teilen einer Webseite einfach austauschen.
Ideal für diese Vorgehensweise ist es, wenn Inhalt und Design getrennt sind - (siehe CSS).
Es gibt mittlerweile eine Vielzahl von Bibliotheken und Javascriptsammlungen, die das
Programmieren mit AJAX sehr vereinfachen, und es ermöglichen, komplexe Seiten zu
entwerfen, die beinahe die Funktionalität einer Desktopsoftware besitzen. Ein gutes
Beispiel hierfür sind die "google apps", wo neben dem Mailversand auch Webseiten für
Tabellenkalkulation und Textverarbeitung zu finden sind.10
4.6 Prototype
Prototype ist ein Javascript Framework für den Umgang mit AJAX. Anfragen an den Server
können sehr einfach und übersichtlich gestaltet werden, auch kompliziertere Anfragen sind
kein Problem. Neben der simplen Anfrage "Request" existiert mittles "Update" auch die
Möglichkeit Inhalte gleich auszutauschen. Eine sehr beliebte Funktion ist die
Autovervollständigung von Eingabefeldern.
4.7 Script.aculo.us
Diese Scriptsammlung ist eine Javascript Bibliothek, die viele visuelle Effekte beinhaltet.
Jeder Effekt hat Parameter für die Beinflussung der Darstellung. Die Palette der
9 Friedman, S.675
10 Linkbeispiel: http://www.google.com/apps/intl/de/business/index.html
14
Möglichkeiten reicht von Überblendungseffekten, Größenänderungseffekten bis hin zu
Drag & Drop Effekten.
4.8 MySql
SQL steht für Structured Query Language und ist die Datenbanksprache für relationale
Systeme. Konzeptionell ist eine relationale Datenbank eine Ansammlung von Tabellen.
Hinter den Tabllen steht mathematisch die Idee einer Relation: ein grundlegender Begriff,
der dem gesamten Ansatz den Namen gegeben hat. 11
MySQL ist eine der bekanntesten Open Source Varianten einer SQL Datenbank und bei
vielen Serverpaketen bereits vorinstalliert. Ein beliebtes "all in one" Paket ist "xampp", wo
nach der Installation ein Apache Webserver, MySQL Datenbanken und PHP verfügbar
sind.12
-- Anfrage
select Projektionsliste
from Relationenliste
[where Bedingung]
Die select-Klausel
• gibt die Projektionsliste an, die das Ergebnisschema bestimmt und
• integriert auch arithmetische Operationen und Aggregatfunktionen
Die from-Klausel
• legt die zu verwendenden Relationen (Basisrelationen oder Sichten) fest und
• führt enventuelle Umbenennungen durch (mithilfe von Tupelvariablen oder
Aliasnamen)
11 Saake, Sattler, Heuer, S11
12 Linkbeispiel: http://www.apachefriends.org/de/xampp.html
15
• Sind mehrere Relationen angegeben, so werden diese über das kartesische
Produkt miteinander verknüpft.
Neben diesen drei Klauseln können in Anfragen noch weitere eingesetzt werden, u.a. die
group by-Klausel zur Gruppierung von Tupeln einer Relation über gleiche Attributwerte,
sowie die oder by-Klausel zur Sortierung der Ergebnisse.13
Zum Aktualisieren einzelner Tabellenfelder wird die update-Klausel verwendet, die
syntaktisch wie folgt notiert wird:
update Relationenname
set Attribut1 = Ausdruck1, ..., Attributn = Ausdruckn
[where Bedingung]
Die Wirkung der update-Anweisung kann wie folgt charakterisiert werden: In allen Tupeln
der Relation "Relationenname", die "Bedingung" erfüllen, werden die Attributwerte wie
angegeben ersetzt. 14
16
5 Devices
5.1 iPhone
Im Jahre 2005 verkündete die Firma Apple durch ihren Mobilbereichs-Chef Stanley T.
Sigman eine revolutionäre Neuentwicklung auf dem Medienmarkt: das iPhone. Über 150
Millionen US Dollar wurden in dessen Entwicklung gesteckt, welche völlig abgeschottet
von der Umwelt vonstatten ging, sogar die Hard- und Softwareentwickler arbeiteten
voneinander getrennt. Nachdem das iPhone, ein Smartphone, das über einen
Medienplayer verfügt und seine Steuerung weitgehend über den Bildschirm erfährt, am
9.1. 2007 durch die Firma Apple erstmals der Öffentlichkeit vorgestellt worden war,
kündigte der Hersteller wenig später bereits den Verkaufsbeginn in den USA an.
Apple-Mitbegründer Steve Jobs, der mit an der erfolgreichen iPhone Geschichte beteiligt
war, kündigte im September 2007 eine Preissenkung des Gerätes an, welches noch im
selben Jahr vom US-Magazin "Time" zur Erfindung des Jahres gekürt wurde. Am 9.
November 2009 wurde das Gerät dann erstmals auch in Europa angeboten.
Und die iPHone Geschichte zog weitere Kreise: Im März 2009 wurde es in über 80
Ländern verkauft.15
Das iPhone verwendet den Safari Browser zur Anzeige von Webseiten, andere
Mobiltelefone setzen auf den Opera Mobile Browser.
15 http://www.infos-zum-iphone.de, 8.8.2009
16 Bieh, S. 22, 23
17
6 Das „Postit“-System
6.1 Struktur
Das System ist grundsätzlich in zwei große Teile geteilt, die über Javascript und AJAX
miteinander verbunden sind. Es sind dies auf der einen Seite der PHP/HTML Teil, also das
sogenannte „frontend“, jener Teil mit dem der Benutzer arbeitet, und auf der anderen Seite
das „backend“, die MySQL Datenbank, in der die Daten gespeichert sind.
Die Anfragen an den Server werden über eigene Ereignisse („Events“) ausgelöst und
gesteuert.
Durch die spezielle Anforderung der mobilen Endgeräte ist der visuelle Teil für den
Benutzer noch einmal unterteilt, das heißt es gibt zwei grundsätzlich verschiedene
Arbeitsoberflächen, die aber im Hintergrund auf denselben Daten operieren.
Abbildung 6: Kommunikationsdiagramm
18
6.1.1 Backend: MySQL
Abbildung 7: Tabellenrelationen
Der Datenbankteil besteht aus vier Datentabellen: users, groups, postits, items (in Gelb
dargestellt). Jeder Datensatz in diesen Tabellen bekommt eine eindeutige Id-Nummer
zugewiesen, mit welcher alle den Datensatz betreffenden Operation durchgeführt werden.
Diese Datentabellen sind über Verbindungstabellen miteinander in Beziehung gesetzt.
users_postits: In dieser Tabelle befinden sich die Verbindungen der Benutzer zu den
privaten Postits, also zu Postits die nicht öffentlich und in keiner Gruppe zu finden sind. Es
wird jeweils eine "User-Id" und eine "Positit-Id" in einer Tabellenzeile gespeichert, sprich:
ein bestimmter Benutzer wird mit einem bestimmten Postit in Beziehung gesetzt.
Hier wird eine "one-to-many" Relation verwendet: Ein Benutzer kann viele Postits haben,
aber ein Postit kann nur einen Benutzer haben.
users_groups: Diese Tabelle verbindet die Benutzer mit den einzelnen Gruppen. Auch
hier bekommt ein Benutzer eine Gruppen-Id zugewiesen. Es ist eine "many-to-many"
Relation: Ein Benutzer kann viele Gruppen haben und auf der anderen Seite kann eine
Gruppe viele Benutzer haben.
groups_postits: Die Verbindung von Gruppen und Postits. Ein Postit kann nur eine
Gruppe haben, aber eine Gruppe kann viele Postits haben. ("one-to-many").
items: Diese Tabelle ist direkt mit der Postit-Tabelle verbunden, d.h. jedes Item hat nur ein
Postit dem es zugeordnet ist ("one-to-one"). Die Id des Postits wird in einer Spalte des
Datensatzes für ein Item abgespeichert.
Um die Postits eines Benutzers für eine bestimmte Gruppe zu finden, sucht man zuerst
19
die Gruppe des Benutzers. Mit dieser Gruppen-Id sucht man nun in der groups_postits
Tabelle alle Postit-Ids mit ebendieser Gruppen-Id.
6.2 Benutzerverwaltung
In der Datenbank werden die Daten des Benutzers abgespeichert. In der ersten Spalte
befindet sich die „id“, die interne Nummer des Datensatzes. Diese id ist die Verbindung zu
allen Daten die diesen einzelnen Benutzer betreffen. Mit ihr lassen sich alle relevanten
Daten (Postits, Gruppenzugehörigkeit) feststellen.
In der zweiten Spalte username befindet sich, wie der Name schon ausdrückt, der
Benutzername. Dieser Name taucht auf den Postits als Name des Autors auf, und
natürlich auf allen Email Aussendungen, die diesen Benutzer betreffen.
Das Passwort wird in der Spalte mit dem Namen „password“ gespeichert. Es wird mittels
Verschlüsselungsverfahren MD5 verschlüsselt und so in der Datenbank abgespeichert.
20
Die Email Adresse des Benutzers wird in der vorletzten Spalte festgehalten.
Gruppeneinladungen und Änderungsbenachrichtigungen werden an diese Adresse
gesendet.
Die Spalte „last_login“ beinhaltet den Zeitstempel („timestamp“) der letzten Anmeldung des
Benutzers.
Fehler sind:
• Benutzername leer
• Passwort nicht wiederholt
• Passwörter nicht identisch
• Email Adresse beinhaltet keinen Punkt oder kein @-Zeichen.
Das Script unterscheidet dann zwischen den beiden Fällen ob die Passwortfelder leer sind
oder nicht. Im Falle von zwei leeren Passwortfeldern wird eine Aktualisierungsfunktion aus
der Datenbankbibliothek aufgerufen, die das Passwort nicht verändert.
Im anderen Fall, also bei ausgefüllten Passwortfeldern, wird eine Aktualisierungsfunktion
aufgerufen, die das neue Passwort zuerst mittels MD5 verschlüsselt und dann alle neuen
Daten aktualisiert. Abschließend werden noch die Daten der aktuellen Session erneuert.
Im Falle eines Fehlers wird die Fehlermeldung in eine Session Variable gespeichert, die
Visitenkarte neu geladen und der Inhalt der Fehler-Variable angezeigt.
21
6.2.3 Login
Auf der Startseite der Anwendung befindet sich das Formular für die Anmeldung.
Benutzername und Passwort werden abgefragt und an das Login-Script weitergegeben.
Dieses Login-Script stellt die Verbindung mit der Datenbank her und verwendet die
Funktion: getUserdata($username, $password) um die Daten des Benutzers
auszulesen. Die aufgerufene Funktion sucht in der Datenbank einen Benutzer mit dem
angegebenen Benutzernamen. Falls dieser Benutzer existiert, wird sein verschlüsseltes
Passwort gelesen und zusammen mit dem Passwort der Eingabemaske an eine
Vergleichsfunktion übergeben. Dort wird das Passwort der Eingabemaske mit MD5
verschlüsselt und anschließend mit dem MD5 Passwort aus der Datenbank verglichen. Bei
einer Übereinstimmung werden die Daten des Benutzers als assoziatives Array
zurückgegeben, welches in eine Session Variable gespeichert wird. Zusätzlich wird noch
eine Session Variable gesetzt um zu kennzeichnen dass der Benutzer angemeldet ist:
$_SESSION["user_logged_in"] = TRUE;
22
Benutzer einen Eintrag aus der Ergebnisliste ausgewählt hat. In unserem Fall ist
das openInvitationWindow - es wird also ein Fenster geöffnet, über welches der
ausgewählte Benutzer direkt in eine Gruppe eingeladen werden kann. (siehe
Benutzer einladen)
new Ajax.Autocompleter("search_user_field",
"search_user_result", baseDir + "/db/search_user.php",
{
paramName: "username",
minChars: 2,
afterUpdateElement : openInvitationWindow
});
Das aufgerufene Script (search_user.php) sucht in der Datenbank Benutzernamen, die
mit dem übergebenen Zeichen beginnen und generiert aus den gefundenen Einträgen
eine Liste:
foreach($users as $user)
echo "<li id=\"".$user["username"]."\">".$user["username"]."</a>";
6.3 Gruppenverwaltung
Die Funktionalität der Gruppenerstellung ist eine wichtige Grundfunktion. Sie ermöglicht
es, die Notizen gleich mit allen Gruppenmitgliedern zu teilen. Jeder in der Gruppe sieht
alle neuen Notizen sofort und kann gegebenenfalls selbst Änderungen vornehmen.
23
Eine neue Gruppe kann über einen Link angelegt werden. Dies ist sowohl in der
Webversion als auch in der mobilen Variante möglich. Die Erstellung einer neuen Gruppe
beinflusst zwei Datenbanktabellen. Zuerst einmal wird die neue Gruppe in die groups-
Tabelle eingetragen.
id name
1 Neue Gruppe
Tabelle 2: SQL-Tabelle "groups"
Anschließend muss der Ersteller natürlich als Mitglied der neuen Gruppe eingetragen
werden.
Der Benutzer mit der Id "1" ist der Gruppe mit der Id "1" zugeordnet. Die Spalte "invitation"
kennzeichnet ob eine aktive Einladung in die Gruppe vorhanden ist - in diesem Fall wird
der Wert auf 0 (false) gesetzt. "invitation" und "security_token" werden im Kapitel
"Gruppeneinladungen" ausführlich erklärt.
Neben der Funktion eine Gruppe zu erstellen, ist es natürlich auch möglich eine Gruppe
wieder zu verlassen. Dies geschieht über einen Link, der erscheint wenn man sich in einer
Gruppe befindet, mit anderen Worten, wenn man sich nicht auf der privaten Pinnwand
befindet, denn diese kann natürlich nicht entfernt werden.
Der besagte Link aktiviert das Script "leave_group" welches den Benutzer aus der Gruppe
entfernt. Zusätzlich wird noch überprüft, ob der Benutzer der letzte in der Gruppe war. In
diesem Fall wird die Gruppe auch gleich mitgelöscht:
if(count(getUsersFromGroup($group_id)) == 0)
{
deleteGroup($group_id);
24
}
Die Funktion "getUsersFromGroup" liefert ein Array über die Benutzer der Gruppe mit der
übergebenen Gruppen-Id. Die Funktion "count" zählt die Einträge in diesem Array, sprich
wieviele Elemente darin enthalten sind. Falls dabei Null herauskommt befindet sich kein
Benutzer mehr in der Gruppe und die angegebene Gruppe kann mit "deleteGroup"
gelöscht werden.
6.3.3 Gruppeneinladungen
25
user_id group_id invitation security_token
1 1 1 rVmozppRWkl9cV7HhHRh
Tabelle 4: SQL-Tabelle "user_groups"
Das Script verschickt anschließend eine Email, in der die notwendigen Daten enthalten
sind, um der Gruppe beizutreten:
Hallo Benutzer!
Durch die Verwendung des Links wird das Script "accept_invitation" aufgerufen. Als
erstes überprüft das Script den Zusammenhang zwischen dem Benutzer, der Gruppe und
der Einladung. Laut der Email in der Abbildung wäre es die Überprüfung, ob es in der
Tabelle user_groups einen Eintrag gibt, der wie folgt aussieht:
Wenn so ein Eintrag existiert, ist die Einladung gültig. Der Wert in der Spalte "invitation"
wird auf 0 gesetzt und der Wert von "security_token" entfernt. Somit gilt der Benutzer als
Mitglied der Gruppe mit der Gruppen-Id 27.
26
Ein erneuter Aufruf des Links in der Email hätte die Anzeige einer Fehlermeldung
("Einladung abgelaufen oder ungültig!") zur Folge und würde den Benutzer zum
Anmeldefenster führen.
Das Senden von Emails wird mit der in PHP eingebauten "mail" Funktion ausgeführt.
mail($email,$subject,$text,$header);
Hierfür werden einfach die benötigten Variablen als Strings zusammengestellt und dann
übergeben.
27
6.4 Postits
Das Kernelement des Programmes stellen die Postits dar. Das Design ist betont schlicht
gehalten und an die Papierform der bekannten Notizzettel angelehnt. Wie auf einer
Pinnwand sind die virtuellen Notizblätter verschiebbar und können übereinander gelegt
werden. Zur besseren Unterscheidung der einzelnen Blätter können diese eingefärbt und
beliebig vergrößert werden (vgl. Abschnitt „Größenänderung“).
28
6.4.1 Design
Ein einzelnes Postit ist aus mehreren Div-Containern aufgebaut, die die einzelnen
Bereiche des Postits begrenzen. Der Term #id in den einzelnen Bezeichnungen der Div-
Container stellt die Id des Postits in der Datenbank dar. Somit ist eine eindeutige
Identifizierung im DOM-Tree des Dokuments sichergestellt.
postit_#id: Dieses Div umschließt das Postit und enthält die Hintergrundfarbe sowie
Höhen- und Breitenangabe und Angaben zur Position des Postits. Hinzu kommt noch der
sogenannte „z-index“, also die Tiefeninformation. Mit diesem „z-index“ wird die
Verdeckung der einzelnen Divs realisiert. Alle diese Paramter werden bei der Anzeige der
Postits direkt aus der Datenbank gelesen und bei Veränderungen sofort in die Datenbank
geschrieben. Somit wird sichergestellt, dass die virtuelle Pinnwand immer in dem Zustand
verbleibt, in der sie zurückgelassen wird, in diesem Fall, wenn das Browserfenster mit der
Anwendung geschlossen wird.
postit_movebar_#id: Dieser Div-Container dient dazu, um das Postit verschieben zu
29
können. Wenn der Benutzer mit der Maus über das Div fährt, wird der Mauszeiger mit Hilfe
von CSS in einen Verschiebe-Zeiger verwandelt. Somit wird dem Benutzer die Möglichkeit
des Verschiebens visuell signalisiert. Außerdem wird mit der script.aculo.us - Funktion
"Draggable" ein verschiebbares Objekt erzeugt, welches das gesamte Postit beinhaltet.
postit_title_#id: In diesem Container wird der Titel des Postits angezeigt. Er ist mit einem
„onClick“-Event ausgestattet, das heißt bei einem Klick in den Bereich des Containers
wird das Script für den Bearbeitungsmodus aufgerufen. Bestätigt wird eine Änderung
simpel durch das Verlassen des Containers, also mit einem Klick außerhalb des
Containers. Dies wird durch das Javascript-Event „onBlur“ ermöglicht.
postit_content_#id: Dieser Container beinhaltet die eigentlichen Notizen, welche sich
wiederum in eigenen Containern befinden, damit ein separates Editieren ermöglicht wird.
Weiters ist dieser Container wichtig um eine automatische Größenänderung
vorzunehmen, falls der Inhalt nicht mehr in das Postit passt.
In der oberen linken Ecke des Arbeitsbereiches gibt es einen Link mit Namen "Neues
Postit anlegen". Dieser Link kann mit gedrückter linker Maustaste auf die Arbeitsfläche
gezogen werden. An der Stelle, wo die Maustaste losgelassen wird, wird ein neues Postit
30
erstellt. Dies wird durch folgenden Aufruf realisiert:
addPostit("Neues Postit", $user_id, $group_id, $top, $left);
"$user_id" bezeichnet dabei die Nummer des Benutzers, "$group_id" bezeichnet die
Nummer der Gruppe, in welcher das neue Postit erstellt werden soll, "$top" und "$left"
sind die Koordinaten der linken oberen Ecke des Postits. Dieses Koordinatenpaar ist dabei
genau die Stelle, an der der Erstellungslink losgelassen wurde.
Nach dem Eintrag in die Datenbanktabelle der Postits muss noch die Verbindung zu einer
Gruppe hergestellt werden.
Falls das neue Postit auf der privaten Pinnwand erstellt wurde, wird die Nummer des
Postits (die Nummer des zuletzt eingefügten Datensatzes) in die Tabelle "user_postits"
eingetragen, andernfalls zusammen mit der Gruppennummer in die Relationentabelle
"groups_postits". (siehe Abschnitt "Backend:MySQL").
Abschließend wird der Arbeitsbereich neu geladen, um das frisch erstellte Postit
anzuzeigen.
Der Titel eines Postits ist in einem eigenen Div Container verpackt.
Wenn man nun in diesen Container klickt, wird folgendes AJAX
Script aufgerufen:
Abbildung 18: Titel
ändern
if (title_textfield_active == false){
var title_div = "postit_title_"+id;
var title_textfield = "title_textfield_"+id;
$(title_textfield).focus();
title_textfield_active = true;
}
31
Felder manipuliert werden können.
Falls im Titelfeld der Text "Neues Postit" steht, wird ein leeres Textfeld erzeugt (siehe
Abbildung), ansonsten ein Textfeld mit Titeltext. Beim Verlassen des Textfeldes (onBlur -
Statement im Codebeispiel) wird ein weiteres Script mit Namen updateTitle aufgerufen.
Dieses AJAX Script schreibt den neuen Titel in die Datenbank und kennzeichnet den Titel
Container als inaktiv:
title_textfield_active = false;
6.5.3 Größenänderung
Die zweite Möglichkeit einer Änderung ist die automatische Anpassung der Postitgröße,
falls das Postit in vertikaler Richtung zu klein wird.
Dabei wird die aktuelle Höhe des Inhaltscontainers (postit_content) mit der Höhe des
Postits verglichen. Der Inhaltscontainer hat keine fixe Höhenangabe, daher kann er nach
unten wachsen und schließlich auch über die Grenzen des Postits hinausragen.
Bei jeder Aktualisierung eines Items wird folgende Funktion aufgerufen:
32
In dieser Funktion werden die beiden Höhenangaben miteinader verglichen und falls die
Höhe des Inhalts (content_height) größer als die Höhe des Postits (postit_height)
sein sollte, wird die Höhe des Postits in der Datenbank korrigiert und die Arbeitsfläche neu
geladen. Die Breitenangabe dient lediglich dazu, das bereits vorhandene Datenbankscript
für die Größenänderung verwenden zu können.
6.5.4 Farbänderung
33
6.5.5 Positionen
Fährt der Benutzer mit der Maus über den Container mit
dem Namen postit_movebar (siehe Abbildung), wird ein
verschiebbares Objekt erzeugt. Wenn der Benutzer nun
Abbildung 21: Container für das
Verschieben des Postits immer wieder über den Container fährt, würden immer
neue Objekte erzeugt werden. Um das zu vermeiden,
wird das Objekt wieder zerstört, sobald der Benutzer mit der Maus den Bereich des
Containers verlässt.
6.6 Items
Nach der Erstellung eines neuen Postits ist bereits ein Item
angelegt. Mit einem Klick auf den Text des Items wird der
Inhalt des Item-Containers durch ein Textfeld ersetzt, in dem
der Text bereits markiert ist.
Das folgende Codebeispiel stellt die Änderungsfunktion dar,
die den Inhalt des Items mit einem Textfeld tauscht.
Abbildung 22: Items in
Bearbeitung
if (item_textfield_active == false){
var item_div = "item_"+id;
$(item_div).innerHTML =
"<textarea id=\""+item_textarea+"\" rows=\"3\"
class=\"textarea_active\" onFocus=\"this.select();\"
onBlur=\"updateItem("+id+","+postit_id+");\" >" +value+"
34
</textarea>";
item_textfield_active = true;
}
35
7 Anwendung
Die Version des Programmes für mobile Endgeräte verwendet das selbe Backend wie die
Desktop Variante. Daher wirken sich Änderungen, die unterwegs mit einem mobilen
Endgerät vorgenommen werden, gleich direkt auf die virtuelle Pinnwand aus und
umgekehrt. Mit anderen Worten sind die beiden Programme nur zwei verschiedene
Darstellungsformen von ein und denselben Daten.
7.1 Webclient
Die Webversion des Programmes präsentiert sich als Pinnwand (Abb. 23). Um ein neues
Postit zu erstellen, muss man nur den Link „Neues Postit erstellen“ an die gewünschte
Stelle des Bildschirms ziehen. Sobald die Maustaste losgelassen wird, erscheint an dieser
Stelle das neue Postit. Die einzelnen Postits lassen sich nun einfach verschieben und neu
anordnen. Verdeckungen werden dadurch berücksichtigt, das das aktive Postit in der
36
Hierarchie nach oben rutscht und die übrigen Postits verdeckt.
Neue Items werden mit einem Klick in das Postit hinzugefügt – es erscheint ein Item mit
dem Text „Bearbeiten“. Mit einem erneuten Klick lässt sich das neue Item nun ändern und
wird mit einem Klick außerhalb des Postits abgespeichert. Die Menüleiste jedes einzelnen
Postits gibt Auskunft über das Datum der Erstellung und über den Autor, und bietet Icons
für die Farbauswahl und für das Löschen des ganzen Postits.
Bei einer Änderung des Inhaltes eines Postits werden alle Mitglieder der Arbeitsgruppe per
Email verständigt.
Am oberen Bildschirmrand befindet sich die Menüleiste, welche Links zur Erstellung neuer
Postits und Gruppen bietet. Darüber befindet sich ein Dropdown-Menü um zwischen den
Gruppen zu wechseln. Falls man zu einer neuen Gruppe eingeladen wurde, erscheint
neben diesem Dropdown-Menü eine dementsprechende Nachricht in roter Schrift.
Sobald man Mitglied in einer Gruppe ist, kann man neue Mitglieder mit Hilfe des Links in
der Menüleiste, oder über das Texteingabefeld einladen.
Beim Design des mobilen Clients wurde vor allem auf rasche Bedienbarkeit geachtet. Die
Links sind als große Balken dargestellt, um die Verwendung von Touchscreen-Displays
besonders gut zu unterstützen.
Die einzelnen Webseiten sind in einfachem HTML Code geschrieben, um möglichst wenig
Probleme auf den unterschiedlichen Endgeräten zu verursachen. Die Links aktivieren die
gewünschten Scripts zur Datenmanipulation gleich direkt. Das heißt der Datentransfer
funktioniert so, wie man das vor dem Zeitalter von AJAX gekannt hat. Das mobile
Endgerät schickt eine Anfrage an den Webserver mit gewünschtem Script und allen
benötigten Parametern. Der Webserver führt das Script aus und sendet die Antwort,
meistens eine neue HTML Seite, an das Gerät zurück, welches die Antwortseite dann
anzeigt. Auf diese Art und Weise kann man sehr rasch durch die einzelnen Bereiche des
Programmes navigieren.
Das Programm verwendet dieselben Datenbankscripten für das Erstellen, Ändern und
Löschen von Postits und Items, die bereits in den vorherigen Kapiteln ausführlich
beschrieben wurden.
37
Abbildung 24: Postits in einer Abbildung 25: Postit mit Abbildung 26: Item in
Gruppe einzeInen Items Bearbeitung
Nach der erfolgreichen Anmeldung befindet man sich auf der Gruppenübersichtseite. Hier
kann man eine Gruppe auswählen, der man angehört. Auch das Erstellen einer neuen
Gruppe ist mit einem Link möglich. Nach der Auswahl der Gruppe erscheinen die
einzelnen Postits der Gruppe (Abb. 24), aber jeweils nur der Titel des Postits. Links für das
Erstellen eines neuen Postits sind oben und unten auf dem Bildschirm vorhanden.
Um ein Postit zu bearbeiten muss man einfach auf den Titel des entsprechenden Postits
klicken und gelangt dann zum Postit an sich. Die Bearbeitung der einzelnen Items erfolgt
intuitiv, ein Klick auf den Itemtext und schon kann man das Item verändern. Es öffnet sich
ein Standard-Webformular mit Schaltflächen zum Ändern oder zum Löschen des Textes
(Abb.26).
Neue Items werden mit Hilfe des Textfeldes in der Postitansicht erzeugt. Ein Klick auf die
"Eintragen"-Schaltfläche (Abb. 25) erzeugt das neue Item, außer das Textfeld ist leer. In
diesem Fall hat ein Klick auf die Schaltfläche keinen Effekt.
Um die Navigation zu erleichtern, gibt es auf jeder Seite als ersten Link die "Zurück"-
Schaltfläche.
38
8 Diskussion
9 Ausblick
Die mobile Variante ist im Grunde genommen eine Webseite, die auf dem Endgerät
angezeigt wird. Eine möglich Weiterentwicklung wäre die Programmierung einer
Anwendung für das Iphone, das heißt eine Anwendung, die direkt auf dem Gerät installiert
und aus dem Menü heraus aufgerufen wird. Ein solches Client-Programm könnte den
Komfort in der Bedienung der Software erhöhen, es wäre zum Beispiel nicht mehr
notwendig, irgendwelche Verbindungsdaten wie die URL oder die Login-Daten
einzugeben, da diese Informationen im Client gespeichert werden könnten.
Auch könnte mit dem Client eine ansprechende grafische Umsetzung der Postits am
Iphone erreicht werden um die Benutzer auch visuell anzusprechen.
39
Im Desktopbereich können durch die Verwendung der script.aculo.us - Funktion "sortable"
die einzelnen Items eines Postits per "Drag and Drop" sortiert werden.
Die Datenbank ist mit der Items-Tabelle bereits auf verschiedene Arten von Inhalten
vorbereitet. Das heißt es kann in Zukunft möglich sein, Bilder und eventuell auch Videos in
ein Postit zu integrieren. Bei den Bildern ist allerdings noch die Frage zu klären, ob diese
verlinkt oder direkt vom Benutzer auf den Server hochgeladen werden können.
Grafische Verbesserungen und auch Verbesserungen in der Benutzbarkeit sind natürlich
immer vorzunehmen, wobei letzteres erst durch die Verwendung des Programmes und
durch regelmäßiges Feedback zu erreichen sind. Zu diesem Zweck sollte ein Formular für
die Kontaktaufnahme und zur Fehlerberichterstattung integriert werden.
Mit Hilfe von Widgets kann man die Postits auf dem Desktop dargestellen und bearbeiten.
Zusätzlich könnten einzelne Postits mit Hilfe von Widgets auf Webseiten eingebunden
werden.
40
10 Literaturverzeichnis
41
11 Anhang
11.1 Datenbankschema
postits:
id :int (primary key)
titel :varchar(255)
item_id :int
author_id :int
creation_date :timestamp(int)
expiration_date :timestamp(int)
position_top :int
position_left :int
height :int
width :int
z_index :int
color :varchar(255)
items:
id :int (primary key)
postit_id :int (index)
item_type :varchar(255)
value :text
position_index :int
users:
id :int (primary key)
username :varchar(255)
password :varchar(255) (MD5)
email :varchar(255)
last_login :timestamp(int)
active_group_id :int
42
groups:
id :int (primary key)
name :varchar(255)
users_postits:
postit_id :int
user_id :int
visibility :boolean
user_groups:
user_id :int
group_id :int
invitaiton :boolean
security_token :varchar(25)
groups_postits:
postit_id :int
group_id :int
visible :boolean
user_friends:
user_id :int
friend_id :int
date_add :timestamp(int)
43