--- loncom/homework/radiobuttonresponse.pm 2007/06/19 10:00:23 1.116 +++ loncom/homework/radiobuttonresponse.pm 2007/06/26 10:42:09 1.120 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # mutliple choice style responses # -# $Id: radiobuttonresponse.pm,v 1.116 2007/06/19 10:00:23 foxr Exp $ +# $Id: radiobuttonresponse.pm,v 1.120 2007/06/26 10:42:09 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -33,7 +33,9 @@ use Apache::lonlocal; use Apache::lonnet; use Apache::response; -my $bubbles_per_line = 10; +my $default_bubbles_per_line = 10; +my $bubbles_per_line; +my $bubble_lines = 1; BEGIN { &Apache::lonxml::register('Apache::radiobuttonresponse',('radiobuttonresponse')); @@ -43,10 +45,17 @@ sub start_radiobuttonresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; + + #when in a radiobutton response use these &Apache::lonxml::register('Apache::radiobuttonresponse',('foilgroup','foil','conceptgroup')); push (@Apache::lonxml::namespace,'radiobuttonresponse'); my $id = &Apache::response::start_response($parstack,$safeeval); + $bubbles_per_line = + &Apache::response::get_response_param($Apache::inputtags::part."_$id", + 'numbubbles', + $default_bubbles_per_line); + %Apache::hint::radiobutton=(); undef(%Apache::response::foilnames); if ($target eq 'meta') { @@ -128,6 +137,7 @@ sub storesurvey { my $part = $Apache::inputtags::part; my $id = $Apache::inputtags::response['-1']; my @whichfoils=@{ $Apache::response::foilgroup{'names'} }; + &bubble_line_count(scalar(@whichfoils)); my %responsehash; $responsehash{$whichfoils[$response]}=$response; my $responsestr=&Apache::lonnet::hash2str(%responsehash); @@ -140,66 +150,40 @@ sub storesurvey { return ''; } +sub bubble_line_count { + my ($numfoils) = @_; + $bubble_lines = int($numfoils / $bubbles_per_line); + if (($numfoils % $bubbles_per_line) != 0) { + $bubble_lines++; + } + return $bubble_lines; + +} + sub grade_response { my ($max,$randomize)=@_; #keep the random numbers the same must always call this my ($answer,@whichfoils)=&whichfoils($max,$randomize); if ( !&Apache::response::submitted() ) { return; } my $response; - if ($env{'form.submitted'} eq 'scantron') { - # Need to know how many foils we have so that I know how many - # bubble lines to consume: - - my $numfoils = scalar @whichfoils; - my $bubble_lines = int($numfoils / $bubbles_per_line); - if (($numfoils % $bubbles_per_line) != 0) { - $bubble_lines++; # Partial line of bubbles too. - } - # Get an array of the lines... note offsets seem to go from 1??... - - my @responses; - for (my $i = 1; $i <= $bubble_lines; $i++) { - my $this_line = &Apache::response::getresponse($i); - push(@responses, $this_line); - - } - # Update the lonxml::counter so that the next problem - # Gets the right set of answers: - - &Apache::lonxml::increment_counter($bubble_lines-1); - - # This code assumes that unbubbled lines will be - # blank while bubbled lines nonblank. - # .. multiple answers awards the student 'INCORRECT'. - # This is done by setting resopnse to "Multiple" which will - # not match anything. - #.. otherwise response is set to the line*$bubble_per_line+answer - # - # --- note: - # If it is not possible to do double bubble detection - # easily in grades.pm separating this loop makes it pretty - # easy to do it here. - # Just count the number of non-blank entries, and - # below the loop, check for non-blank entries != 1 - # and report a wrong answer if so. - # - my $answer_line; - my $answer_value = ''; # By default no answer given... - my $num_bubbled_lines=0; - for (my $line_number = 0; $line_number < $bubble_lines; $line_number++) { - if ($responses[$line_number] ne "") { - $answer_line = $line_number; - $answer_value = $responses[$line_number]; - last; - } - } - - $response = $answer_line * $bubbles_per_line + $answer_value; + + # Need to know how many foils we have so that I know how many + # bubble lines to consume: + + my $numfoils = scalar(@whichfoils); + &bubble_line_count($numfoils); + + + if ($env{'form.submitted'} eq 'scantron') { + $response = &Apache::response::getresponse(1,undef,$bubble_lines, + $bubbles_per_line); } else { $response = $env{'form.HWVAL_'.$Apache::inputtags::response['-1']}; } + + if ( $response !~ /[0-9]+/) { return; } my $part=$Apache::inputtags::part; my $id = $Apache::inputtags::response['-1']; @@ -252,6 +236,7 @@ sub end_foilgroup { &grade_response($max,$randomize); } elsif ( $target eq 'analyze') { my @shown = &whichfoils($max,$randomize); + &bubble_line_count(scalar(@shown)); &Apache::response::analyze_store_foilgroup(\@shown, ['text','value','location']); my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]"; @@ -267,7 +252,7 @@ sub end_foilgroup { } &Apache::response::poprandomnumber(); - &Apache::lonxml::increment_counter(); + &Apache::lonxml::increment_counter($bubble_lines); return $result; } @@ -304,9 +289,12 @@ sub displayallfoils { my $result; &Apache::lonxml::debug("survey style display"); my @names; + &Apache::lonnet::loghthis("Display all foils"); if ( $Apache::response::foilgroup{'names'} ) { @names= @{ $Apache::response::foilgroup{'names'} }; } + &bubble_line_count(scalar(@names)); + my $temp=0; my $i =0; my $id=$Apache::inputtags::response['-1']; @@ -376,6 +364,7 @@ sub displayallfoils { } } } + if (($direction eq 'horizontal') && ($target ne 'tex')) { $result.=''; } return $result; } @@ -521,6 +510,7 @@ sub displayfoils { my $result; my ($answer,@whichfoils)=&whichfoils($max,$randomize); + &bubble_line_count(scalar(@whichfoils)); my $part=$Apache::inputtags::part; my $solved=$Apache::lonhomework::history{"resource.$part.solved"}; if ( ($target ne 'tex') && @@ -596,7 +586,6 @@ sub displayfoils { if($bubble_number >= $bubbles_per_line) { $i = 0; $bubble_number = 0; - &Apache::lonxml::increment_counter(1); $result.='\item[\textbf{'.$Apache::lonxml::counter.'}.]'; } } else { @@ -621,7 +610,7 @@ sub displayallanswers { if ( $Apache::response::foilgroup{'names'} ) { @names= @{ $Apache::response::foilgroup{'names'} }; } - + &bubble_line_count(scalar(@names)); my $result=&Apache::response::answer_header('radiobuttonresponse'); foreach my $name (@names) { $result.=&Apache::response::answer_part('radiobuttonresponse',