Annotation of loncom/homework/radiobuttonresponse.pm, revision 1.22
1.22 ! albertel 1: # The LearningOnline Network with CAPA
! 2: # mutliple choice style responses
! 3: # 2/21 Guy
1.1 albertel 4:
5: package Apache::radiobuttonresponse;
6: use strict;
7:
8: sub BEGIN {
1.22 ! albertel 9: &Apache::lonxml::register('Apache::radiobuttonresponse',('radiobuttonresponse'));
1.1 albertel 10: }
11:
12: sub start_radiobuttonresponse {
1.22 ! albertel 13: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.3 albertel 14: #when in a radiobutton response use these
1.22 ! albertel 15: &Apache::lonxml::register('Apache::radiobuttonresponse',('foilgroup','foil','conceptgroup'));
1.4 albertel 16: my $id = &Apache::response::start_response($parstack,$safeeval);
17: return '';
1.1 albertel 18: }
19:
20: sub end_radiobuttonresponse {
1.22 ! albertel 21: &Apache::response::end_response;
! 22: return '';
1.1 albertel 23: }
24:
1.22 ! albertel 25: %Apache::response::foilgroup={};
1.1 albertel 26: sub start_foilgroup {
1.22 ! albertel 27: %Apache::response::foilgroup={};
! 28: $Apache::radiobuttonresponse::conceptgroup=0;
! 29: &Apache::response::setrandomnumber();
! 30: return '';
1.5 albertel 31: }
32:
1.15 albertel 33: sub storesurvey {
1.22 ! albertel 34: if ( defined $ENV{'form.submitted'}) {
! 35: my $response = $ENV{'form.HWVAL'.$Apache::inputtags::response['-1']};
! 36: &Apache::lonxml::debug("Here I am!:$response:");
! 37: if ( $response =~ /[^\s]/) {
! 38: my $id = $Apache::inputtags::response['-1'];
! 39: $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.submission"}=$response;
! 40: $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.awarddetail"}='SUBMITTED';
! 41: &Apache::lonxml::debug("submitted a $response<br />\n");
1.15 albertel 42: }
1.22 ! albertel 43: }
! 44: return '';
1.15 albertel 45: }
46:
1.1 albertel 47: sub end_foilgroup {
1.22 ! albertel 48: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 49:
! 50: my $result;
! 51: if ($target ne 'meta') {
! 52: my $style = &Apache::lonxml::get_param('style',$parstack,$safeeval,'-2');
! 53: if ( $style eq 'survey' ) {
! 54: if ($target eq 'web') {
! 55: $result=&displayallfoils();
! 56: } elsif ( $target eq 'grade' ) {
! 57: $result=&storesurvey();
! 58: }
! 59: } else {
! 60: my $name;
! 61: my ($truecnt,$falsecnt,$max) = &getfoilcounts($parstack,$safeeval);
! 62: my $count=0;
! 63: # we will add in 1 of the true statements
! 64: if (($falsecnt+1)>$max) { $count=$max } else { $count=$falsecnt+1; }
! 65: my $answer = int(rand ($count));
! 66: &Apache::lonxml::debug("Answer is $answer, $count from $max, $falsecnt");
! 67: if ($target eq 'web') {
! 68: $result=&displayfoils($max,$answer);
! 69: } elsif ( $target eq 'grade') {
! 70: if ( defined $ENV{'form.submitted'}) {
! 71: my $response = $ENV{'form.HWVAL'.$Apache::inputtags::response['-1']};
! 72: if ( $response =~ /[^\s]/) {
! 73: my $id = $Apache::inputtags::response['-1'];
! 74: $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.submission"}=$response;
! 75: &Apache::lonxml::debug("submitted a $response<br />\n");
! 76: if ($response == $answer) {
! 77: $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.awarddetail"}='EXACT_ANS';
! 78: } else {
! 79: $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.awarddetail"}='INCORRECT';
1.15 albertel 80: }
1.22 ! albertel 81: }
1.5 albertel 82: }
1.22 ! albertel 83: }
1.5 albertel 84: }
1.22 ! albertel 85: }
! 86: return $result;
1.6 albertel 87: }
88:
89: sub getfoilcounts {
1.22 ! albertel 90: my ($parstack,$safeeval)=@_;
! 91: my $max = &Apache::lonxml::get_param('max',$parstack,$safeeval,'-2');
! 92: my @names = @{ $Apache::response::foilgroup{'names'} };
! 93: my $truecnt=0;
! 94: my $falsecnt=0;
! 95: my $name;
! 96:
! 97: foreach $name (@names) {
! 98: if ($Apache::response::foilgroup{$name.'.value'} eq 'true') {
! 99: $truecnt++;
! 100: } elsif ($Apache::response::foilgroup{$name.'.value'} eq 'false') {
! 101: $falsecnt++;
1.6 albertel 102: }
1.22 ! albertel 103: }
! 104: return ($truecnt,$falsecnt,$max);
1.5 albertel 105: }
106:
1.15 albertel 107: sub displayallfoils {
1.22 ! albertel 108: my $result;
! 109: &Apache::lonxml::debug("survey style display");
! 110: my @names = @{ $Apache::response::foilgroup{'names'} };
! 111: my $temp=0;
! 112: my $id=$Apache::inputtags::response['-1'];
! 113: my $part=$Apache::inputtags::part;
! 114: my $lastresponse=$Apache::lonhomework::history{"resource.$part.$id.submission"};
! 115: foreach my $name (@names) {
! 116: if ($Apache::response::foilgroup{$name.'.value'} ne 'unused') {
! 117: $result.="<br /><input type=\"radio\" name=\"HWVAL$Apache::inputtags::response['-1']\" value=\"$temp\" ";
! 118: if ($lastresponse eq $temp) { $result .= 'checked="on"'; }
! 119: $result .= '>'.$Apache::response::foilgroup{$name.'.text'}."</input>\n";
! 120: $temp++;
1.15 albertel 121: }
1.22 ! albertel 122: }
! 123: return $result;
1.15 albertel 124: }
125:
1.5 albertel 126: sub displayfoils {
1.22 ! albertel 127: my ($max,$answer)=@_;
! 128: my @names = @{ $Apache::response::foilgroup{'names'} };
! 129: my @truelist;
! 130: my @falselist;
! 131: my $result;
! 132: my $name;
! 133:
! 134: foreach $name (@names) {
! 135: #result.="<br /><b>$name</b> is <i> $Apache::response::foilgroup{$name.'.value'} </i>";
! 136: if ($Apache::response::foilgroup{$name.'.value'} eq 'true') {
! 137: push (@truelist,$name);
! 138: } elsif ($Apache::response::foilgroup{$name.'.value'} eq 'false') {
! 139: push (@falselist,$name);
! 140: } elsif ($Apache::response::foilgroup{$name.'.value'} eq 'unused') {
! 141: } else {
! 142: &Apache::lonxml::error("Unknown state $Apache::response::foilgroup{$name.'.value'} for $name in <foilgroup>");
1.3 albertel 143: }
1.22 ! albertel 144: }
! 145: my $whichtrue = int(rand($#truelist+1));
! 146: &Apache::lonxml::debug("Max is $max, From $#truelist elms, picking $whichtrue");
! 147: my @whichfalse =();
! 148: while ((($#whichfalse+1) < $max) && ($#falselist > -1)) {
! 149: &Apache::lonxml::debug("Have $#whichfalse max is $max");
! 150: my $afalse=int(rand($#falselist+1));
! 151: &Apache::lonxml::debug("From $#falselist elms, picking $afalse");
! 152: $afalse=splice(@falselist,$afalse,1);
! 153: &Apache::lonxml::debug("Picked $afalse");
! 154: push (@whichfalse,$afalse);
! 155: }
! 156: splice(@whichfalse,$answer,0,$truelist[$whichtrue]);
! 157: &Apache::lonxml::debug("the true statement is $answer");
! 158: if ($Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"} =~ /^correct/ ) {
! 159: foreach $name (@whichfalse) {
! 160: $result.="<br />";
! 161: if ($Apache::response::foilgroup{$name.'.value'} eq 'true') {
! 162: $result.='Correct';
! 163: } else {
! 164: $result.='Incorrect';
! 165: }
! 166: $result.=":".$Apache::response::foilgroup{$name.'.text'}."</input>\n";
1.10 albertel 167: }
1.22 ! albertel 168: } else {
! 169: my $temp=0;
! 170: my $id=$Apache::inputtags::response['-1'];
! 171: my $part=$Apache::inputtags::part;
! 172: my $lastresponse=$Apache::lonhomework::history{"resource.$part.$id.submission"};
! 173: foreach $name (@whichfalse) {
! 174: $result.="<br /><input type=\"radio\" name=\"HWVAL$Apache::inputtags::response['-1']\" value=\"$temp\" ";
! 175: if ($lastresponse eq $temp) { $result .= 'checked="on"'; }
! 176: $result .= '>'.$Apache::response::foilgroup{$name.'.text'}."</input>\n";
! 177: $temp++;
1.10 albertel 178: }
1.22 ! albertel 179: }
! 180: return $result."<br />";
1.14 albertel 181: }
182:
183: sub start_conceptgroup {
1.22 ! albertel 184: $Apache::radiobuttonresponse::conceptgroup=1;
! 185: %Apache::response::conceptgroup={};
! 186: return '';
1.14 albertel 187: }
188:
189: sub end_conceptgroup {
1.22 ! albertel 190: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 191: $Apache::radiobuttonresponse::conceptgroup=0;
! 192: if ($target eq 'web' || $target eq 'grade') {
! 193: my @names = @{ $Apache::response::conceptgroup{'names'} };
! 194: my $pick=int rand $#names+1;
! 195: my $name=$names[$pick];
! 196: push @{ $Apache::response::foilgroup{'names'} }, $name;
! 197: $Apache::response::foilgroup{"$name.text"} = $Apache::response::conceptgroup{"$name.text"};
! 198: $Apache::response::foilgroup{"$name.value"} = $Apache::response::conceptgroup{"$name.value"};
! 199: my $concept = &Apache::lonxml::get_param('concept',$parstack,$safeeval);
! 200: $Apache::response::foilgroup{"$name.concept"} = $concept;
! 201: &Apache::lonxml::debug("Selecting $name in $concept");
! 202: }
! 203: return '';
1.1 albertel 204: }
205:
206: sub start_foil {
1.22 ! albertel 207: &Apache::lonxml::startredirection;
! 208: return '';
1.1 albertel 209: }
210:
211: sub end_foil {
1.22 ! albertel 212: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 213: my $text='';
! 214: if ($target eq 'web') { $text=&Apache::lonxml::endredirection; }
! 215: if ($target eq 'web' || $target eq 'grade') {
1.19 albertel 216: my $value = &Apache::lonxml::get_param('value',$parstack,$safeeval);
1.18 albertel 217: if ($value ne 'unused') {
1.19 albertel 218: my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval);
1.18 albertel 219: if ( $Apache::radiobuttonresponse::conceptgroup ) {
220: push @{ $Apache::response::conceptgroup{'names'} }, $name;
221: $Apache::response::conceptgroup{"$name.value"} = $value;
222: $Apache::response::conceptgroup{"$name.text"} = $text;
223: } else {
224: push @{ $Apache::response::foilgroup{'names'} }, $name;
225: $Apache::response::foilgroup{"$name.value"} = $value;
226: $Apache::response::foilgroup{"$name.text"} = $text;
227: }
228: }
1.4 albertel 229: }
1.1 albertel 230: return '';
231: }
232:
233: 1;
234: __END__
235:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>