Bisher haben Sie gelernt, wie Daten in Datenbanken eingegeben und Abfragen dazu genutzt werden, diese wieder anzuzeigen - aber die beiden Prozesse wurden kaum integriert. Wenn eine Website dynamische Daten anzeigt, gibt es in der Regel auch ein Backend für diese Website, wo die gespeicherten Daten aktualisiert werden.
Dieses Kapitel legt ein Nachrichten-Board-System an, das die Techniken zum Sammeln von Daten und zur Berichterstellung nutzt. Damit werden fast alle Funktionsmerkmale von UltraDev in einer einzigen Applikation kombiniert. Die Themen der heutigen Lektion:
Eine der gebräuchlichsten Web-Applikationen, die es gibt, sind die Nachrichten-Boards. Das sind Foren, in denen Benutzer Nachrichten austauschen können. Vor einigen Jahren habe ich ein Nachrichten-Board-Programm (in C geschrieben) für mehr als 2.000 DM verkauft. Glücklicherweise kann es heute in UltraDev in ein bis zwei Stunden entwickelt werden.
Dieses Kapitel kombiniert viele der Standardverhalten von UltraDev, die Sie bisher kennen gelernt haben. Das Ergebnis ist eine Nachrichten-Applikation, die zahlreiche Funktionsmerkmale der kommerziellen Pakete anbietet - und Sie können sie ganz alleine entwickeln. Damit bieten Sie Benutzern und Administratoren insbesondere die folgenden Möglichkeiten:
Wie für jedes Projekt sollten Sie als Erstes einen Plan für Ihre Site anlegen. Die Sitemap definiert alle Bildschirme, die wir anlegen müssen, und beschreibt die grundlegende Kommunikation zwischen den Bildschirmen. Für unser Nachrichten-Board-System brauchen wir relativ wenige Bildschirme. Das endgültige Produkt bietet eine umfassende Funktionalität, aber wir kommen mit ein paar wenigen Bildschirmen aus, weil der Inhalt die Änderungen darstellt. Und das brauchen wir:
Das ist alles, was wir für ein vollfunktionales System brauchen. Je mehr Sie mit UltraDev arbeiten, desto mehr erkennen Sie, dass sehr viel in sehr wenig Dateien erledigt werden kann. Abbildung 16.1 zeigt die Sitemap für unser Nachrichten-Board.
Abbildung 16.1: Die Sitemap für das Nachrichtensystem ist bemerkenswert einfach.
Nachdem die Sitemap entwickelt wurde, legen Sie das Backend für das System an. Achten Sie dabei auf die Funktionsmerkmale, die Sie realisieren wollen, weil sie sehr wichtig für die Struktur der eigentlichen Datenbank sind.
Das SQL für dieses System ist wirklich sehr einfach. Während des Entwurfsprozesses fallen jedoch einige wichtige Entscheidungen an.
Zunächst überlegen wir, welche Informationen für bestimmte Anforderungen abgelegt werden müssen:
Ganz einfach! Wir beginnen mit einer genauso einfachen Tabellendefinition:
create table message (
subject varchar(80),
iconURL varchar(80),
author varchar(80),
body text
)
Wir haben noch keinen Primärschlüssel definiert, weil die Tabelle kein Feld enthält, das
ohne Weiteres als eindeutiger Kennzeichner verwendet werden könnte. Leider kann
MySQL nur 512 Byte in einem varchar
speichern, somit wäre die Länge der Nachricht
sehr beschränkt. Ein alternativer Ansatz ist die Verwendung eines Blob - eines binären
Objekts. Ein binäres Objekt kann mehrere Gigabyte groß werden - mehr als genug für eine
kurze Nachricht.
Einige Datenbankserver unterstützen den Feldtyp memo
. MySQL bietet den Feldtyp text
,
der so viel wie ein entsprechendes Blob aufnehmen kann.
Wenn ein Blob einen weniger eingeschränkten Gültigkeitsbereich hat, warum verwendet man dann nicht immer Blobs? Die Verarbeitung von Blobs ist nicht ganz einfach, wenn Sie vorhaben, Schnittstellen zur Außenwelt zu schaffen. Wenn Sie beispielsweise mit dem Datenbanktreiber myODBC aus MS Access eine Verbindung zu einer MySQL-Datenbank einrichten, können Sie nicht auf die Daten in der Tabelle zugreifen. Stellen Sie sicher, dass Sie mit Ihren Daten überall arbeiten können, wo das erforderlich ist. Glücklicherweise haben wir den Typ
text
, der ausgezeichnet funktioniert!
Jetzt wollen wir das Problem betrachten, wenn kein Primärschlüssel vorhanden ist - wie beispielsweise eine Nachrichten-ID. Um ein System zu implementieren, in dem wir alle Antworten auf eine bestimmte Nachricht anzeigen können, brauchen wir außerdem ein zweites Feld, das ebenfalls eine Nachrichten-ID enthält. Wie? Zwei Nachrichten-IDs? Wozu um alles in der Welt soll das gut sein?
Für unser Nachrichten-Board-System brauchen wir zwei Nachrichten-IDs. Die erste ID ist
der eindeutige Bezeichner für die Nachricht, die zweite ID wird auf den Wert einer
übergeordneten Nachricht gesetzt. Wenn Sie beispielsweise auf eine Nachricht mit der ID
325 antworten, hat die neue Nachricht die parentID
325. Wenn die übergeordnete
Nachricht angezeigt wird, werden außerdem alle anderen Nachrichten, die eine parentID
haben, die gleich der ID der übergeordneten Nachricht ist, in der Liste der Antworten
angezeigt.
Die Definition unserer Nachrichtentabelle sieht damit jetzt so aus:
create table message (
ID int not null auto_increment,
parentID int,
subject varchar(80),
iconURL varchar(80),
author varchar(80),
body varchar(250),
primary key (ID)
)
Legen Sie diese Tabelle noch nicht auf Ihrem Server an! Sie muss noch ein bisschen abgeändert werden!
Die ID dieser Nachricht ist etwas Neues für uns - statt einer normalen ganzen Zahl
handelt es sich um eine auto_increment
-Ganzzahl. Das nimmt uns Einiges an
Programmierarbeit für dieses System ab. Wir können nicht davon ausgehen, dass ein
Benutzer eine eindeutige ID eingibt. Statt das jedoch programmtechnisch in ASP/JSP/
CFML zu lösen, erzeugt der SQL-Server für jede neue Nachricht, die dem System
hinzugefügt wird, automatisch eine neue Nummer. Coole Sache, was?
Damit haben wir schon das Meiste geschafft auf dem Weg zu einem vollständigen Modell für das Datenbanksystem, aber noch nicht alles. Eines der Funktionsmerkmale dieses Systems ist, dass der Benutzer die Möglichkeit haben soll, eine Nachricht zu löschen, die er selbst abgesetzt hat.
Weil ich dieses Buch schreibe, mache ich alles so, wie ich es für richtig halte - das ist die eigentliche Befriedigung beim Schreiben. Ich will nicht auf eine Website gehen und versuchen, an einer Diskussion teilzunehmen, um dann feststellen zu müssen, dass ich mich zuvor langwierig registrieren muss, um überhaupt eine Nachricht absetzen zu können.
Wo ist das Problem? Es gibt absolut keinen Grund, jemanden zu einer Registrierung zu zwingen, der an einer Diskussion teilnehmen will! Damit zwingt man nämlich den Benutzer nicht, korrekte Informationen einzutragen, sondern verlangsamt ihn nur. Ich will meine Gedanken veröffentlichen und dabei meinen Weg gehen. Deshalb werden wir auch dieses Nachrichten-Board auf meine Weise entwickeln - kein langer Registrierungsprozess, um Nachrichten absetzen zu können! Sie dürfen es natürlich jederzeit abändern, um genau Ihre Vorstellungen zu verwirklichen.
Meine bevorzugte Technik, wie ich dem Benutzer die Möglichkeit verschaffe, Nachrichten zu löschen (oder sie zu bearbeiten), ist die Speicherung eines einfachen Kennworts zusammen mit jeder Nachricht. Wenn die Nachricht angezeigt wird, wird unten im Fenster ein kleines Formular mit Kennwortfeld und einer Löschen-Schaltfläche angezeigt. Geben Sie einfach das Kennwort für die Nachricht ein und klicken Sie auf die Löschen-Schaltfläche. Ratz-fatz - weg ist sie!
Damit brauchen wir ein weiteres Feld in der Tabelle - ein Kennwortfeld. Wir sind noch nicht ganz fertig. Der Datenbank muss noch eine weitere Funktionalität hinzugefügt werden, damit unser Nachrichten-Board moderiert werden kann. Für diejenigen unter Ihnen, die nicht genau wissen, was ein moderiertes Nachrichten-Board ist: Es ermöglicht einem Administrator, auszuwählen, welche Nachrichten angezeigt werden und welche nicht. Um dies in unserem System zu implementieren, führen wir einfach ein verborgenes Feld mit einem booleschen Wert in das Datenbankmodell ein. Wenn eine Nachricht angezeigt werden soll, wird der Wert des verborgenen Felds auf False (0) gesetzt. Andernfalls wird er auf True (1) gesetzt.
Diese letzte Information führt uns zu folgender Tabellendefinition:
create table message (
ID int not null auto_increment,
parentID int,
subject varchar(80),
iconURL varchar(80),
author varchar(80),
body varchar(250),
password varchar(50),
hidden int,
primary key (ID)
)
Das ist alles. Abbildung 16.2 zeigt die endgültige Datenbankdefinition.
Abbildung 16.2: Die Datenbank für das Nachrichten-Board ist relativ einfach.
Sie fragen sich jetzt vielleicht, wie eine Tabelle aus einer einzigen Tabelle bestehen kann. Das ist wirklich alles, was wir brauchen. Das gesamte Nachrichten-Board basiert auf einer einzigen Daten-Entität - der Nachricht.
Im letzten Schritt füllen Sie die Nachrichtendatenbank mit ein paar Testnachrichten. Später werden Sie feststellen, dass es viel einfacher ist, Datensätze über die Oberfläche zum Schreiben der Nachrichten einzutragen, weil diese die IDs automatisch verwaltet. Momentan ist es aber am einfachsten, ein paar Nachrichten mit der ID 0 in das System einzufügen. Hier die Datensätze, die ich dafür verwende:
insert into message values ('','0','Testnachricht','icon1.jpg','John Ray',
'Dies ist ein Test des Nachrichtensystems','smugguy','0');
insert into message values ('','0','Willkommen beim Nachrichten-Board',
'icon3.jpg','Administrator','Willkommen beim neuen Nachrichtensystem!','
=>;adminmessage','0');
insert into message values ('','0','Cool gemacht!',
'icon1.jpg','John Ray','Gute Arbeit, Jungs, tolles System!','smugguy','0');
Ich werde diese Datensätze mehrfach in das System eintragen, sodass die Datenbank ein
bisschen voller wird. Wie ist das möglich? Müssen die Datensätze nicht eindeutig sein? Ja,
müssen sie! Für die Definition der MySQL-Datenbank wurde die auto_increment
-
Funktion verwendet. Weil unser ID-Feld auf auto_increment
gesetzt ist, wird bei jedem
Eintrag einer neuen Nachricht eine neue ID erzeugt. Selbst wenn die INSERT
-
Anweisungen Ihnen identisch erscheinen, trägt das System automatisch einen neuen Wert
in das ID-Feld ein, wenn ein neuer Datensatz eingefügt wird.
Alle Teile der Site können aus einfachen Komponenten zusammengesetzt werden - setzen Sie nur die Bausteine an die richtige Stelle und lassen Sie dabei Ihre Finger gekreuzt.
Das Fingerkreuzen mag in manchen Situationen helfen, aber Sie sollten sich nicht darauf verlassen, insbesondere bei Problemen außerhalb der UltraDev-Umgebung.
Probleme, die durch Fingerkreuzen nicht gelöst werden können, sind nicht selten ein Fall für eine höhere Instanz.
Wie bei jeder Site, die Sie einrichten, müssen Sie als Erstes ein neues UltraDev-Projekt
anlegen und eine geeignete Verbindung zu Ihrer Datenbank herstellen. Ich habe ein paar
Icon-Dateien angelegt, icon1.jpg
, icon2.jpg
usw. und sie auf dem Server abgelegt.
Jetzt können wir anfangen. Zunächst legen wir die Seite mit der Hauptlistenansicht an. Dies ist die Hauptseite der Site und alle Benutzer der Web-Applikation sollen zuerst hierhin gelangen. Versuchen Sie, das Ganze so einfach wie möglich zu gestalten. Wenn Sie Tausende von Nachrichten anbieten wollen, sollten Sie die Ladezeiten so kurz wie möglich halten. Berücksichtigen Sie außerdem die Funktionen, die diese Seite unterstützen soll:
Weil ich Ihnen diese Funktionsmerkmale am Anfang des Kapitels versprochen habe, sollte ich nun auch damit beginnen. Abbildung 16.3 zeigt ein einfaches Layout für meinen Bildschirm mit der Nachrichtenliste.
Jetzt legen wir eine Datensatzgruppe an, die alle Nachrichten auflistet. Weil wir die Funktionalität nach und nach einfügen, müssen wir immer wieder zu der Datensatzgruppen-Abfrage zurück und sie entsprechend anpassen.
Als erstes wollen wir die Nachrichtenliste auf dem Bildschirm anzeigen. Dazu legen wir eine Datensatzgruppe an, die die für die Nachrichtenliste benötigten Felder enthält. Außerdem brauchen Sie einen Filter, der Datensätze ermittelt, deren verborgene Felder gleich Null sind.
Abbildung 16.3: Entwerfen Sie Ihren Bildschirm mit der Nachrichtenliste so, dass alle für die Site benötigten Elemente bereitgestellt werden.
Wir wollen dem Administrator die Möglichkeit geben, das Nachrichten-Board zu moderieren. Ist das verborgene Feld für eine Nachricht auf 1 gesetzt, wollen wir es nicht anzeigen. Wir sollten also nur die Nachrichten auswählen, für die das verborgene Feld gleich 0 ist. Meine erste Datensatzgruppen-Definition sehen Sie in Abbildung 16.4.
Abbildung 16.4: Legen Sie Ihre eigene Datensatzgruppe ähnlich der hier gezeigten an.
Jetzt legen Sie Ihre Nachrichtenliste wie folgt an:
iconURL
ein neues Bild ein, wo das Symbol auf Ihrem
Bildschirm erscheinen soll.
iconURL
.
Nachdem Sie Ihre Liste entworfen haben, gehen Sie in den Live Data-Ansichtsmodus. Wenn Sie meinem grundlegenden Entwurf gefolgt sind, sehen sie jetzt etwas wie in Abbildung 16.5 gezeigt.
Abbildung 16.5: Die Nachrichtenliste ist fast fertig.
Jetzt werde ich meinem Bildschirm einen Kennzeichner hinzufügen, der anzeigt, wie viele Nachrichten vorhanden sind, und was die erste und die letzte Nachricht sind. Dazu ziehen Sie die Einträge [
total records
], [first record index
] und [last record index
] von Ihrer Datensatzgruppe in die Entwurfsansicht an die Stelle, wo sie auf dem Bildschirm erscheinen sollen.
Im nächsten Schritt verankern Sie die Links Nächste Nachrichten und Vorherige Nachrichten und weisen ihnen Funktionalität zu. Sie kennen diesen Prozess bereits, er sollte Ihnen deshalb keinerlei Schwierigkeiten bereiten.
Abbildung 16.6: Wählen Sie Ihren Link und die Datensatzgruppe aus, um die Navigationsfunktionen für die Nachrichtenliste zu realisieren.
Nachdem Sie diese Ergänzungen vorgenommen haben, testen Sie Ihre Seite. Jetzt sollte es möglich sein, sich zwischen den Bildschirmen aller verfügbaren Nachrichten zu bewegen.
Um das Projekt benutzerfreundlicher zu machen, sollten Sie die Links Vorherige Nachrichten und Nächste Nachrichten entfernen, wenn es nicht sinnvoll ist, sie anzuklicken. Wenn Sie die erste Nachricht anzeigen, gibt es keine vorhergehenden Nachrichten. Wenn Sie die letzte Nachricht anzeigen, gibt es keine weiteren Nachrichten.
Wenn Sie eine ältere Version von UltraDev verwenden, werden Sie mit dem folgenden Abschnitt Probleme haben. In früheren Versionen war das Verhalten Bereich anzeigen das Verhalten Bereich verbergen. Um die Projekte in diesem Buch mit der Verhaltensweise Bereich verbergen zu realisieren, kehren Sie einfach die Bedingungen um, unter denen ein Bereich angezeigt wird, um das Verhalten »Verbergen« nachzuempfinden.
Beispielsweise ist das Anzeigen eines Bereichs, wenn es sich um den letzten Datensatz handelt, dasselbe wie das Verbergen eines Bereichs, wenn er nicht der letzte Datensatz ist.
Verbergen Sie diese beiden Bereiche mit dem Serververhalten Bereich anzeigen wie folgt:
Abbildung 16.7: Verbergen Sie die Links Nächste Nachrichten und Vorherige Nachrichten, falls sie auf nichts verweisen.
Während wir uns mit dem Verbergen und Anzeigen von Bereichen beschäftigen, wollen wir zwei weitere bedingte Bereiche für Ihren Dokumententwurf ansprechen.
Der erste Bereich, der verborgen werden soll, ist die eigentliche Nachrichtenliste! Falls keine Nachrichten zur Verfügung stehen, braucht man die Nachrichtenüberschriften auch nicht anzuzeigen. Wenden Sie das Verhalten Bereich anzeigen, wenn die Datensatzgruppe nicht leer ist. Auf diese Weise werden die Spaltenüberschriften nur dann angezeigt, wenn eine oder mehr Nachrichten aufzulisten sind.
Der zweite Bereich, der angezeigt werden soll, ist etwas weniger offensichtlich, weil Sie ihn noch nicht angelegt haben. Wenn es keine Nachrichten gibt, dann sollte man das dem Benutzer mitteilen, damit er nicht schon auf dem ersten Bildschirm verunsichert wird. Fügen Sie die Meldung »Es stehen keine Nachrichten zur Verfügung« in den Inhaltsbereich des Bildschirms ein - aber außerhalb des wiederholten Bereichs (verborgene Bereiche dürfen wiederholte Bereiche nicht überlappen). Wenden Sie auf diese Meldung die Verhaltensweise Bereich anzeigen an, mit der Bedingung, dass er angezeigt wird, wenn Sie die Option Wenn Datensatzgruppe leer ist ausgewählt haben.
O.K., weiter geht's. Wir wollen dem System Sortiermöglichkeiten hinzufügen. Das ist ein wenig anders als alles, was wir bisher gemacht haben. Wir brauchen einen Link auf jede der Spaltenüberschriften auf der Seite und übergeben einen Parameter, der die Datensatzgruppe angibt und ihr mitteilt, wonach sie sortiert werden soll. (Falls Sie das noch nicht verstanden haben, machen Sie sich keine Gedanken, das kommt noch.) Beispielsweise haben wir drei Überschriften, nach denen wir sortieren wollen:
Diese Überschriften entsprechen den drei Feldern der Datenbank. Zufälligerweise haben
diese Felder denselben Namen wie die Überschriften. Was ist mit den Links, die wir
anlegen müssen? Sie sind ganz einfach - Sie ändern den Dateinamen index.asp
so, wie
Sie die Seite anzeigen wollen:
index.asp?sortby=ID
index.asp?sortby=Autor
index.asp?sortby=Thema
Richten Sie diese Links jetzt in Ihrem Dokument ein. Wählen Sie die verschiedenen Spaltenüberschriften und verwenden Sie die Eigenschaftenpalette, um den Link zur entsprechenden Überschrift in der Liste einzurichten.
Nachdem die Links angelegt wurden, kann der Benutzer die einzelnen
Spaltenüberschriften anklicken. Dieser Klick sendet die Variable sortby
an die Seite mit
der Nachrichtenliste zurück und setzt sie auf die Spalte, nach der sortiert werden soll.
Leider weiß die Seite mit der Nachrichtenliste nicht, wie man irgend etwas sortiert. Wie
müssen die Datensatzgruppe ein wenig abändern! Um der Seite die Möglichkeit zu geben,
eine Sortieroperation durchzuführen, nehmen Sie die folgenden Änderungen an der
Datensatzgruppe vor:
Abbildung 16.8: Fügen Sie die ORDER BY- Information ein, dann kann Ihre Site sortieren!
varSortby
. Ihr Anfangswert sollte ID
sein, der Laufzeitwert sollte Request('sortby')
sein.
ORDER BY
-Klausel der SQL-Anweisung so ab, dass sie nach der
Variablen varSortby
sortiert (d.h. ORDER BY 'varSortby'
).
Wenn Sie Ihre Links korrekt definiert haben, sollte alles funktionieren. Klicken Sie auf die
Links, um die zugehörigen sortby
-Parameter in die Datensatzgruppe einzufügen, sodass
die Datensatzliste nach dieser Spalte sortiert wird.
Leider gibt es bei dieser Technik ein Problem. Sie funktioniert für die grundlegende Nachrichtenliste, aber versuchen Sie jetzt, auf eine zweite Seite mit Nachrichten zu gehen und klicken Sie die Überschrift an, nach der sortiert werden soll. Sie sehen, dass die Nachrichtenliste nach dem Überschriftsfeld sortiert sind, aber bei den angezeigten Nachrichten handelt es sich um die Nachrichten von der ersten Seite.
Alle Parameter, die steuern, welche Datensätze angezeigt werden, gehen durch die verwendeten direkten Links verloren. Wie können Sie dieses Problem umgehen? Sie verwenden eine etwas abgeänderte Variante des Serververhaltens Zu Seite mit ergänzenden Themen wechseln. Gehen Sie wie folgt vor, um Links anzulegen, die in jeder Situation korrekt funktionieren, nicht nur in der grundlegenden Nachrichtenliste.
Nachdem Sie der Seite die Verhaltensweisen hinzugefügt haben, bearbeiten Sie den Code
direkt. Im aktuellen Status geben die Links nur die bereits existierenden Parameter weiter.
Sie müssen die Möglichkeit nutzen, den sortby
-Parameter in der URL-Zeile zu übergeben.
Öffnen Sie den Quellcode und suchen Sie nach Ihren Links. Sie sehen in etwa wie folgt aus:
<A HREF="index.asp?<%= MM_keepBoth %>">Thema</A>
Schreiben Sie unbedingt das Ampersand-Zeichen (&) zwischen
sortby=Thema
und<%= MM_keepBoth %>
. Wenn Sie dieses Symbol vergessen, entstehen unvorhersehbare Ergebnisse.
Damit funktionieren die Links. Das ist natürlich nicht perfekt, weil es nicht vollständig in der UltraDev-Umgebung automatisiert werden kann. Es demonstriert jedoch, dass Sie die Beschränkungen von UltraDev umgehen können, indem Sie so viel Code wie möglich innerhalb der Oberfläche erstellen und dann gegebenenfalls manuelle Änderungen vornehmen.
Wenn Sie in der UltraDev-Umgebung bleiben wollen, um die Änderungen an Ihren Links vorzunehmen, rufen Sie den Eigenschafteninspektor auf und fügen dem Link den zusätzlichen Code hinzu.
Damit haben wir die Sortiermöglichkeit bereitgestellt. Jetzt wollen wir die Möglichkeit schaffen, bestimmte Nachrichten zu suchen und eine Liste nur derjenigen Nachrichten zu erstellen, die ein bestimmtes Schlüsselwort enthalten.
In der letzten Woche haben Sie bereits die Suchfunktion für das Katalogsystem kennen gelernt. Hier machen wir genau dasselbe. Es muss nur eine Entscheidung getroffen werden, bevor wir die Suchfunktion implementieren können: Wonach genau suchen wir?
Sollen wir das Autor-Feld durchsuchen? Oder das Thema-Feld? Oder den eigentlichen Nachrichtenrumpf?
Diese Entscheidung bleibt Ihnen überlassen, aber der Vollständigkeit halber wollen wir hier alle Möglichkeiten einbeziehen.
Auf einer Produktions-Website sollten Sie die Geschwindigkeit komplexer Suchen überprüfen, bevor Sie sie anbieten. Das Durchsuchen des Nachrichtentexts für Tausende von Nachrichten kann dauern - auch auf schnellen Computern.
Um alle Felder zu durchsuchen, brauchen wir mehr Logik in der Datensatzgruppe, die wir
immer weiter verfeinert haben. Wenn Sie sich an das Kapitel über die Kataloge erinnern,
wissen Sie, dass wir ein Schlüsselwort mithilfe der LIKE
-Syntax mit einem Feld vergleichen
können: WHERE suchfeld LIKE '%varSuchbegriff%'
.
Das fügen wir jetzt der Definition unserer Datensatzgruppe für die Seite hinzu. Öffnen Sie die Palette Serververhalten und doppelklicken Sie auf Datensatzgruppe (Abfrage) für die Seite. Wechseln Sie dafür gegebenenfalls zuvor in den erweiterten Modus.
Die aktuelle Abfrage sollte etwa wie folgt aussehen:
SELECT ID, Thema, iconURL, Autor
FROM message
WHERE hidden = MMColParam
ORDER BY 'varSortby'
Beachten Sie, dass es in der SQL-Anweisung bereits eine WHERE
-Klausel gibt. Wir können
diese Bedingung nicht einfach löschen und eine neue einfügen, aber wir können sie
ergänzen, indem wir die Abfrage neu formulieren, sodass sie wie folgt aussieht:
SELECT ID, Thema, iconURL, Autor
FROM message
WHERE hidden = MMColParam AND (Thema LIKE '%varSuchbegriff%'
OR author LIKE '%varSuchbegriff%' OR body LIKE '%varSuchbegriff%')
ORDER BY 'varSortby'
Bevor Sie die Abfrage schließen, definieren Sie die Variable varSuchbegriff
:
varSuchbegriff
.
Request(Suchbegriff)
.
Abbildung 16.9 zeigt die endgültige Abfragekonfiguration.
Abbildung 16.9: Ändern Sie die Datensatzgruppe ein letztes Mal ab, um die Suchmöglichkeit zu implementieren.
Der letzte Schritt, um die Suchfunktion in Ihrem Code zu verankern, ist sicherzustellen,
dass das Eingabefeld für das Suchformular gleich Suchbegriff
ist. (Das ist für die
Konfiguration des Laufzeitwerts erforderlich, den wir eben gesetzt haben,
Request(Suchbegriff)
). Die Formularaktion muss so gesetzt werden, dass sie auf dieselbe
Seite zurückverweist.
Wie die Sortierfunktion wird auch die Suchfunktion innerhalb des eingebetteten Codes auf einer einzigen Seite implementiert. Sie könnten die Suchfunktion auch auf einer anderen Seite anlegen, aber diese Suche wäre dann schwieriger zu verwalten. Ich versuche, so viel zusammenhängende Funktionalität wie möglich im Code einer einzigen Seite unterzubringen.
Glückwunsch! Damit haben Sie den schwierigsten Teil dieses Kapitels hinter sich gebracht. Neben ein paar Links, die noch angelegt werden müssen, ist die Nachrichtenlistenansicht fertig. Jetzt werden wir Nachrichten lesen und schließlich Nachrichten schreiben. Diese beiden letzten Abschnitte sind aber wesentlich einfacher als der Aufbau der Nachrichtenliste.
Es ist zwar möglich, das Lesen der Nachrichten innerhalb desselben Dokuments zu
realisieren wie die Nachrichtenliste, aber in einem neuen Dokument ist es einfacher zu
implementieren. Damit Sie sich alles gut merken können, geben Sie diesem Dokument
den Namen message
(mit einer für Ihre Serverplattform geeigneten
Dateinamenerweiterung).
Bevor Sie Ihre Ansicht zum Lesen von Nachrichten entwerfen, fügen wir einen Link auf die Nachrichtenlistenansicht ein, sodass die Benutzer auf den Link klicken können, um eine Nachricht anzuzeigen. Wählen Sie jetzt den Text aus, auf den der Benutzer klicken soll, um die vollständige Nachricht zu sehen. Die Themenzeile ist gut dafür geeignet. Erzeugen Sie den Link mithilfe des Serververhaltens Zu Detailseite wechseln:
message.asp
verweist.
OK
, nachdem Sie fertig sind.
Abbildung 16.10: Übergeben Sie die Nachrichten-ID der neuen Nachrichtenseite.
Es gibt noch etwas zu erledigen, bevor Sie den Bildschirm für die Nachrichtenanzeige
anlegen - fügen Sie ein paar Antworten ein. Sie wissen, dass die Nachrichtendatenbank für
jeden Eintrag eine Nachrichten-ID sowie die ID einer übergeordneten Nachricht enthält.
Die ID der übergeordneten Nachricht (parentID
) ist die Nachrichten-ID der Nachricht, auf
die geantwortet wurde. Wenn ein Benutzer beispielsweise auf die Nachricht mit der ID 15
antwortet, wird diese ID zur parentID
der neuen Nachricht. Wir wollen das System so
einrichten, dass wenn diese hypothetische Nachricht 15 angezeigt wird, auch alle
zugehörigen Antworten angezeigt werden. Jetzt tragen wir ein paar Antworten in die
Datenbank ein:
insert into message values ('','2','Eine Antwort!','icon1.jpg','John Ray',
'Dies ist ein Test des Nachrichtensystems','smugguy','0');
insert into message values ('','2','Mir gefällt's hier nicht','icon3.jpg',
'Administrator','Willkommen beim neuen Nachrichtensystem!','adminmessage','0');
insert into message values ('','2','Hier ist es alles andere als cool!','icon1.jpg',
'John Ray','Gut gemacht, Jungs! Tolles System!','smugguy','0');
Diese Datensätze haben die parentID
2, d.h., es handelt sich um Antworten auf die
Nachricht 2.
Jetzt können wir die Seite für die Anzeige der Nachrichten entwickeln. Wir müssen drei Funktionen dafür vorsehen:
Abbildung 16.11 zeigt einen grundlegenden Entwurf für den Bildschirm mit der Nachrichtenanzeige. Sie können dabei natürlich so detailliert oder so einfach wie gewünscht vorgehen.
Abbildung 16.11: Der Bildschirm für die Nachrichtenansicht muss drei funktionale Komponenten enthalten, die wir zuvor für die Site definiert haben.
Für die Seite mit der Nachrichtenanzeige müssen zwei Datensatzgruppen definiert werden: eine Datensatzgruppe, die die eigentliche Nachricht enthält, und die andere mit einer Liste aller verfügbarer Antworten auf diese Nachricht.
Diese Definition ist wirklich einfach, und Sie können sie in einigen wenigen Minuten erledigen. Als Erstes definieren wird die Datensatzgruppe, das die anzuzeigende Nachricht enthält:
Das war's! Die vollständige Datensatzgruppe für die anzuzeigende Nachricht sehen Sie in Abbildung 16.12.
Abbildung 16.12: Stellen Sie sicher, dass Sie einen auf der Nachrichten-ID basierenden Filter einrichten.
Die zweite Datensatzgruppe (die alle Antworten auf die angezeigte Nachricht enthält) ist
fast identisch mit der eben angelegten Datensatzgruppe. Fügen Sie dafür eine weitere
Datensatzgruppe in Ihr Dokument ein. Jetzt muss der Filter jedoch etwas abgeändert
werden. Weil wir alle Nachrichten auswählen wollen, deren parentID
gleich der
Nachrichten-ID ist (als URL-Parameter übergeben), sollte der Filter dies berücksichtigen.
Abbildung 16.13 zeigt die Datensatzgruppe für die Antworten.
Abbildung 16.13: Für die zweite Abfrage muss nur der Filter geändert werden.
Es ist ganz einfach, diese Seite anzulegen - Sie wissen ja jetzt schon, wie man
Komponenten aus den definierten Datensatzgruppen in die Entwurfsansicht zieht.
Beachten Sie jedoch, dass Sie die Datensatzgruppe rsMessage
(für die Nachrichten), nicht
die Datensatzgruppe rsReply
(für die Antworten) verwenden müssen.
Die Verwaltung der Antwortanzeige ist etwas komplizierter, aber auch nichts Neues. Ich verwende für meine Seite einen einfachen wiederholten Bereich, der den Namen des Autors sowie das Thema für jede der Antworten angibt.
rsReply
) verwenden.
Achten Sie bei der Definition des wiederholten Bereichs unbedingt darauf, die richtige Datensatzgruppe auszuwählen. Wenn Sie die Datensatzgruppe auswählen, die die anzuzeigende Nachricht enthält, kann das Programm nicht korrekt ausgeführt werden und die Fehlersuche gestaltet sich schwierig.
Falls alles nach Plan gelaufen ist, sollte der Anzeigebildschirm fast fertig sein. Wechseln
Sie in den Live Data-Modus und geben Sie in der URL-Zeile die ID=2
ein, um zu sehen,
ob sowohl die Nachrichtenliste als auch die Antwortenliste angezeigt wird.
Jetzt wollen wir die Antwortenliste fertig stellen. Weil die Antworten einzeln aufgelistet werden, sollte es möglich sein, sie anzuklicken und zu einer Seite zu wechseln, die die gesamte Nachricht enthält, ähnlich wie es für die Hauptnachrichtenliste realisiert wurde.
Abbildung 16.14: Übergeben Sie die ID der Antworten zurück auf die Nachrichtenseite.
Für die Anzeige von Antworten sollten Sie nicht den existierenden URL- oder Formularparameter übergeben. Wenn Sie das tun, führt das zu mehreren ID=-Parametern für eine einzige URL. Das kann den Server verwirren und unerwartete Ergebnisse verursachen.
Damit sollten Sie in der Lage sein, auf den Link einer der Antworten zu klicken, um sie anzuzeigen.
Der letzte Schritt zur Realisierung der Funktionalität dieser Seite ist, das Löschen von
Nachrichten zu implementieren. Hoffentlich haben Sie beim Entwurf Ihres Bildschirms
diese Funktion berücksichtigt und ein Kennwortfeld sowie eine Löschen-Schaltfläche
eingefügt. Geben Sie Ihrem Formular einen Namen, den man sich leicht merken kann,
beispielsweise password
.
Das gewünschte Verhalten dieser Funktion ist, dass wenn ein Benutzer eine Nachricht löschen will, die von ihm selbst abgesetzt wurde, er das zugehörige Kennwort eingibt, auf die Löschen-Schaltfläche klickt und die Nachricht sofort aus der Datenbank entfernt wird. Sie wissen vielleicht noch, dass es ein Serververhalten gibt, das genau diesen Prozess größtenteils automatisieren kann.
Öffnen Sie die Palette Serververhalten und fügen Sie dem Dokument die Verhaltensweise Datensatz löschen hinzu. Konfigurieren Sie das Verhalten wie folgt:
index.asp
.
Nachdem Sie das Verhalten Löschen fertiggestellt haben, klicken Sie auf OK. Damit sind
Sie fast fertig - etwas fehlt noch. Wann prüft die Applikation, ob das Kennwort richtig
eingegeben wurde? Leider überhaupt nicht! Diesen Code müssen Sie dem Dokument
manuell hinzufügen. Öffnen Sie Ihren Quellcode und suchen Sie nach der SQL-
Anweisung DELETE
. Auf der ASP-Plattform sieht das ungefähr so aus:
' Die SQL-Anweisung delete erstellen
MM_editQuery = "delete from " & MM_editName &
" where " & MM_tableColumn & " = " & MM_recordId
Bearbeiten Sie diesen Code, um das Kennwort zu überprüfen, das von dem Formular übergeben wird:
' Die SQL-Anweisung delete erstellen
MM_editQuery = "delete from " & MM_editName &
" where " & MM_tableColumn & " = " & MM_recordId &
Request.Form("password") & "'"
Diese Änderung des ASP-Codes fügt dem auf dem Server ausgeführten SQL AND
password= Request.Form(password)
hinzu. Damit ist die Funktion delete
implementiert
- aber erst nach einigen Anpassungen des Codes. Wenn Sie den Code nicht manuell
bearbeiten wollen, gibt es eine alternative Methode, dieses Funktionsmerkmal
ausschließlich mit Serververhalten von UltraDev zu implementieren.
Statt den eingebetteten Code zu verändern, könnten Sie dem Dokument eine dritte Datensatzgruppe hinzufügen. Diese Datensatzgruppe führt das SQL aus:
SELECT * FROM message WHERE ID='varID' AND password='varPassword'
Die Datensatzgruppe muss im erweiterten Modus erstellt werden, wobei varID
auf den
Laufzeitwert von Request("ID")
und varPassword
auf Request("password")
gesetzt
werden müssen.
Nachdem diese Datensatzgruppe erzeugt wurde, können Sie dieselbe Verhaltensweise Datensatz löschen verwenden, die Sie bereits eingerichtet haben, aber Sie wählen den Datensatz jetzt aus dieser Datensatzgruppe. Die eigentliche Datensatzgruppe existiert nicht (weil sie mit keinen Datensätzen übereinstimmt), bevor nicht das Kennwort erfolgreich übertragen wurde. Sobald das Kennwort gesendet wird, wird außerdem die Verhaltensweise Datensatz löschen für diese Datensatzgruppe aufgerufen. Das erscheint auf den ersten Blick etwas seltsam, aber es ist machbar!
Ehrlich gesagt, der zweite Ansatz ist vorzuziehen, weil hier die gesamte Entwicklung innerhalb der UltraDev-Umgebung passiert. Seine Implementierung dauert jedoch länger, und wenn Sie vorhaben, alles so schnell wie möglich zum Laufen zu bringen, ist die manuelle Bearbeitung des Codes definitiv die schnellste Methode.
Von der Funktionalität her ist der Anzeigebildschirm für die Nachrichten fertig - aber es gibt zwei lose Enden, um die wir uns noch kümmern müssen, bevor wir das Fenster zum Erstellen von Nachrichten anlegen. Zunächst brauchen wir eine Möglichkeit, auf eine Nachricht zu antworten, und zweitens sollte es einen Link zurück zu der Hauptnachrichtenliste geben.
Nur einer der beiden Links ist außergewöhnlich - der Link zum Antwortbildschirm. In
diesem Link müssen wir die Nachrichten-ID der Nachricht übergeben, die wir gerade
lesen. Sie wird als parentID
der neuen Nachricht abgelegt - um damit anzuzeigen, dass es
sich um eine Antwort handelt. Fügen Sie jetzt einen Antwort-Link in Ihre
Nachrichtenanzeige ein, und gehen Sie nach den folgenden Schritten vor. Ich setze
voraus, dass die Seite zum Erstellen der Nachrichten Compose
heißt. Passen Sie die Namen
nach Bedarf an und berücksichtigen Sie diese Änderungen auch in der folgenden
Prozedur!
ID
in die Parameterliste ein.
Jetzt fügen Sie noch einen normalen Link (ohne dynamische Parameter) zurück zur Hauptnachrichtenliste ein. Damit bieten Sie dem Benutzer die Möglichkeit zurückzukehren, was sehr wichtig ist, wenn der Zweig der Site, in der Sie arbeiten, eine Sackgasse ist. Die endgültige Version des Bildschirms für die Nachrichtenanzeige sehen Sie in Abbildung 16.15.
Abbildung 16.15: Dem Anzeigebildschirm wurden alle erforderlichen Funktionsmerkmale hinzugefügt.
Das letzte Teil des Puzzles ist der Bildschirm zum Erstellen von Nachrichten - und gleichzeitig das einfachste. Es handelt sich dabei um ein Formular, in das der Benutzer seine Nachricht eingibt, um sie an den Server zu senden. Wir brauchen die folgenden Felder:
iconURL
ausgewählt werden kann.
hidden
abzulegen. Wenn Sie wollen, dass die Nachrichten unmittelbar nach dem Absetzen
angezeigt werden, setzen Sie dieses Feld auf 0, andernfalls auf 1.
Beim Anlegen des Formulars sollten Sie alles so einfach wie möglich halten, indem Sie
Ihren HTML-Feldern dieselben Namen wie den Datenbankfeldern geben. Stellen Sie
auch einen Namen für das eigentliche Formular bereit. Auf diese Weise wird es ganz
einfach, Dinge zu vergleichen. Wenn Sie dies für ein Sicherheitsrisiko halten, können Sie
die Namen selbstverständlich auch ändern. Abbildung 16.16 zeigt den Entwurf für meine
Seite, compose.asp
.
Abbildung 16.16: Das Formular zum Erstellen von Nachrichten
Die Bilder für die Optionsfelder sind möglicherweise der einzige verwirrende Faktor bei diesem Entwurf. Hier die Tabelle mit diesen Informationen über meine Seite:
<table width="100%" border="0" cellspacing="0" cellpadding="2">
<tr>
<td>
<input type="radio" name="URLicon" value="icon1.jpg">
<img src="icon1.jpg" width="15" height="15"> </td>
<td>
<input type="radio" name="URLicon" value="icon2.jpg">
<img src="icon2.jpg" width="15" height="15"> </td>
<td>
<input type="radio" name="URLicon" value="icon3.jpg">
<img src="icon3.jpg" width="15" height="15"> </td>
</tr>
<tr>
<td>
<input type="radio" name="URLicon" value="icon4.jpg">
<img src="icon4.jpg" width="15" height="15"> </td>
<td>
<input type="radio" name="URLicon" value="icon5.jpg">
<img src="icon5.jpg" width="15" height="15"> </td>
<td> </td>
</tr>
</table>
Einfach nur mehrere Optionsfelder, die alle den Namen URLicon
haben (um eine logische
ODER-Bedingung zwischen den Optionen zu realisieren), wobei das value
-Attribut des
Bildes so gesetzt wird, dass es in der Nachrichtenliste angezeigt wird.
Sie brauchen zwei verborgene Felder auf Ihrem Formular. Das erste, hidden
(ein
passender Name für ein verborgenes Feld, oder?), kann manuell in das HTML eingefügt
werden, oder Sie verwenden das Formularelement Verstecktes Feld und den
Eigenschafteninspektor, um es einzurichten, etwa wie folgt:
<input type="hidden" name="hiddenField" value="0">
Das zweite verborgene Feld (parentID
) ist etwas komplizierter zu konfigurieren (aber nur
ein bisschen). Um dem Dokument dieses Feld hinzuzufügen, müssen Sie eine neue
Datenbindung für eine Anforderungsvariable einfügen. Öffnen Sie die Palette
Datenbindungen und gehen wie folgt vor:
ID
in den Konfigurationsbildschirm für die Bindung der
Anforderungsvariablen ein. Dies ist der URL-Parameter, auf den wir zugreifen müssen.
Damit haben Sie direkten Zugriff auf den ID-Parameter, der der Seite übergeben wird. Sie können dies nutzen, um das zweite verborgene Feld zu definieren:
value
.
value
-Felds und auf den Blitz, um es zu der
Anforderungsvariablen zu binden.
Die Attributansicht der Eigenschaftenpalette für dieses verborgene Feld sollte aussehen wie in Abbildung 16.17 gezeigt.
Abbildung 16.17: Die Bindungen für Ihr verborgenes Feld sollten wie hier gezeigt aussehen.
Das ist alles! Das Formular ist fertig, um für die Verhaltensweise Datensatz einfügen genutzt zu werden. Nur noch ein paar Minuten!
Um die Nachricht zu speichern, fügen Sie sie als Datensatz in die Datenbank ein. Für das Formular wurde bereits alles konfiguriert, aber es muss noch ein letztes Serververhalten eingefügt werden.
Öffnen Sie die Palette Serververhalten und fügen Sie die Verhaltensweise Datensatz einfügen in das Dokument ein. Wählen Sie die Verbindung und die zu aktualisierende Tabelle. Im Abschnitt Werte abrufen aus der Konfiguration wählen Sie das Formular aus, das zusammen mit der neuen Nachricht gesendet wird, und vergleichen dann die Formularelemente mit dem Spaltennamen und dem Datentyp. Als letzten Schritt setzen Sie Nach dem Einfügen hierher gehen auf die Hauptnachrichtenanzeige. Abbildung 16.18 zeigt die vollständige Konfiguration für die Verhaltensweise Datensatz Einfügen.
Als letzten Schritt gehen Sie zur Hauptnachrichtenliste zurück und fügen einen Link zum Bildschirm für das Erstellen der Nachrichten ein, sodass die Nachrichten auch geschrieben werden können, ohne dass der Benutzer auf eine bereits existierende Nachricht antworten muss. Dazu verwenden Sie einen ganz einfachen Link, dem keine Parameter übergeben werden müssen.
Das war's. Wir sind fertig! Damit haben Sie ein vollfunktionales Nachrichten-Board.
Abbildung 16.18: Jetzt fügen Sie noch die Möglichkeit ein, Datensätze in die Datenbank einzufügen.
Wir haben heute eine Menge Stoff behandelt und eine relativ komplexe Applikation entwickelt. Dazu wurden viele der verfügbaren Serververhalten für die Nachrichtenliste und die Anzeigebildschirme verwendet. Hoffentlich haben Sie jetzt eine bessere Vorstellung davon, wie die Serververhalten kombiniert werden können und wie sie zusammenarbeiten, um komplexe Webprogramme zu erstellen.
Ich habe heute einen anderen Ansatz verwendet, aber dennoch wurde eine wichtige Einschränkung von UltraDev gezeigt. Es ist nicht möglich, mehrere Attribute zu kombinieren, um einen Datensatz zum Löschen auszuwählen. In einem früheren Kapitel habe ich eine speziell entworfene Datensatzgruppe verwendet, um nur die Datensätze auszuwählen, die gelöscht werden sollen. In diesem Fall ist es sich nicht erforderlich, sich über das Problem mit den Mehrfachattributen Gedanken zu machen, deshalb habe ich den SQL-Code direkt bearbeitet.
Falls in UltraDev ein Problem auftaucht, überlegen Sie, ob eine Kombination anderer Serververhalten Ihnen helfen kann. Falls nicht, müssen Sie den Quellcode manuell bearbeiten.
Frage:
Warum ist das Suchen so langsam?
Antwort:
Wenn Sie über mehrere unterschiedliche Felder in mehreren unterschiedlichen
Datensätzen suchen, kann die Suche eine Weile dauern. Sie können ein Popup-
Menü bereitstellen, in dem das Feld ausgewählt wird, das durchsucht werden soll.
Frage:
Wie moderiert der Moderator?
Antwort:
Der Moderator aktualisiert die Datensätze in der Datenbank und schaltet hidden
auf 0 oder 1, abhängig davon, ob er einen Datensatz anzeigen oder verbergen will.
Frage:
Wie behebe ich am besten das Problem, Datensätze basierend auf zwei Parametern
löschen zu müssen?
Antwort:
Bisher wurden in diesem Buch zwei Techniken vorgestellt. Wenn Sie
Programmierer sind und sich mit der Bearbeitung von Code auskennen, sollten
Sie diesen Ansatz wählen - andernfalls definieren Sie eine weitere
Datensatzgruppe, um die Datenmenge zu begrenzen, die die Verhaltensweise
Datensatz Löschen verarbeiten kann.
Frage:
Wie kann ich die Site erweitern?
Antwort:
Es gibt viel Raum für Verbesserungen - Datumsangaben für Nachrichten,
Bearbeitung von Nachrichten - all diese Funktionsmerkmale können Sie mit
Ihrem jetzigen Wissen bereits realisieren.
Der Workshop dient dazu, den gelesenen Stoff mithilfe von gezielten Fragen und Übungen zu vertiefen. Die Antworten finden Sie in Anhang A, »Quiz-Antworten«.
parentID
verwendet?
blob
?
Hidden
als verborgenes
Feld auf dem Formular?
hidden
für Nachrichten umzuschalten oder störende
Nachrichten zu entfernen. Momentan muss dies direkt in der Datenbank
vorgenommen werden - nicht die benutzerfreundlichste Methode, die Dinge zu
handhaben.