| =WebTek::Engine=
====Beschreibung
Die Engine ist zuständig für die Konvertierung von der Url zu den Pageklassen, und für die Ausführung der Action in der richtigen Pageklasse.
====Methoden
* process_request($page) versucht mit der übergebenen Pageklasse dir Url zu parsen.
====wie wird jetzt eine URL in die Pageklassen umgewandelt?
Gut, wir nehmen jetzt mal:
* die Url ist /webtek/page1/edit,
* die Location im httpd.conf lautet /webtek,
* und als $page, die der Funktion process_request übergeben wird, verwenden wir die Root Page einer Applikation.
Jetzt wollen wir diese Url in eine Liste von Pageklassen umwandeln.
# als erstes wird jetzt mal die Location (von der übergebenen Root Page wird die Funktion LOCATION aufgerufen) von der Url weggenommen. d.h. in unserem Fall bleibt /page1/edit über.
# jetzt wird für die aktuelle Page (momentan noch die Root Page) die funktion child_paths() aufgefrufen. Diese Funktion liefert eine Liste, mit allen Informationen ihrer Kinder (wie für welche Url welche Page erzeugt werden soll). Diese Liste setzt sich zusammen aus den Klassen, die als Webtek::Parent die Root Page definiert haben, und deren Methoden mit dem Path Attribute.
# jetzt wird diese Liste durchgegangen. Nehmen wir weiter an, es wurde ein Kind (sagen wir die Page1) mit einer passenden Methode (mit dem Attribute :Path(/page1)) gefunden. Dann wird diese Page1 erzeugt, und anschließend wiederum die Url um /page1 (= der Teil der mit dem Path- Attribute matched) verkürzt. d.h. es bleibt noch /edit über.
# da jetzt eine Zeichenkette mit nur noch einem Slash verfügbar ist, wird jetzt zuerst getestet, ob es für die zuletzt erzeugte Page (bei uns die Page1), eine Methode mit dem Namen edit und dem Attribute Action verfügbar ist. Wenn ja, dann wird edit als die aufzurufende Action gemerkt. Wenn nicht, dann werden wiederum für die Page1 die Liste von child_paths() durchgegangen, ob es passende Kindpage für diese Url gibt. Wenn weder eine Action noch eine Kindpage gefunden wird, wird die Methode not_found in der zuletzt erstellten Page (bei uns Page1) aufgerufen.
# wenn der Url fertiggeparst, und keine Action gefunden wurde, dann wird einfach die default Action index verwendet.
Wie geht es jetzt weiter? Zuerst wird getestet, ob ein Formular abgeschickt wurde (mit response->is_post()), und ob der Cancel Button (mit response->param('cancel')) gedrückt wurde. Wenn das so ist, dann wird ein response->redirect($page->href()) gemacht, wobei $page die Page ist, die als letztes erzeugt wurde (in unserem fall ist das wiederrum die Page1). Falls der Cancel Button gedrückt wurde, wird die Methode process_request hier beendet.\\
Wenn nicht, dann wird die Action aufgefrufen:
* wenn die Url nicht geparst werden konnte, dann wird als Action not_found aufgerufen (wie oben schon erwähnt).
* für alle anderen Actions wird jetzt wird die Funktion page1->check_access($action) Methode aufgerufen. Wenn diese Funktion false zurückliefert, wird die Methode access_denied as Action aufgerufen.
* wenn check_access true geliefert hat wird jetzt die Action aufgerufen (in unserem fall wäre das page1->edit()). Die Action wird in einem eval Codeblock aufgerufen, und wenn in der Action ein Fehler passiert wird, werden folgende Fälle unterschieden.
** der Fehler hat den Typ WebTek::Exception::Redirect. Da das kein wirklicher Fehler ist, wird die Funktion process_request normal beendet.
** wenn der Fehler den Typ WebTek::Exception::ObjInvalid hat, dann wird weiter getestet, ob die Exception ein WebTek::Exception::ModelInvalid ist. Wenn ja, dann werden die Error- Information vom Model Objeckt in die Page kopiert. Desweiteren wird in response->message die Fehlermeldung aus dem Model geschrieben, und request->is_post() auf false gesetzt. Danach wird die Action erneut aufgerufen. Dadurch wird die gleiche Seite noch einmal, mit den Fehler Informationen, angezeigt. INFO: wenn diese Funktion nicht erwünscht ist, dann muss man in der Action den Fehler per Hand, sprich mit einem eval Codeblock, selbst abfangen.
** bei jeder anderen WebTek::Exception wird ein die WebTek::Exception->to_string() aufgeführt. Sprich der Fehler wird einfach dem [handler|Hander] übergeben.
** bei jedem anderen Fehler wird die $@ ausgeführt. Auch hier wird der Fehler wieder dem Handler übergeben.
|