Article Page
Gut, aber jetzt wollen wir ja schließlich auch jeden Artikel anzeigen. Dazu müssen wir eine neue Page erstellen. hierzu verwenden wir wieder das webtek script in /WebTek/app/Wiki:
./webtek Page Article
So, dieses script erzeugt uns jetzt eine Datei Article.pm im Verzeichnis Page und ein Verzeichnis Article im Verzeichnis templates. Wir gehen jetzt gleich mal in Page/Article.pm und ändern den Inhalt wie folgt.
package Wiki::Page::Article;
use strict;
use WebTek::Globals;
use Wiki::Model::Article
'accessor' => 'article',
'macros' => [ 'title', 'text', 'create_time', 'modify_time' ];
use WebTek::Parent qw( Wiki::Page::Root );
# ---------------------------------------------------------------------------
# constructors
# ---------------------------------------------------------------------------
sub new_for_title :Path([^/]+) {
my $class = shift;
my $title = shift;
# zuerst erstellen wir einmal den Artikel für den übergebenen titel
my $article = Wiki::Model::Article->find_one('title' => $title);
# wenn wir keinen artikel für den path finden koennen returnen wir undef
return undef unless $article;
# wenn wir einen artikel gefunden haben, dann erstellen wir die page
return $class->new_for_article($article);
}
sub new_for_article {
my $class = shift;
my $article = shift; # Wiki::Model::Article
my $self = $class->new;
$self->path($article->title);
$self->article($article);
return $self;
}
1;
Ok... was passiert da? als Erstes importieren wir das Model Article in diese Page. Das geschied mit:
use Wiki::Model::Article
'accessor' => 'article',
'macros' => [ 'title', 'text', 'create_time', 'modify_time' ];
Hier passieren zwei Dinge: zum Einen wird eine Methode article in /Page/Article.pm erzeugt, mit welcher wir das model setzen und erhalten können. Diese wird zum Bsp. gleich in new_for_article verwendet. Zum Anderen werden für diese Page vier Macros angelegt, nämlich title, text, create_time und modify_time.
Dann geht es weiter zum Konstruktor new_for_title. Hier geben wir ein Path Attribute an, welches uns definiert für welchen Path diese Page erzeugt wird. In unserem Fall (mit der regular expression [^/]+, sollen alle Wörter (abgesehen von einem Slash) als gültig erkannt werden.
Path
Was ist ein Path. Ein Path ist im wesentlich ein Teil von der Url für diesesn Request. wenn wir jetzt z.B
http://localhost/wiki/first
in unseren Browser eintippen, dann wäre zuerst mal
/wiki/first
der Path. Aber WebTek muss ja jetzt rausfinden, welche Seite für diesen Path angezeigt werden soll. Das passiert wie folgt:
WebTek nimmt die Root Page und fragt diese dann: was ist deine Location (hier, wenn man nichts ändert die Location aus dem httpd.conf verwendet)?. In unserem Fall wäre das also /wiki. Ok, /wiki wird jetzt einmal vom Path weggenommen, und es bleibt uns /first übrig. Jetzt fragt WebTek die Root Page: welche Kinder hast du?. Und auf diese Frage hin kommt unsere Article Page zurück, da wir das in der Artikel Page ja so definiert haben mit:
use WebTek::Parent qw( Wiki::Page::Root );
Jetzt wird also unsere Article Page gefragt: für welchen Path bist du zuständig?, die möglichen Zuständigkeiten werden in allen Konstruktoren mit Path Attribute festgelegt. In unserem Fall ist das:
sub new_for_title :Path([^/]+) { ... }
da ja [^/]+ auf /first matched (der führende slash ( / ) darf nicht angegeben werden). Jetzt wird mit diesem Konstruktor die Artikle Page erzeugt (wobei der gematchte Path als Argument dem Konstuktor mitübergeben wird). Nachdem die Article Page erzeugt wurde, wird wiederum der gematchte Path vom Path weggenommen. Jetzt ist der Path leer. d.h. wir sind fertig und haben die Seite gefunden welche angezeigt werden soll (das ist immer die zuletzt erzeugte Page).
so jetzt erstellen wir noch das index.tpl für die Article Page in /WebTek/app/Wiki/templates/Article/index.tpl:
<h4><% title %></h4>
<% text %>
und schon sind wir fertig. jetzt können wir uns http://localhost/wiki/first gleich anschaun.
zurück weiter
|