--- loncom/interface/lonhelper.pm 2006/05/30 21:48:00 1.153 +++ loncom/interface/lonhelper.pm 2006/08/01 15:12:32 1.158 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # .helper XML handler to implement the LON-CAPA helper # -# $Id: lonhelper.pm,v 1.153 2006/05/30 21:48:00 foxr Exp $ +# $Id: lonhelper.pm,v 1.158 2006/08/01 15:12:32 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -185,7 +185,6 @@ use Apache::lonlocal; use Apache::lonnet; use Apache::longroup; use Apache::lonselstudent; -use lib '/home/httpd/lib/perl/'; use LONCAPA; # Register all the tags with the helper, so the helper can @@ -365,6 +364,7 @@ use Apache::loncommon; use Apache::File; use Apache::lonlocal; use Apache::lonnet; +use LONCAPA; sub new { my $proto = shift; @@ -470,9 +470,8 @@ sub _saveVars { sub _varsInFile { my $self = shift; my @vars = (); - for my $key (keys %{$self->{VARS}}) { - push @vars, &Apache::lonnet::escape($key) . '=' . - &Apache::lonnet::escape($self->{VARS}->{$key}); + for my $key (keys(%{$self->{VARS}})) { + push(@vars, &escape($key) . '=' . &escape($self->{VARS}->{$key})); } return join ('&', @vars); } @@ -487,7 +486,7 @@ sub declareVar { $self->{VARS}->{$var} = ''; } - my $envname = 'form.' . $var . '.forminput'; + my $envname = 'form.' . $var . '_forminput'; if (defined($env{$envname})) { if (ref($env{$envname})) { $self->{VARS}->{$var} = join('|||', @{$env{$envname}}); @@ -1024,6 +1023,81 @@ sub postprocess { } 1; +package Apache::lonhelper::skip; + +=pod + +=head1 Elements + +=head2 Element: skipX<skip> + +The <skip> tag allows you define conditions under which the current state +should be skipped over and define what state to skip to. + + <state name="SKIP"> + <skip> + <clause> + #some code that decides whether to skip the state or not + </clause> + <nextstate>FINISH</nextstate> + </skip> + <message nextstate="FINISH">A possibly skipped state</message> + </state> + +=cut + +no strict; +@ISA = ("Apache::lonhelper::element"); +use strict; + +BEGIN { + &Apache::lonhelper::register('Apache::lonhelper::skip', + ('skip')); +} + +sub new { + my $ref = Apache::lonhelper::element->new(); + bless($ref); +} + +sub start_skip { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + + if ($target ne 'helper') { + return ''; + } + # let <cluase> know what text to skip to + $paramHash->{SKIPTAG}='/skip'; + return ''; +} + +sub end_skip { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + + if ($target ne 'helper') { + return ''; + } + Apache::lonhelper::skip->new(); + return ''; +} + +sub render { + my $self = shift; + return ''; +} +# If a NEXTSTATE is set, switch to it +sub preprocess { + my ($self) = @_; + + if (defined($self->{NEXTSTATE})) { + $helper->changeState($self->{NEXTSTATE}); + } + + return 1; +} + +1; + package Apache::lonhelper::choices; =pod @@ -1206,7 +1280,7 @@ sub render { function checkall(value, checkName) { for (i=0; i<document.forms.helpform.elements.length; i++) { ele = document.forms.helpform.elements[i]; - if (ele.name == checkName + '.forminput') { + if (ele.name == checkName + '_forminput') { document.forms.helpform.elements[i].checked=value; } } @@ -1279,7 +1353,7 @@ BUTTONS foreach my $choice (@{$self->{CHOICES}}) { my $id = &new_id(); $result .= "<tr>\n<td width='20'> </td>\n"; - $result .= "<td valign='top'><input type='$type' name='$var.forminput'" + $result .= "<td valign='top'><input type='$type' name='${var}_forminput'" . " value='" . HTML::Entities::encode($choice->[1],"<>&\"'") . "'"; @@ -1298,7 +1372,7 @@ BUTTONS $choiceLabel. "</label></td>"; if ($choice->[4]) { $result .='<td><input type="text" size="5" name="' - .$choice->[4].'.forminput" value="' + .$choice->[4].'_forminput" value="' .$choice->[5].'" /></td>'; } $result .= "</tr>\n"; @@ -1313,7 +1387,7 @@ BUTTONS # given, switch to it sub postprocess { my $self = shift; - my $chosenValue = $env{'form.' . $self->{'variable'} . '.forminput'}; + my $chosenValue = $env{'form.' . $self->{'variable'} . '_forminput'}; if (!defined($chosenValue) && !$self->{'allowempty'}) { $self->{ERROR_MSG} = @@ -1337,7 +1411,7 @@ sub postprocess { } if ($choice->[4]) { my $varname = $choice->[4]; - $helper->{'VARS'}->{$varname} = $env{'form.'."$varname.forminput"}; + $helper->{'VARS'}->{$varname} = $env{'form.'."${varname}_forminput"}; } } return 1; @@ -1446,7 +1520,7 @@ sub render { $checkedChoices{$self->{CHOICES}->[0]->[1]} = 1; } - $result .= "<select name='${var}.forminput'>\n"; + $result .= "<select name='${var}_forminput'>\n"; foreach my $choice (@{$self->{CHOICES}}) { $result .= "<option value='" . HTML::Entities::encode($choice->[1],"<>&\"'") @@ -1472,7 +1546,7 @@ sub render { # given, switch to it sub postprocess { my $self = shift; - my $chosenValue = $env{'form.' . $self->{'variable'} . '.forminput'}; + my $chosenValue = $env{'form.' . $self->{'variable'} . '_forminput'}; if (!defined($chosenValue) && !$self->{'allowempty'}) { $self->{ERROR_MSG} = "You must choose one or more choices to" . @@ -1611,8 +1685,6 @@ sub render { $date->min(0); } - &Apache::lonnet::logthis("date mode "); - if ($anytime) { $onclick = "onclick=\"javascript:updateCheck(this.form,'${var}anytime',false)\""; } @@ -2027,7 +2099,7 @@ sub render { function checkall(value, checkName) { for (i=0; i<document.forms.helpform.elements.length; i++) { ele = document.forms.helpform.elements[i]; - if (ele.name == checkName + '.forminput') { + if (ele.name == checkName + '_forminput') { document.forms.helpform.elements[i].checked=value; } } @@ -2126,12 +2198,12 @@ BUTTONS } $col .= "<td align='center'><input type='checkbox' name ='$option_var". - ".forminput' value='". + "_forminput' value='". $resource_name . "' $checked /> </td>"; } } - $col .= "<td align='center'><input type='$inputType' name='${var}.forminput' "; + $col .= "<td align='center'><input type='$inputType' name='${var}_forminput' "; if (%defaultSymbs) { my $symb=$resource->symb(); if (exists($defaultSymbs{$symb})) { @@ -2160,7 +2232,7 @@ BUTTONS my $resource_name = &HTML::Entities::encode(&$valueFunc($resource),"<>&\"'"); if ($addparts && (scalar(@{$resource->parts}) > 1)) { - $col .= "<select onclick=\"javascript:updateRadio(this.form,'${var}.forminput','$resource_name');updateHidden(this.form,'$id','${var}');\" name='part_$id.forminput'>\n"; + $col .= "<select onclick=\"javascript:updateRadio(this.form,'${var}_forminput','$resource_name');updateHidden(this.form,'$id','${var}');\" name='part_${id}_forminput'>\n"; $col .= "<option value=\"$part\">All Parts</option>\n"; foreach my $part (@{$resource->parts}) { $col .= "<option value=\"$part\">Part: $part</option>\n"; @@ -2182,14 +2254,14 @@ BUTTONS } } function updateHidden(form,id,name) { - var select=form['part_'+id+'.forminput']; - var hidden=form[name+'_part.forminput']; + var select=form['part_'+id+'_forminput']; + var hidden=form[name+'_part_forminput']; var which=select.selectedIndex; hidden.value=select.options[which].value; } // --> </script> -<input type="hidden" name="${var}_part.forminput" /> +<input type="hidden" name="${var}_part_forminput" /> RADIO $env{'form.condition'} = !$self->{'toponly'}; @@ -2358,6 +2430,7 @@ sub render { # Current personel + $result .= '<h4>'.&mt('Select Currently Enrolled Students and Active Course Personnel').'</h4>'; $result .= &Apache::lonselstudent::render_student_list( $current_members, "helpform", "current", @@ -2369,10 +2442,12 @@ sub render { # If activeonly is not set then we can also give the expired students: # - if (!$self->{'activeonly'} && ((scalar @$expired_members) > 0)) { + if (!$self->{'activeonly'} && ((scalar(@$future_members)) > 0)) { # And future. + $result .= '<h4>'.&mt('Select Future Enrolled Students and Future Course Personnel').'</h4>'; + $result .= &Apache::lonselstudent::render_student_list( $future_members, "helpform", "future", @@ -2380,8 +2455,11 @@ sub render { $self->{'multichoice'}, $self->{'variable'}, 0); + } + if (!$self->{'activeonly'} && ((scalar(@$expired_members)) > 0)) { # Past + $result .= '<h4>'.&mt('Select Previously Enrolled Students and Inactive Course Personnel').'</h4>'; $result .= &Apache::lonselstudent::render_student_list($expired_members, "helpform", "past", @@ -2399,7 +2477,7 @@ sub render { sub postprocess { my $self = shift; - my $result = $env{'form.' . $self->{'variable'} . '.forminput'}; + my $result = $env{'form.' . $self->{'variable'} . '_forminput'}; if (!$result && !$self->{'emptyallowed'}) { if ($self->{'coursepersonnel'}) { $self->{ERROR_MSG} = @@ -2584,7 +2662,7 @@ sub render { function checkall(value, checkName) { for (i=0; i<document.forms.helpform.elements.length; i++) { ele = document.forms.helpform.elements[i]; - if (ele.name == checkName + '.forminput') { + if (ele.name == checkName + '_forminput') { document.forms.helpform.elements[i].checked=value; } } @@ -2701,7 +2779,7 @@ BUTTONS my $id = &new_id(); $result .= '<tr><td align="right"' . " bgcolor='$color'>" . "<input $onclick type='$type' name='" . $var - . ".forminput' ".qq{id="$id"}." value='" . HTML::Entities::encode($fileName,"<>&\"'"). + . "_forminput' ".qq{id="$id"}." value='" . HTML::Entities::encode($fileName,"<>&\"'"). "'"; if (!$self->{'multichoice'} && $choices == 0) { $result .= ' checked="checked"'; @@ -2762,7 +2840,7 @@ sub fileState { sub postprocess { my $self = shift; - my $result = $env{'form.' . $self->{'variable'} . '.forminput'}; + my $result = $env{'form.' . $self->{'variable'} . '_forminput'}; if (!$result) { $self->{ERROR_MSG} = 'You must choose at least one file '. 'to continue.'; @@ -2998,7 +3076,7 @@ sub render { $result .= '<p><font color="#FF0000">' . $self->{ERROR_MSG} . '</font></p>'; } - $result .= '<input type="string" name="' . $self->{'variable'} . '.forminput"'; + $result .= '<input type="string" name="' . $self->{'variable'} . '_forminput"'; if (defined($self->{'size'})) { $result .= ' size="' . $self->{'size'} . '"'; @@ -3131,7 +3209,8 @@ sub start_clause { die 'Error in clause of condition, Perl said: ' . $@ if $@; if (!&$clause($helper, $paramHash)) { # Discard all text until the /condition. - &Apache::lonxml::get_all_text('/condition', $parser); + my $end_tag = $paramHash->{SKIPTAG} || '/condition'; + &Apache::lonxml::get_all_text($end_tag, $parser); } }