fixes and added www_cleanup forced last step
This commit is contained in:
parent
8cc6ecb30d
commit
fe97e9c510
4 changed files with 125 additions and 59 deletions
|
|
@ -13,15 +13,17 @@ WebGUI::Wizard -- Generate wizards
|
||||||
|
|
||||||
use base 'WebGUI::Wizard';
|
use base 'WebGUI::Wizard';
|
||||||
|
|
||||||
sub _get_steps { [qw( step1 finish )] }
|
sub _get_steps { [qw( step1 )] }
|
||||||
|
|
||||||
|
# Show a form for the first step
|
||||||
sub www_step1 {
|
sub www_step1 {
|
||||||
my ( $self ) = @_;
|
my ( $self ) = @_;
|
||||||
return $self->getFormStart
|
my $f = $self->getForm; # Get a WebGUI::HTMLForm
|
||||||
. '<input type="text" name="user" />'
|
$f->text( name => "user" );
|
||||||
. $self->getFormEnd;
|
return $f->print;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Process the form for the first step
|
||||||
sub www_step1Save {
|
sub www_step1Save {
|
||||||
my ( $self ) = @_;
|
my ( $self ) = @_;
|
||||||
if ( my $user = $self->session->form->get('user') ) {
|
if ( my $user = $self->session->form->get('user') ) {
|
||||||
|
|
@ -33,8 +35,10 @@ WebGUI::Wizard -- Generate wizards
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub www_finish {
|
# Override cleanup to provide a friendly message
|
||||||
|
sub www_cleanup {
|
||||||
my ( $self ) = @_;
|
my ( $self ) = @_;
|
||||||
|
$self->cleanup;
|
||||||
return "Thank you! " . $self->get('user');
|
return "Thank you! " . $self->get('user');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -48,11 +52,14 @@ WebGUI shows the first step's form (in the synopsis above, step1 / www_step1 ).
|
||||||
|
|
||||||
Once the user completes the form, the www_step1Save subroutine is run. If an
|
Once the user completes the form, the www_step1Save subroutine is run. If an
|
||||||
error is returned, the user is shown the error and the same form again.
|
error is returned, the user is shown the error and the same form again.
|
||||||
Otherwise, the wizard continues to the next step (finish).
|
Otherwise, the wizard continues to the next step.
|
||||||
|
|
||||||
|
After all the steps in the wizard are complete, the wizard runs www_cleanup
|
||||||
|
to clean up after the wizard and return the user to their previous page.
|
||||||
|
|
||||||
All parameters gathered by the wizard are saved between page loads into
|
All parameters gathered by the wizard are saved between page loads into
|
||||||
the user's session scratch. Only by restarting the wizard will their progress
|
the user's session scratch. Only by finishing or restarting the wizard will
|
||||||
be lost.
|
their progress be lost.
|
||||||
|
|
||||||
=head1 METHODS
|
=head1 METHODS
|
||||||
|
|
||||||
|
|
@ -89,6 +96,33 @@ sub _get_steps {
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
=head2 canView ( )
|
||||||
|
|
||||||
|
Returns true if the current user is allowed to view this wizard. You should
|
||||||
|
override this.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub canView {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
=head2 cleanup ( )
|
||||||
|
|
||||||
|
Remove any leftovers after the wizard is finished
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub cleanup {
|
||||||
|
my ( $self ) = @_;
|
||||||
|
$self->session->scratch->delete( $self->getCacheKey );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
=head2 dispatch ( )
|
=head2 dispatch ( )
|
||||||
|
|
||||||
Dispatch the request to the correct step(s). Thaw the user's params and freeze
|
Dispatch the request to the correct step(s). Thaw the user's params and freeze
|
||||||
|
|
@ -117,18 +151,24 @@ sub dispatch {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
my $step = $self->getNextStep;
|
my $step = $self->getNextStep;
|
||||||
$self->session->log->info( "Showing next step: " . $step );
|
if ( $step ) {
|
||||||
$self->setCurrentStep( $step );
|
# Not done, run the next step
|
||||||
my $formSub = $self->can( 'www_' . $step );
|
$self->session->log->info( "Showing next step: " . $step );
|
||||||
my $output = $formSub->($self);
|
$self->setCurrentStep( $step );
|
||||||
$self->freeze;
|
my $formSub = $self->can( 'www_' . $step );
|
||||||
return $self->wrapStyle( $output );
|
my $output = $formSub->($self);
|
||||||
|
$self->freeze;
|
||||||
|
return $self->wrapStyle( $output );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
# We're done, run the cleanup
|
||||||
|
return $self->wrapStyle( $self->www_cleanup );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
# Starting over
|
# Starting over
|
||||||
$self->{_params} = {};
|
$self->cleanup;
|
||||||
$self->freeze;
|
|
||||||
my $step = $self->_get_steps->[0];
|
my $step = $self->_get_steps->[0];
|
||||||
$self->setCurrentStep( $step );
|
$self->setCurrentStep( $step );
|
||||||
$self->session->log->info( "Starting wizard: " . $step );
|
$self->session->log->info( "Starting wizard: " . $step );
|
||||||
|
|
@ -149,7 +189,7 @@ Save the current params to long-term storage.
|
||||||
|
|
||||||
sub freeze {
|
sub freeze {
|
||||||
my ( $self ) = @_;
|
my ( $self ) = @_;
|
||||||
$self->session->scratch->set( $self->getCacheKey, JSON->new->encode( $self->{_params} ) );
|
$self->session->scratch->set( $self->getCacheKey, JSON->new->encode( $self->{_params} || {} ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
@ -212,7 +252,7 @@ sub getForm {
|
||||||
my ( $self, $step ) = @_;
|
my ( $self, $step ) = @_;
|
||||||
$step ||= $self->getCurrentStep;
|
$step ||= $self->getCurrentStep;
|
||||||
my $form = WebGUI::HTMLForm->new( $self->session,
|
my $form = WebGUI::HTMLForm->new( $self->session,
|
||||||
action => '?op=wizard;wizard_class=' . blessed( $self ) . ';wizard_step=' . $step,
|
action => $self->getStepUrl( $step ),
|
||||||
);
|
);
|
||||||
return $form;
|
return $form;
|
||||||
}
|
}
|
||||||
|
|
@ -237,6 +277,23 @@ sub getNextStep {
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
=head2 getStepUrl ( step )
|
||||||
|
|
||||||
|
Get the URL to go to a specific step. Only used when there is no processing
|
||||||
|
to do.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub getStepUrl {
|
||||||
|
my ( $self, $step ) = @_;
|
||||||
|
return unless $step;
|
||||||
|
return $self->session->url->page(
|
||||||
|
'op=wizard;wizard_class=' . (blessed $self) . ';wizard_step=' . $step
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
=head2 session ( )
|
=head2 session ( )
|
||||||
|
|
||||||
Get the WebGUI::Session object
|
Get the WebGUI::Session object
|
||||||
|
|
@ -305,4 +362,23 @@ sub wrapStyle {
|
||||||
return $output;
|
return $output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
=head2 www_cleanup ( )
|
||||||
|
|
||||||
|
Clean up after the user, removing the variables, and return them to their
|
||||||
|
previous place.
|
||||||
|
|
||||||
|
NOTE: If you override this, you must remember to call C<cleanup> manually!
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub www_cleanup {
|
||||||
|
my ( $self ) = @_;
|
||||||
|
|
||||||
|
$self->cleanup;
|
||||||
|
$self->session->http->setRedirect( $self->session->url->page );
|
||||||
|
return "redirect";
|
||||||
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,6 @@ sub _get_steps {
|
||||||
return [ qw(
|
return [ qw(
|
||||||
pickStyle
|
pickStyle
|
||||||
chooseContent
|
chooseContent
|
||||||
finalize
|
|
||||||
)
|
)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
@ -424,20 +423,5 @@ sub www_chooseContentSave {
|
||||||
return;
|
return;
|
||||||
} ## end sub www_chooseContentSave
|
} ## end sub www_chooseContentSave
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
=head2 www_finalize ( $output )
|
|
||||||
|
|
||||||
Redirect the user to to the home page
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
sub www_finalize {
|
|
||||||
my ($self) = @_;
|
|
||||||
my $session = $self->session;
|
|
||||||
$session->http->setCacheControl("none");
|
|
||||||
$session->http->setRedirect( $session->url->gateway );
|
|
||||||
return "redirect";
|
|
||||||
}
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ sub _get_steps {
|
||||||
companyInformation
|
companyInformation
|
||||||
siteStats
|
siteStats
|
||||||
defaultStyle
|
defaultStyle
|
||||||
finalize
|
|
||||||
)];
|
)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -375,19 +374,20 @@ sub www_defaultStyleSave {
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
=head2 www_finalize ( )
|
=head2 www_cleanup ( )
|
||||||
|
|
||||||
Give the user a choice to do the Home Page wizard
|
Give the user a choice to do the Home Page wizard
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
sub www_finalize {
|
sub www_cleanup {
|
||||||
my ( $self ) = @_;
|
my ( $self ) = @_;
|
||||||
my $session = $self->session;
|
my $session = $self->session;
|
||||||
my $form = $session->form;
|
my $form = $session->form;
|
||||||
$session->http->setCacheControl("none");
|
$session->http->setCacheControl("none");
|
||||||
my $i18n = WebGUI::International->new( $session, "WebGUI" );
|
my $i18n = WebGUI::International->new( $session, "WebGUI" );
|
||||||
|
|
||||||
|
$self->cleanup;
|
||||||
# Delete specialState
|
# Delete specialState
|
||||||
$session->setting->remove( "specialState" );
|
$session->setting->remove( "specialState" );
|
||||||
|
|
||||||
|
|
@ -399,34 +399,18 @@ sub www_finalize {
|
||||||
$starterForm->hidden( name => "styleTemplateId", value => $self->get('styleTemplateId') );
|
$starterForm->hidden( name => "styleTemplateId", value => $self->get('styleTemplateId') );
|
||||||
$starterForm->submit( value => $i18n->get( 'yes please' ) );
|
$starterForm->submit( value => $i18n->get( 'yes please' ) );
|
||||||
|
|
||||||
my $finishForm = $self->getForm;
|
|
||||||
$finishForm->hidden( name => "runStarter", value => 0 );
|
|
||||||
$finishForm->submit( value => $i18n->get( 'no thanks' ) );
|
|
||||||
|
|
||||||
my $output = '<h1>' . $i18n->get('site starter title') . '</h1>';
|
my $output = '<h1>' . $i18n->get('site starter title') . '</h1>';
|
||||||
$output .= ' <p>' . $i18n->get('site starter body') . '</p>'
|
$output .= ' <p>' . $i18n->get('site starter body') . '</p>'
|
||||||
. '<div style="float: left">' . $starterForm->print . '</div>'
|
. '<div style="float: left">' . $starterForm->print . '</div>'
|
||||||
. '<div style="float: left">' . $finishForm->print . '</div>'
|
. sprintf(
|
||||||
|
'<div style="float: left"><a href="%s">%s</a></div>',
|
||||||
|
$session->url->gateway,
|
||||||
|
$i18n->get('no thanks'),
|
||||||
|
)
|
||||||
. '<div style="clear: both"> </div>'
|
. '<div style="clear: both"> </div>'
|
||||||
;
|
;
|
||||||
|
|
||||||
return $output;
|
return $output;
|
||||||
}
|
}
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
=head2 www_finalizeSave ( )
|
|
||||||
|
|
||||||
User has declined to do the Home Page wizard
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
sub www_finalizeSave {
|
|
||||||
my ( $self ) = @_;
|
|
||||||
my $session = $self->session;
|
|
||||||
my ( $form ) = $session->quick(qw( form ));
|
|
||||||
|
|
||||||
$session->http->setRedirect( $session->url->gateway );
|
|
||||||
}
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
|
||||||
24
t/Wizard.t
24
t/Wizard.t
|
|
@ -29,7 +29,7 @@ my $session = WebGUI::Test->session;
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# Tests
|
# Tests
|
||||||
|
|
||||||
plan tests => 29; # Increment this number for each test you create
|
plan tests => 31; # Increment this number for each test you create
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# Basic API
|
# Basic API
|
||||||
|
|
@ -127,6 +127,12 @@ cmp_deeply(
|
||||||
"thaw overwrites params"
|
"thaw overwrites params"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$wizard->cleanup;
|
||||||
|
cmp_deeply(
|
||||||
|
$wizard->thaw,
|
||||||
|
{ },
|
||||||
|
"cleanup clears scratch"
|
||||||
|
);
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# dispatch
|
# dispatch
|
||||||
|
|
@ -183,6 +189,15 @@ cmp_deeply(
|
||||||
'dispatch did not freeze error data'
|
'dispatch did not freeze error data'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
$wizard = WebGUI::Wizard::Test->new( $session ); # new object to clear currentStep
|
||||||
|
$session->request->setup_body({
|
||||||
|
wizard_class => 'WebGUI::Wizard::Test',
|
||||||
|
wizard_step => 'five',
|
||||||
|
});
|
||||||
|
is( $wizard->dispatch, "cleanup", "cleanup sub run after last step saved" );
|
||||||
|
|
||||||
|
|
||||||
package WebGUI::Wizard::Test;
|
package WebGUI::Wizard::Test;
|
||||||
use base 'WebGUI::Wizard';
|
use base 'WebGUI::Wizard';
|
||||||
sub _get_steps { return [qw( one two three four five )] }
|
sub _get_steps { return [qw( one two three four five )] }
|
||||||
|
|
@ -209,5 +224,12 @@ sub www_twoSave {
|
||||||
return "error";
|
return "error";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub www_fiveSave {
|
||||||
|
return; # Success!
|
||||||
|
}
|
||||||
|
|
||||||
|
sub www_cleanup {
|
||||||
|
return "cleanup";
|
||||||
|
}
|
||||||
|
|
||||||
#vim:ft=perl
|
#vim:ft=perl
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue