version 1.6, 2003/02/10 22:13:55
|
version 1.7, 2003/02/13 21:00:11
|
Line 103 sub new {
|
Line 103 sub new {
|
|
|
=cut |
=cut |
|
|
|
# Sometimes the wizard writer will want to use the result of the previous |
|
# state to change the text of the next state. In order to do that, it |
|
# has to be done during the declaration of the states, or it won't be |
|
# available. Therefore, basic form processing must occur before the |
|
# actual display routine is called and the actual pre-process is called, |
|
# or it won't be available. |
|
# This also factors common code out of the preprocess calls. |
sub declareVars { |
sub declareVars { |
my $self = shift; |
my $self = shift; |
my $varlist = shift; |
my $varlist = shift; |
Line 119 sub declareVars {
|
Line 126 sub declareVars {
|
{ |
{ |
$self->{VARS}->{$element} = $ENV{$envname}; |
$self->{VARS}->{$element} = $ENV{$envname}; |
} |
} |
|
|
|
# If there's an incoming form submission, use that |
|
my $envname = "form." . $element . ".forminput"; |
|
if (defined ($ENV{$envname})) { |
|
$self->{VARS}->{$element} = $ENV{$envname}; |
|
} |
} |
} |
} |
} |
|
|
Line 366 sub handler {
|
Line 379 sub handler {
|
$r->rflush(); |
$r->rflush(); |
|
|
my $mes = <<WIZBEGIN; |
my $mes = <<WIZBEGIN; |
<p>This wizard will allow you to</p> |
<p>This wizard will allow you to <b>set open, due, and answer dates for problems</b>. You will be asked to select a problem, what kind of date you want to set, and for whom the date should be effective.</p> |
|
|
<ul> |
|
<li>Change assignment parameters, such as due date or open date...</li> |
|
<li>... for a whole class</li> |
|
<li>... for a whole section</li> |
|
<li>... for an individual student</li> |
|
<li>... by folder</li> |
|
<li>... by individual assignment</li> |
|
</ul> |
|
|
|
<p>After the wizard is done, you will be shown where in the advanced interface you would have gone to change the parameter you have chosen, so in the future you can do it directly.</p> |
<p>After the wizard is done, you will be shown where in the advanced interface you would have gone to change the parameter you have chosen, so in the future you can do it directly.</p> |
|
|
|
<p>Press <b>Next -></b> to begin, or select <b><- Previous</b> to go back to the previous screen.</p> |
WIZBEGIN |
WIZBEGIN |
|
|
my $wizard = Apache::lonwizard->new("Course Parameter Wizard"); |
my $wizard = Apache::lonwizard->new("Course Parameter Wizard"); |
$wizard->declareVars(['ACTION_TYPE', 'GRANULARITY', 'TARGETS', 'PARM_DATE', 'RESOURCE_ID', 'USER_NAME', 'SECTION_NAME']); |
$wizard->declareVars(['ACTION_TYPE', 'GRANULARITY', 'TARGETS', 'PARM_DATE', 'RESOURCE_ID', 'USER_NAME', 'SECTION_NAME']); |
my %dateTypeHash = ('open_date' => "Opening Date", |
my %dateTypeHash = ('open_date' => "opening date", |
'due_date' => "Due Date", |
'due_date' => "due date", |
'answer_date' => "Answer Date"); |
'answer_date' => "answer date"); |
|
my %levelTypeHash = ('whole_course' => "all problems in the course", |
|
'map' => 'the selected folder', |
|
'resource' => 'the selected problem'); |
|
|
Apache::lonwizard::message_state->new($wizard, "START", "Welcome to the Assignment Parameter Wizard", $mes, "CHOOSE_ACTION"); |
Apache::lonwizard::message_state->new($wizard, "START", "Welcome to the Assignment Parameter Wizard", $mes, "CHOOSE_LEVEL"); |
Apache::lonwizard::switch_state->new($wizard, "CHOOSE_ACTION", "What do you want to do?", "ACTION_TYPE", [ |
Apache::lonwizard::switch_state->new($wizard, "CHOOSE_LEVEL", "Which Problem or Problems?", "GRANULARITY", [ |
["open_date", "Set an Open Date for a problem", "CHOOSE_LEVEL"], |
["whole_course", "<b>Every problem</b> in the course", "CHOOSE_ACTION"], |
["due_date", "Set a Due Date for a problem", "CHOOSE_LEVEL"], |
["map", "Every problem in a particular <b>folder</b>", "CHOOSE_FOLDER"], |
["answer_date", "Set an Answer Open Date for a problem", "CHOOSE_LEVEL" ] ]); |
["resource", "One particular <b>problem</b>", "CHOOSE_RESOURCE"]], |
Apache::lonwizard::switch_state->new($wizard, "CHOOSE_LEVEL", "Parameter Granularity", "GRANULARITY", [ |
"Which problems do you wish to change a date for?"); |
["whole_course", "Set for Whole Course", "CHOOSE_STUDENT_LEVEL"], |
Apache::lonwizard::resource_choice->new($wizard, "CHOOSE_FOLDER", "Select Folder", "Select the folder you wish to set the date for:", "", "CHOOSE_ACTION", "RESOURCE_ID", sub {my $res = shift; return $res->is_map();}); |
["map", "Set for a Folder/Map", "CHOOSE_FOLDER"], |
Apache::lonwizard::resource_choice->new($wizard, "CHOOSE_RESOURCE", "Select Resource", "", "", "CHOOSE_ACTION", "RESOURCE_ID", sub {my $res = shift; return $res->is_map() || $res->is_problem();}, sub {my $res = shift; return $res->is_problem(); }); |
["resource", "Set for a Particular Problem", "CHOOSE_RESOURCE"]], |
my $levelType = $levelTypeHash{$wizard->{VARS}->{GRANULARITY}}; |
"How general should this setting be?"); |
Apache::lonwizard::switch_state->new($wizard, "CHOOSE_ACTION", "Parameter Type", "ACTION_TYPE", [ |
Apache::lonwizard::resource_choice->new($wizard, "CHOOSE_FOLDER", "Select Folder", "", "", "CHOOSE_STUDENT_LEVEL", "RESOURCE_ID", sub {my $res = shift; return $res->is_map();}); |
["open_date", "Set an <b>open date</b>", "CHOOSE_DATE"], |
Apache::lonwizard::resource_choice->new($wizard, "CHOOSE_RESOURCE", "Select Resource", "", "", "CHOOSE_STUDENT_LEVEL", "RESOURCE_ID", sub {my $res = shift; return $res->is_map() || $res->is_problem();}, sub {my $res = shift; return $res->is_problem(); }); |
["due_date", "Set a <b>due date</b>", "CHOOSE_DATE"], |
Apache::lonwizard::switch_state->new($wizard, "CHOOSE_STUDENT_LEVEL", "Parameter Targets", "TARGETS", [ |
["answer_date", "Set an <b>answer open date</b>", "CHOOSE_DATE" ] ], |
["course", "Set for All Students in Course", "CHOOSE_DATE"], |
"What parameters do you want to set for $levelType?"); |
["section", "Set for Section", "CHOOSE_SECTION"], |
|
["student", "Set for an Individual Student", "CHOOSE_STUDENT"]], |
|
"Whom should this setting affect?"); |
|
|
|
my $dateType = $dateTypeHash{$wizard->{VARS}->{ACTION_TYPE}}; |
my $dateType = $dateTypeHash{$wizard->{VARS}->{ACTION_TYPE}}; |
Apache::lonwizard::choose_section->new($wizard, "CHOOSE_SECTION", "Select Section", "Please select the section you wish to set the $dateType for:", "", "CHOOSE_DATE", "SECTION_NAME"); |
Apache::lonwizard::date_state->new($wizard, "CHOOSE_DATE", "Set Date", "PARM_DATE", "CHOOSE_STUDENT_LEVEL", "What should the $dateType be set to?"); |
Apache::lonwizard::choose_student->new($wizard, "CHOOSE_STUDENT", "Select Student", "Please select the student you wish to set the $dateType for:", "", "CHOOSE_DATE", "USER_NAME"); |
Apache::lonwizard::switch_state->new($wizard, "CHOOSE_STUDENT_LEVEL", "Students Affected", "TARGETS", [ |
Apache::lonwizard::date_state->new($wizard, "CHOOSE_DATE", "Set Date", "PARM_DATE", "FINISH", "What should the $dateType be set to?"); |
["course", ". . . for <b>all students</b> in the course", "FINISH"], |
|
["section", ". . . for a particular <b>section</b>", "CHOOSE_SECTION"], |
|
["student", ". . . for an individual <b>student</b>", "CHOOSE_STUDENT"]], |
|
"Set $dateType of $levelType for. . ."); |
|
|
|
Apache::lonwizard::choose_section->new($wizard, "CHOOSE_SECTION", "Select Section", "Please select the section you wish to set the $dateType for:", "", "FINISH", "SECTION_NAME"); |
|
Apache::lonwizard::choose_student->new($wizard, "CHOOSE_STUDENT", "Select Student", "Please select the student you wish to set the $dateType for:", "", "FINISH", "USER_NAME"); |
Apache::lonwizard::parmwizfinal->new($wizard, "FINISH", "Confirm Selection"); |
Apache::lonwizard::parmwizfinal->new($wizard, "FINISH", "Confirm Selection"); |
|
|
$r->print($wizard->display()); |
$r->print($wizard->display()); |
Line 429 It is importent to remember when constru
|
Line 440 It is importent to remember when constru
|
|
|
None of the pre-packaged states correctly handle there being B<no> input, as the wizard does not currently have any protection against errors in the states themselves. (The closest thing you can do is set the wizard to be done and display an error message, which should be adequate.) |
None of the pre-packaged states correctly handle there being B<no> input, as the wizard does not currently have any protection against errors in the states themselves. (The closest thing you can do is set the wizard to be done and display an error message, which should be adequate.) |
|
|
|
By default, the wizard framework will take form elements of the form {VAR_NAME}.forminput and automatically insert the contents of that form element into the wizard variable {VAR_NAME}. You only need to use postprocess to do something fancy if that is not sufficient, for instance, processing a multi-element selection. (See resource choice for an example of that.) |
|
|
=head2 lonwizstate methods |
=head2 lonwizstate methods |
|
|
These methods should be overridden in derived states, except B<new> which may be sufficient. |
These methods should be overridden in derived states, except B<new> which may be sufficient. |
Line 663 sub postprocess {
|
Line 676 sub postprocess {
|
my $wizard = $self->{WIZARD}; |
my $wizard = $self->{WIZARD}; |
my $formvalue = $ENV{'form.' . $self->{VAR_NAME} . '.forminput'}; |
my $formvalue = $ENV{'form.' . $self->{VAR_NAME} . '.forminput'}; |
if ($formvalue) { |
if ($formvalue) { |
$wizard->setVar($self->{VAR_NAME}, $formvalue); |
# Value already stored by Wizard |
$wizard->changeState($self->{NEXT_STATE}); |
$wizard->changeState($self->{NEXT_STATE}); |
} else { |
} else { |
$self->{ERROR_MSG} = "Can't continue the wizard because you must make" |
$self->{ERROR_MSG} = "Can't continue the wizard because you must make" |
Line 745 sub render {
|
Line 758 sub render {
|
} |
} |
|
|
sub postprocess { |
sub postprocess { |
|
# Value already stored by wizard |
my $self = shift; |
my $self = shift; |
my $wizard = $self->{WIZARD}; |
my $wizard = $self->{WIZARD}; |
my $chosenValue = $ENV{"form." . $self->{VAR_NAME} . '.forminput'}; |
my $chosenValue = $ENV{"form." . $self->{VAR_NAME} . '.forminput'}; |
$wizard->setVar($self->{VAR_NAME}, $chosenValue) |
|
if (defined ($self->{VAR_NAME})); |
|
|
|
foreach my $choice (@{$self->{CHOICE_LIST}}) |
foreach my $choice (@{$self->{CHOICE_LIST}}) |
{ |
{ |
Line 1152 sub postprocess {
|
Line 1164 sub postprocess {
|
return; |
return; |
} |
} |
|
|
my $chosenValue = $ENV{"form." . $self->{VAR_NAME} . ".forminput"}; |
if (!$ENV{'form.' . $self->{VAR_NAME} . '.forminput'}) { |
$wizard->setVar($self->{VAR_NAME}, $chosenValue) |
$self->{ERROR_MSG} = "Can't continue wizard because you must ". |
if (defined($self->{VAR_NAME})); |
"select a resource."; |
|
return; |
|
} |
|
|
|
|
|
# Value stored by wizard framework |
|
|
$wizard->changeState($self->{NEXT_STATE}); |
$wizard->changeState($self->{NEXT_STATE}); |
} |
} |
|
|
Line 1174 sub render {
|
Line 1191 sub render {
|
$vals->{$curVal} = 1; |
$vals->{$curVal} = 1; |
} |
} |
|
|
|
if (defined $self->{ERROR_MSG}) { |
|
$result .= '<font color="#FF0000">' . $self->{ERROR_MSG} . '</font><br /><br />'; |
|
} |
|
|
$result .= $self->{MESSAGE_BEFORE} if (defined $self->{MESSAGE_BEFORE}); |
$result .= $self->{MESSAGE_BEFORE} if (defined $self->{MESSAGE_BEFORE}); |
|
|
# Get the course nav map |
# Get the course nav map |