intro wiki download guestbook contact

WebTek::Parent und Path Attribute

Mit WebTek::Parent kann man festlegen, welche Seiten von welchen Unterseiten sind. Aber was sind jetzt Unterseiten von Seiten:

Also nehmen wir jetzt mal den Pfad:


/users/max

Wenn wir diese Url (=Pfad) aufrufen, dann wollen wir die Seite über den Benutzer max anzeigen. Wenn wir nur /users eintippen, wollen wir eine Liste aller Benutzer anzeigen. Damit wir diese Funktionalität bekommen, erzeugen wir zwei Pages mit:


./webtek Page UserList
./webtek Page User

Jetzt setzten wir die User Page als Unterseite von UserList. Unterseite bedeutet, dass die Page weiter rechts im Pfad ist. Wir schreiben also in unsere User Page:


use WebTek::Parent qw( MyApp::Page::UserList );

Damit jetzt aber die Pages auch erzeugt werden können, brauchen wir natürlich Konstruktoren, und zwar welche mit dem Path Attribute. In unserem Fall würde der Konstruktor für die UserList so aussehen:


sub new_for_userlist :Path(users) { ... }

und für User so:


sub new_for_username :Path([^/]+) { ... }

wobei die Regular Expression [^/]+ einfach alle wörter bis zum nächsten Slash / matched.

Welche Möglichkeiten gibt es mit dem Path Attribute

Als erstes, man kann mehr als einen Path pro Konstruktor definieren. z.B.


sub new_for_inbox :Path(inbox) :Path(eingang) { ... }
sub new_for_search: Path(search) :Path(suche) { ... }

Desweiteren kann man in einer Page natürlich mehr als einen Konstruktor haben. Aber was passiert jetzt wenn mehr als ein Konstruktor passen würde. wir haben z.B folgende Konstruktoren:


sub new_for_foo :Path(foo) { ... }
sub new_for_foo2 :Path(foo2) { ... }
sub new_for_all :Path([^/]+) { ... }

Wenn wir jetzt den Path foo haben, würden hier zwei (der 1. und 3.) Konstruktoren matchen. Bei dem Path foo2 würden der 2. un 3. matchen. Noch schlimmer wird es, wenn es mehr als nur eine Page auf der gleichen Ebene gibt (z.b: die UserList Page hat nicht nur die User Page als Kind, sondern auch noch andere). Damit hier eindeutig geregelt ist, welcher Konstruktor zum Zug kommt gibt es folgende Regeln:

  • die höchste Priorität hat der Konstruktor, welcher die meisten plain Buchstaben (a-zA-Z0-9) am anfang stehen hat.
  • wenn zwei oder mehr Konstruktoren die gleiche Priorität haben, wir die Reihenfolge, nach welcher die Konstruktoren im Code definiert sind, verwendet.
  • als letztes Problem muss aber hier noch angemerkt werden, daß wenn mehr als eine Child Page existiert, die Reihenfolge dieser nicht definiert ist. Wenn es dabei zu einem Problem kommt, muss in der jeweiligen Parent Page die Methode child_paths überschrieben werden.

Die Reihenfolge mit welcher die Path Konstruktoren aufgerufen werden kann man ganz bequem in der _info Action nachschaun. Was die _info Action ist, wird kurz in der WebTek::Page erklärt.