Benutzer anzeigen und editieren
So, jetzt gleich weiter zu der Seite mit welcher der Benutzer angezeigt, editiert oder gelöscht werden kann. Als erstes wieder:
./webtek Page User
Dann brauchen wir hier zwei Konstruktoren: new_for_nickname mit dem Path Attribute und new_for_user, und eine edit bzw. delete Action. Hier der dafür nötige Code. Ich erkläre hier nicht mehr viel, da diese Funktionen eh alle ähnlich aufgebaut sind:
package Wiki::Page::User;
use utf8;
use strict;
use WebTek::Globals;
use Wiki::Model::User
'accessor' => 'user',
'macros' => [
'nickname', 'firstname', 'email_address', 'lastname', 'address',
'city', 'country', 'language', 'create_time', 'modify_time'
];
use WebTek::Parent qw( Wiki::Page::UserList );
# ---------------------------------------------------------------------------
# constructors
# ---------------------------------------------------------------------------
sub new_for_nickname :Path([^/]+) {
my $class = shift;
my $nickname = shift;
my $user = Wiki::Model::User->find_one('nickname' => $nickname);
return undef unless $user;
return $class->new_for_user($user);
}
sub new_for_user {
my $class = shift;
my $user = shift; # Wiki::Model::User
my $self = $class->new;
$self->user($user);
$self->path($user->nickname);
return $self;
}
# ---------------------------------------------------------------------------
# actions
# ---------------------------------------------------------------------------
sub edit_check_access {
my $self = shift;
return 0 unless session->user;
return (session->user->id eq $self->user->id);
}
sub edit :Action {
my $self = shift;
if (request->is_post) {
$self->user->update(request->params('user'));
if (request->param('password')) {
$self->user->password(request->param('password'));
}
$self->user->modify_time(date('now'));
$self->user->save;
response->message('Benutzer geändert');
response->redirect($self->href);
}
}
sub delete_check_access { shift->edit_check_access }
sub delete :Action {
my $self = shift;
$self->user->delete;
session->user(undef);
response->message('Benutzer gelöscht');
response->redirect(request->path->UserList->href);
}
1;
Was hier neu ist, ist die edit_check_access und delete_check_access Funktion. Sobald eine solche Funktion definiert ist (der Funktionsname setzt sich zusammen aus dem Actionnamen und _ check_access), wird sie auch für die jeweilige Action aufgerufen, und somit kann überprüft werden, ob der Betrachter die nötigen Rechte für eine Action besitzt. Als erstes wird dort also überprüft, ob die Session einen User beinhaltet, sprich ob ein User eingeloggt ist, und wenn ja, ob dieser Benutzer auch der gleiche ist, wie der, der editiert werden soll.
Dann wird hier noch ein use utf8 verwendet. Dieses erlaubt uns Umlaute direkt im Perl Source Code zu schreiben (nicht vergessen, dass File auch UTF8 encoded abzuspeichern).
So jetzt noch die Templates. Als erstes mal das templates/User/index.tpl:
<h4>Benutzer <% nickname %></h4>
Vorname: <% firstname %><br />
Nachname: <% lastname %><br />
Adresse: <% address %><br />
Stadt: <% city %><br />
Email: <% email_address %><br />
Erstellt am: <% create_time %><br />
Geändert am: <% modify_time %><br />
<hr />
<% link
if="<% check_access action="edit" %>"
href="<% href action="edit" %>"
display="bearbeiten"
prefix="Benutzer "
%>
<% link
if="<% check_access action="delete" %>"
href="<% href action="delete" %>"
display="löschen"
prefix=", Benutzer "
%>
und dann noch das templates/User/edit.tpl:
<h4>Benutzer <% nickname %> bearbeiten</h4>
<% form %>
Passwort: <% input name="password" value="" %>
(das Passwort einfach leer lassen, wenn es nicht geändert werden soll)<br />
Vorname: <% input name="firstname" model="user" %><br />
Nachname: <% input name="lastname" model="user" %><br />
Email: <% input name="email_address" model="user" %><br />
Adresse: <% input name="address" model="user" %><br />
Stadt: <% input name="city" model="user" %><br />
Land: <% select
name="country"
values="at,de,uk"
displays="Österreich,Deutschland,England"
model="user"
%><br />
Sprache: <% select
name="firstname"
model="user"
values="de,en"
displays="deutsch,englisch"
%><br />
<% input type="submit" name="cancel" %>
<% input type="submit" name="save" %>
<% form_end %>
So, und als letzten Schritt verlinken wir noch die Usernamen in der Benutzerverwaltung mit den jeweiligen Usern. Hier verwenden wir ein wenig anderes Konzept, als bei den Artikeln aus dem Tutorial 1. Und zwar erstellen wir ein Template userlist.tpl welches dann im users Macro (in der UserList Page) verwendet wird. Also hier das templates/User/userlist.tpl:
<li><a href="<% href %>"><% nickname %></a></li>
und hier das neue users Macro in der UserList Page:
sub users :Macro {
my ($self, %params) = @_;
my $users = Wiki::Model::User->find;
foreach my $user (@$users) {
my $page = Wiki::Page::User->new_for_user($user);
print $page->render_template('userlist');
}
return "";
}
zurück weiter
|