package example_5;
use strict; # always a good idea to include these in your
use warnings; # modules
use base qw ( Example );
use Carp;
use Data::Dumper;
use CDBI::Example::example;
use Regexp::Common;
sub setup {
my $self = shift;
# -----------------------------------------------------------
# See example_1.pm for its comments regarding this section --
# they all apply equally well here.
# -----------------------------------------------------------
$self->run_modes(
[ qw (
show_user_table
add_user
process_add_user
edit_user
process_edit_user
delete_user
process_delete_user
make_navbar
)
]
);
}
sub edit_user {
my $self = shift;
my $errs = shift;
### ==================================================================
### Now, do what it takes to populate the template variables (a.k.a.
### TMPL_VARs) within the composed HTML::Template object
### ==================================================================
if ( length($self->query->param('uid')) ) {
$self->session->{refuid} = $self->query->param('uid');
}
$self->log_confess(" Couldn't get a refuid ") unless $self->session->{refuid};
my %tmplvars = (); # we'll use this to accumulate tmpl_var values
my $user = CDBI::Example::example::Users->retrieve
( $self->session->{refuid} );
$self->log_confess("Couldn't make a user") unless $user;
$tmplvars{'username'} = $self->query->param('username') || $user->username;
$tmplvars{'fullname'} = $self->query->param('fullname') || $user->fullname;
$tmplvars{'password'} = $self->query->param('password') || $user->password;
$tmplvars{'currently_username'} = $user->username;
$tmplvars{'currently_fullname'} = $user->fullname;
$tmplvars{'currently_password'} = $user->password;
$tmplvars{'FORM_NAME'} = 'add_user';
$tmplvars{'FORM_METHOD'} = 'POST';
$tmplvars{'FORM_ACTION'} = $self->query->url;
$tmplvars{'FORM_ACTION'} .= $ENV{'PATH_INFO'} if $ENV{'PATH_INFO'};
my $template = $self->template->load;
$template->param(\%tmplvars);
$template->param($errs) if $errs;
### ==================================================================
### /end of populating HTML::Template TMPL_VARs
### ==================================================================
$template->param
(
webapp => $self,
run_mode_tags => {
COMEFROMRUNMODE => [ COMEFROM => $self->get_current_runmode ],
CURRENTRUNMODE => [ CURRENT => $self->get_current_runmode ],
SUBMITTORUNMODE => [ SUBMITTO => 'process_edit_user' ],
}
);
return $template->output;
}
sub _add_edit_user_profile {
my $self = shift;
return {
required => [ qw ( username fullname password ) ],
constraints => {
username => sub {
my ($user) = CDBI::Example::example::Users->search
( username => $self->query->param('username') );
if ( $user ) {
if ( $user->uid == $self->session->{uid} ) {
return 0;
} else {
return 1;
}
} else {
return 1;
}
}
},
msgs => {
any_errors => 'some_errors',
prefix => 'err_',
},
};
}
sub process_edit_user {
my $self = shift;
# ------------------------------------------------------------------
# Make sure that the form validates correct, which is partially
# a function of whether or not the required fields are there, and
# partially a matter of not being allowed to use the same username
# as one that already exists in the database
# ------------------------------------------------------------------
my ($errs, $error_page) = $self->check_rm('edit_user',
'_add_edit_user_profile');
return $error_page if $error_page;
# ------------------------------------------------------------------
# ==================================================================
# Looks like the form submission is okay, so update the $user in
# the database
# ==================================================================
my $user = CDBI::Example::example::Users->retrieve
( $self->session->{refuid} );
$self->log_confess(" Couldn't make a user ") unless $user;
$user->username( $self->query->param('username') ) unless
$user->username() eq $self->query->param('username');
$user->fullname( $self->query->param('fullname') ) unless
$user->fullname() eq $self->query->param('fullname');
$user->password( $self->query->param('password') ) unless
$user->password() eq $self->query->param('password');
$user->update();
# ==================================================================
$self->session->{refuid} = undef;
delete $self->session->{refuid};
return $self->show_user_table();
}
sub add_user {
my $self = shift;
my $errs = shift;
### ==================================================================
### Now, do what it takes to populate the template variables (a.k.a.
### TMPL_VARs) within the composed HTML::Template object
### ==================================================================
my %tmplvars = (); # we'll use this to accumulate tmpl_var values
$tmplvars{'FORM_NAME'} = 'add_user';
$tmplvars{'FORM_METHOD'} = 'POST';
$tmplvars{'FORM_ACTION'} = $self->query->url;
$tmplvars{'FORM_ACTION'} .= $ENV{'PATH_INFO'} if $ENV{'PATH_INFO'};
my $template = $self->template->load;
$template->param(\%tmplvars);
$template->param($errs) if $errs;
### ==================================================================
### /end of populating HTML::Template TMPL_VARs
### ==================================================================
$template->output
(
webapp => $self,
run_mode_tags => {
COMEFROMRUNMODE => [ COMEFROM => $self->get_current_runmode ],
CURRENTRUNMODE => [ CURRENT => $self->get_current_runmode ],
SUBMITTORUNMODE => [ SUBMITTO => 'process_add_user' ],
}
);
return $template->output;
}
sub process_add_user {
my $self = shift;
# ------------------------------------------------------------------
# Make sure that the form validates correct, which is partially
# a function of whether or not the required fields are there, and
# partially a matter of not being allowed to use the same username
# as one that already exists in the database
# ------------------------------------------------------------------
my ($errs, $error_page) = $self->check_rm('add_user',
'_add_edit_user_profile');
return $error_page if $error_page;
# ------------------------------------------------------------------
my $newuser = CDBI::Example::example::Users->create({
username => $self->query->param('username'),
fullname => $self->query->param('fullname'),
password => $self->query->param('password'),
});
return $self->show_user_table();
}
sub delete_user {
my $self = shift;
my %tmplvars = ();
$self->session->{'refuid'} = $self->query->param('uid');
my $refuser = CDBI::Example::example::Users->retrieve
(
$self->session->{'refuid'}
);
$tmplvars{'username'} = $refuser->username;
$tmplvars{'fullname'} = $refuser->fullname;
$tmplvars{'confirm_delete_user'} = $self->make_link
(
qs_args => {
rm => 'process_delete_user',
delete_p => 'yes'
}
);
$tmplvars{'reject_delete_user'} = $self->make_link
(
qs_args => {
rm => 'process_delete_user',
delete_p => 'no'
}
);
return $self->template->fill(\%tmplvars);
}
sub process_delete_user {
my $self = shift;
if ( $self->query->param('delete_p') eq 'yes' ) {
my $user = CDBI::Example::example::Users->retrieve
(
$self->session->{'refuid'}
);
$user->delete();
} elsif ( $self->query->param('delete_p') eq 'no' ) {
1;
} else {
$self->log_confess("Can't happen! ");
}
return $self->show_user_table;
}
sub show_user_table {
my $self = shift;
### ==================================================================
### Now, do what it takes to populate the template variables (a.k.a.
### TMPL_VARs) within the composed HTML::Template object
### ==================================================================
my %tmplvars = (); # we'll use this to accumulate tmpl_var values
$tmplvars{'add_link'} = $self->make_link
(
qs_args => {
rm => 'add_user',
}
);
my @users = CDBI::Example::example::Users->retrieve_all();
my @user_loop_rows = ();
foreach my $user ( @users ) {
my %loopvars = ();
$loopvars{'uid'} = $user->uid;
$loopvars{'uid_is_you'} = $user->uid == $self->session->{uid} ? 1 : 0;
$loopvars{'username'} = $user->username;
$loopvars{'fullname'} = $user->fullname;
$loopvars{'password'} = '******';
$loopvars{'edit_link'} = $self->make_link
(
qs_args => {
rm => 'edit_user',
uid => $user->uid,
}
);
if ( scalar(@users) != 1 && ! $loopvars{'uid_is_you'} ) {
$loopvars{'delete_link'} = $self->make_link
(
qs_args => {
rm => 'delete_user',
uid => $user->uid,
}
);
}
push @user_loop_rows, \%loopvars;
}
$tmplvars{'user_loop'} = \@user_loop_rows;
# ----------------------------------------------------------------
### ==================================================================
### /end of populating HTML::Template TMPL_VARs
### ==================================================================
return $self->template->fill(\%tmplvars);
}
1; # It's gotta be 1...