--- loncom/homework/radiobuttonresponse.pm 2004/12/23 17:08:22 1.97 +++ loncom/homework/radiobuttonresponse.pm 2006/12/19 11:05:21 1.110 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # mutliple choice style responses # -# $Id: radiobuttonresponse.pm,v 1.97 2004/12/23 17:08:22 albertel Exp $ +# $Id: radiobuttonresponse.pm,v 1.110 2006/12/19 11:05:21 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -30,6 +30,7 @@ package Apache::radiobuttonresponse; use strict; use HTML::Entities(); use Apache::lonlocal; +use Apache::lonnet; BEGIN { &Apache::lonxml::register('Apache::radiobuttonresponse',('radiobuttonresponse')); @@ -59,12 +60,14 @@ sub start_radiobuttonresponse { $token,'4'). &Apache::edit::select_arg('Randomize Foil Order','randomize', ['yes','no'],$token). + &Apache::edit::select_arg('Display Direction','direction', + ['vertical','horizontal'],$token). &Apache::edit::end_row(). &Apache::edit::start_spanning_row()."\n"; } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args($token,$parstack, $safeeval,'max', - 'randomize'); + 'randomize','direction'); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } } elsif ($target eq 'tex') { my $type=&Apache::lonxml::get_param('TeXtype',$parstack,$safeeval, @@ -114,8 +117,8 @@ sub start_foilgroup { } sub storesurvey { - if ( !defined($ENV{'form.submitted'})) { return ''; } - my $response = $ENV{'form.HWVAL_'.$Apache::inputtags::response['-1']}; + if ( !&Apache::response::submitted() ) { return ''; } + my $response = $env{'form.HWVAL_'.$Apache::inputtags::response['-1']}; &Apache::lonxml::debug("Here I am!:$response:"); if ( $response !~ /[0-9]+/) { return ''; } my $part = $Apache::inputtags::part; @@ -137,12 +140,12 @@ sub grade_response { my ($max,$randomize)=@_; #keep the random numbers the same must always call this my ($answer,@whichfoils)=&whichfoils($max,$randomize); - if (!defined($ENV{'form.submitted'})) { return; } + if ( !&Apache::response::submitted() ) { return; } my $response; - if ($ENV{'form.submitted'} eq 'scantron') { + if ($env{'form.submitted'} eq 'scantron') { $response=&Apache::response::getresponse(); } else { - $response = $ENV{'form.HWVAL_'.$Apache::inputtags::response['-1']}; + $response = $env{'form.HWVAL_'.$Apache::inputtags::response['-1']}; } if ( $response !~ /[0-9]+/) { return; } my $part=$Apache::inputtags::part; @@ -176,7 +179,7 @@ sub end_foilgroup { $safeeval,'-2'); if ( $style eq 'survey' && $target ne 'analyze') { if ($target eq 'web' || $target eq 'tex') { - $result=&displayallfoils($direction); + $result=&displayallfoils($direction, $target); } elsif ( $target eq 'answer' ) { $result=&displayallanswers(); } elsif ( $target eq 'grade' ) { @@ -228,11 +231,15 @@ sub getfoilcounts { } sub displayallfoils { - my ($direction)=@_; + my ($direction, $target)=@_; my $result; &Apache::lonxml::debug("survey style display"); - my @names = @{ $Apache::response::foilgroup{'names'} }; + my @names; + if ( $Apache::response::foilgroup{'names'} ) { + @names= @{ $Apache::response::foilgroup{'names'} }; + } my $temp=0; + my $i =0; my $id=$Apache::inputtags::response['-1']; my $part=$Apache::inputtags::part; my $lastresponse= @@ -242,19 +249,27 @@ sub displayallfoils { if (&Apache::response::show_answer() ) { foreach my $name (@names) { if ($Apache::response::foilgroup{$name.'.value'} ne 'unused') { - if ($direction eq 'horizontal') { + if (($direction eq 'horizontal') && ($target ne 'tex')) { $result.="<td>"; } else { - $result.="<br />"; + if ($target eq 'tex') { + $result .= '\item \vskip -2mm '; + } else { + $result.="<br />"; + } } if (defined($lastresponse{$name})) { - $result.='<b>'; + if ($target eq 'tex') { + $result .= '}'; + } else { + $result.='<b>'; + } } $result .= $Apache::response::foilgroup{$name.'.text'}; - if (defined($lastresponse{$name})) { + if (defined($lastresponse{$name}) && ($target ne 'tex')) { $result.='</b>'; } - if ($direction eq 'horizontal') { $result.="</td>"; } + if (($direction eq 'horizontal') && ($target ne 'tex')) { $result.="</td>"; } } } } else { @@ -263,19 +278,32 @@ sub displayallfoils { if ($direction eq 'horizontal') { $result.="<td>"; } else { - $result.="<br />"; + if ($target eq 'tex') { + $result .= '\item \vskip -2mm '; + } else { + $result.="<br />"; + } + } + if ($target eq 'tex') { + $result .= '$\bigcirc$'.$Apache::response::foilgroup{$name.'.text'}.'\\\\'; #' stupid emacs + $i++; + } else { + $result .= '<label>'; + $result.="<input type=\"radio\" name=\"HWVAL_$Apache::inputtags::response['-1']\" value=\"$temp\" "; + if (defined($lastresponse{$name})) { $result .= 'checked="on"'; } + $result .= ' />'.$Apache::response::foilgroup{$name.'.text'}. + '</label>'; } - $result .= '<label>'; - $result.="<input type=\"radio\" name=\"HWVAL_$Apache::inputtags::response['-1']\" value=\"$temp\" "; - if (defined($lastresponse{$name})) { $result .= 'checked="on"'; } - $result .= '>'.$Apache::response::foilgroup{$name.'.text'}. - '</label>'; $temp++; - if ($direction eq 'horizontal') { $result.="</td>"; } + if ($target ne 'tex') { + if (($direction eq 'horizontal') && ($target ne 'tex')) { $result.="</td>"; } + } else { + $result.='\vskip 0 mm '; + } } } } - if ($direction eq 'horizontal') { $result.='</tr></table>'; } + if (($direction eq 'horizontal') && ($target ne 'tex')) { $result.='</tr></table>'; } return $result; } @@ -288,7 +316,7 @@ sub whichfoils { my ($truecnt,$falsecnt) = &getfoilcounts(); my $count=0; # we will add in 1 of the true statements - if (($falsecnt+1)>$max) { $count=$max } else { $count=$falsecnt+1; } + if ( $max>0 && ($falsecnt+1)>$max) { $count=$max } else { $count=$falsecnt+1; $max=$count; } my $answer=int(&Math::Random::random_uniform() * ($count)); &Apache::lonxml::debug("Count is $count, $answer is $answer"); my @names; @@ -481,7 +509,7 @@ sub displayfoils { $result.= '<label>'; $result.="<input type=\"radio\" name=\"HWVAL_$Apache::inputtags::response['-1']\" value=\"$temp\" "; if (defined($lastresponse{$name})) { $result .= 'checked="on"'; } - $result .= '>'.$Apache::response::foilgroup{$name.'.text'}."</label>"; + $result .= ' />'.$Apache::response::foilgroup{$name.'.text'}."</label>"; } else { if ($Apache::lonhomework::type eq 'exam') { $result .= '{\small \textbf{'.$alphabet[$i].'}}$\bigcirc$'.$Apache::response::foilgroup{$name.'.text'}.'\\\\'; #' stupid emacs @@ -504,7 +532,10 @@ sub displayfoils { } sub displayallanswers { - my @names = @{ $Apache::response::foilgroup{'names'} }; + my @names; + if ( $Apache::response::foilgroup{'names'} ) { + @names= @{ $Apache::response::foilgroup{'names'} }; + } my $result=&Apache::response::answer_header('radiobuttonresponse'); foreach my $name (@names) { @@ -519,10 +550,15 @@ sub displayanswers { my ($max,$randomize)=@_; my ($answer,@whichopt) = &whichfoils($max,$randomize); my $result=&Apache::response::answer_header('radiobuttonresponse'); + if ($Apache::lonhomework::type eq 'exam') { + my $correct = ('A'..'Z')[$answer]; + $result.=&Apache::response::answer_part('radiobuttonresponse', + $correct); + } foreach my $name (@whichopt) { $result.=&Apache::response::answer_part('radiobuttonresponse', - $Apache::response::foilgroup{$name.'.value'}) - } + $Apache::response::foilgroup{$name.'.value'}); + } $result.=&Apache::response::answer_footer('radiobuttonresponse'); return $result; } @@ -606,7 +642,10 @@ sub end_foil { my $value = &Apache::lonxml::get_param('value',$parstack,$safeeval); if ($value ne 'unused') { my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval); - if (!$name) { $name=$Apache::lonxml::curdepth; } + if ($name eq "") { + &Apache::lonxml::warning("Foils without names exist. This can cause problems to malfunction."); + $name=$Apache::lonxml::curdepth; + } if (defined($Apache::response::foilnames{$name})) { &Apache::lonxml::error(&mt("Foil name <b><tt>[_1]</tt></b> appears more than once. Foil names need to be unique.",$name)); }