in reply to CGI::Application next run mode buttons?

So, I said I'd include an HTML::Template example of my madness. Here is the additional code (to work, it needs to be added to the root node's code):

sub main_form { my $self = shift; # Format NEXTRMS the way H::T expects my @NEXTRMS = map +{NEXTRMS => $_}, @{$self->{__NEXTRMS}->{$self->get_current_runmode()} +}; $self->{template}->param(RUNMODE => $self->get_current_runmode(), HANDLER => (caller(1))[3], NEXTRMS => \@NEXTRMS, ); return $self->{template}->output(); } __DATA__ <html> <head> </head> <body> Runmode: <TMPL_VAR NAME=RUNMODE><br> Dispatched sub: <TMPL_VAR NAME=HANDLER> <form action="/cgi-bin/monktest.pl" method="POST" name="myform"> Test <input name="Test" type="text" /> <input name="_reset" type="reset" value="Reset" /> <TMPL_LOOP NAME=NEXTRMS> <input name="_submit" onClick="this.form._submit.value = this.value;" type="submit" value="<TMPL_VAR NAME=NEXTRMS>" /> </TMPL_LOOP> </form> </body> </html>
This produces (practically) identical output to the CGI::FormBuilder code. But I have a couple problems

I think I need to turn the 'run_mode' structure inside-out from how it is now.

Thoughts?

--Solo
--
Well, I suppose I could hotwire this thing.

Replies are listed 'Best First'.
Re: Re: CGI::Application next run mode buttons?
by knowmad (Monk) on Apr 09, 2004 at 17:36 UTC
    Hi Matt,

    I like this solution much better than directly building the html in your code (albeit the html in your example is still technically in your code, it's easy enough to break it apart in production).

    I've not considered handling state via the controller although have seen other frameworks such as StateMachine::Gestiana (written by the author of the Uttu framework), which I think employ this method. You may want to check into how state is handled in these modules.

    Bear in mind that in your examples the state is still being set via an html form parameter. This parameter can therefore be overridden by the user when the form is submitted. You'll need to rethink your solution if you want to enforce the sequence. My solution is to check the form data at the beginning of each runmode using CGI::Application::ValidateRM. I can return the user to a previous state if they have not submitted valid/required information.

    In any case, I think that you ought to document this technique at the CGI App wiki. It looks like a viable alternative to manually setting the next state.

    Regards,
    William