Moin!
Leider kann ich mir auch überhaupt nicht vorstellen, wie ein Modul eine Ausgabe erledigen soll! So soll z.B eine Tabelle mit Lieferanten angezeit werden. Was genau für so een HTML-Ausgabemodul jetzt machen und welche Daten müßte man dem übergeben? Die Datenquelle ist eine Datenbank. Die erste Frage, wie wird die Ausgabe überhaupt ausgelöst?
Sinnvollerweise über ein Template.
Es bietet sich sowieso an, die gesamte User-Steuerung über Templates zu regeln (und zum Parsen von Templates brauchst du natürlich auch wieder ein Modul - ich bin mir nicht sicher, ob das nicht sogar das Basismodul dafür ist).
Denn irgendwo muß ja mal aufgeschrieben werden, was der Benutzer eigentlich so machen darf, und was passieren muß, wenn er das macht. Dafür gibts eigentlich nur zwei Methoden: Entweder hast du eine "Action-Scripting-Language", in der du Benutzerverhalten, dessen Möglichkeiten etc. notierst und auf die dann zu benutzenden Templates verweist, oder du integrierst diese Informationen gleich ins Template.
Klingt erstmal ziemlich abstrakt. Was gemeint ist: Du mußt definieren, dass irgendwo im Template ein {$HAUPTMENUE} integriert wird (das Hauptmenü hat natürlich auch sein Template, um dessen Aussehen zu bestimmen). Damit kannst du den Benutzer zwischen diversen Seiten wechseln lassen.
Dann brauchst du z.B. eine {$DATENBANKABFRAGE:Auswahldialog}, welches einen Standard-Auswahldialog für eine gleich zu beginnende Datenbankabfrage generiert (natürlich mit seinem eigenen Template). Vielleicht hast du gewisse Standard-DB-Abfragen wie irgendeine TOP-10 mittels {$DATENBANKABFRAGE:Select-TOP-10-from-Artikelverkauft}.
Natürlich müssen Templates "programmierbar" sein, also brauchst du irgendeine {$IF} ... {$ELSE} ... {$ENDIF}-Methode, um z.B. beim ersten Seitenaufruf den Auswahldialog und beim zweiten Seitenaufruf die Datenbankabfrage zu generieren.
Was noch zu überlegen ist: Die Templates entstehen natürlich nicht aus dem Nichts heraus und machen mal eben, sondern dein Framework (schon wieder so ein schönes Wort) muß aus den Usereingaben der vorhergehenden Seiten (ob mit Sessions oder durch Auswertung der Formulareingaben) eine Umgebung herstellen, die deine Templates benutzen können, also z.B. alle Formularvariablen in einem Array $POST bzw. $GET zur Verfügung stellen - oder, weils vielleicht einfacher ist, in entpackten Variablen $username, $strasse, $tabelle etc. (also im Prinzip das, was in PHP mit register_globals = on passiert).
Bedenke: Ich meine _nicht_, dass du die Templates als PHP-Seite programmieren sollst! Du sollst einen Parser schreiben (z.B. in PHP), der das Template einliest, die Variablenwerte ersetzt, die IF-Abfragen versteht, die eingebundenen Module aktiviert und befragt, und das Resultat dann als Seitenergebnis an den Browser schickt.
Ich sage mal ich habe eine Startseite, mit einem Link auf "Lieferantenübersicht". Wenn man auf den Link klickt soll sich eien neue Seite im selben Layout öffnen, mit der Überschrift "Lieferantenübersicht" und einer HTML-Tabelle mit allen Lieferanten alphabetisch sortiert und mit je einem Link versehen um Details zu erfahren.
Ok, und das soll hinter den Kulissen passieren: Wenn du den Link klickst, wird zwar die URL "/lieferanten/uebersicht.html" angefragt, diese URL wird aber intern von immer demselben Skript entgegengenommen und ausgewertet. Anscheinen soll das Template "/lieferanten/uebersicht" in Aktion treten. In diesem Template ist (neben etwas Design, was für die Funktion natürlich unwichtig ist) primär nur gespeichert, welche Datenbank wie abgefragt werden soll und wie das Abfrageergebnis aussehen soll (und dafür hast du entweder ein {$WHILE}...{$ENDWHILE}-Konstrukt, oder ein externes Template, welches pro Datensatz benutzt wird).
Soll ich alle Daten die ich in der Tabelel ausgeben will aus der DB-Klasse als Array ausgeben, und diesen Array dann an die Ausgabe-Klasse übergeben, nur was nehme ich dann für Überschriften? Die originalen Datenbank-Spaltennamen sind nicht immer so der Hit, und bestimmte Zahlen wie Preise würde ich auch gerne vorher noch formatieren! Wie sollte man das machen? Vor allem, wenn ich den Inhalt der Seite vielleicht etwas strukturiert z.B. in einer verschachtelten Tabele augeben möcte, wie bilde ich das mit so einer Ausgabe-Klasse ab?
Mit vernünftigen Direktiven im Template bzw. Formatierungsparametern kannst du entsprechende Module ansprechen, die dir diese Arbeit vor Ort abnehmen.
Beispiel: {$PREIS(0,00)} könnte z.B. den Preis auf zwei Nachkommastellen mit Nullen auffüllen und weitere Nachkommastellen abschneiden. Oder du benutzt {$PREIS:10:2} (TurboPascal-Style): Preis soll in ein 10 Zeichen breites Feld passen (rechtsbündig ausgerichtet, wenn der Preis weniger Zeichen hat) und zwei Nachkommastellen besitzen.
Das mit der Datenbank habe ich inzwiwchen so mehr oder weniger verstanden, da bekomme ich das schon hin. Probleme bereitet mir vor allem die Ausgabe, und auch das Basismodul weiß ich nicht so Recht was das soll.
Die Ausgabe wird durch die Templates gesteuert (also der konkrete HTML-Code). Das Basismodul ist für das Anschmeißen der Ausgabe in den entsprechenden Modulen zuständig und nimmt alle Benutzereingaben entgegen und stellt sie den Modulen in einer Umgebung zur Verfügung (damit man sie z.B. in Templates ansprechen kann).
Und auch die Module für Zusatzfunktionen wie den "Fragebogengenerator" weiß ich nict so recht. Was ich weiß ist inzwischen das ich hierfür eine Extra-Klasse verwende, die z.B. Methoden enthält um die komplette Menü-Struktur zu ermitteln, oder die Rechte festzulesgen. Aber mir fehlt noch eine Idee dafür, wie ich die eigentliche Funktionalität einbinde, also wie ich es machen soll, dass halt beim Klicken auf einen entsprechenden Menü-Eintrag auch eine HTML-Seite ausgegeben wird, das Aktionen ausgeführt werden können, das geht IMHO nicht mit der einen einzigen Klasse, oder? Oder wenn ich Aktionen ausführe, dann muß ich ja auf GET/POST Parameter reagieren, wo mache ich das dann genau?
Der Fragebogengenerator besteht aus zwei Teilen: 1. die passenden Templates, und 2. ein Modul mit den dazugehörigen Funktionen.
Was ist schlecht an Sessions? Bisher bräuchte ich sie nicht, hätte aber den Vorteil, das ich ganze Objekte in der Session speichern kann, so könnte ich z.B. Basisdaten wie root_path, menu_array... die ich alle immer wieder neu aus verschiedenen Dateien generieren müßte, bei jedem Seitenaufruf, könnte die dann in einem Objekt in der Session speichern und müßte das ganze nur einmal ermitteln. Wobei, ob der Server jetzt eine Session-Datei öffnet oder ich eine andere ist ja auch fast egal, oder?
An Sessions ist nichts sonderlich schlecht. Nur muß man sich entscheiden: Entweder braucht man sie wirklich - dann aber bitte durchgehend und überall. Oder man braucht sie nicht. Die meisten Webprojekte brauchen sie nicht.
PS: Mozilla ist _G_E_N_I_A_L_ !!! Ich wollte gerade meinen PC aus dem Fenster werfen, nachdem ich diesen Beitrag eben in die die Zwischenablage kopieren wollte, binn nach dem markieren aber irgendwie auf [return] gekommen - alles war weg. Nachdem ich mich wieder beruhugt hatte, aber ich aus Frust einfach mal in das Menü "bearbeiten" geguckt -> da stand doch tatsächlich "rückgängig", und siehe da, der Beitrag war noch da! PERFEKT!
Opera kann das aber auch. :-P Mozilla hat mit einigen Versionen Probleme damit.
- Sven Rautenberg
Diese Signatur gilt nur am Freitag.