[LON-CAPA-cvs] cvs: loncom(BZ4492) /homework radiobuttonresponse.pm
foxr
foxr at source.lon-capa.org
Mon Jan 30 06:36:55 EST 2012
foxr Mon Jan 30 11:36:55 2012 EDT
Modified files: (Branch: BZ4492)
/loncom/homework radiobuttonresponse.pm
Log:
BZ4492
- Factor out foil filtering in displayallfoils
- Factor out display_survey_htmlfrom displayallfoils.
-------------- next part --------------
Index: loncom/homework/radiobuttonresponse.pm
diff -u loncom/homework/radiobuttonresponse.pm:1.153.6.7 loncom/homework/radiobuttonresponse.pm:1.153.6.8
--- loncom/homework/radiobuttonresponse.pm:1.153.6.7 Wed Jan 25 12:00:33 2012
+++ loncom/homework/radiobuttonresponse.pm Mon Jan 30 11:36:55 2012
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# mutliple choice style responses
#
-# $Id: radiobuttonresponse.pm,v 1.153.6.7 2012/01/25 12:00:33 foxr Exp $
+# $Id: radiobuttonresponse.pm,v 1.153.6.8 2012/01/30 11:36:55 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -375,46 +375,25 @@
}
-##
-sub displayallfoils{
- my ( $direction, $target ) = @_;
- my $result;
- &Apache::lonxml::debug("survey style display");
- my @names;
- if ( $Apache::response::foilgroup{'names'} ) {
- @names = @{ $Apache::response::foilgroup{'names'} };
- }
-
- # Figure out how to bracket the list of foils for
- # the TeX target:
- #
-
- my $begin_environment;
- my $end_environment;
-
- if ($target eq 'tex') {
-
- # Decide how to bracket the list of foils:
-
+##
+# Return the last survey response. The logic is slightly different than that of
+# get_last_responses. TODO: See if there are chunks of code betweenthis and
+# get_last_reponses that are common and can be factored.
+#
+# @param $part - Problem part under consideration.
+# @param $showanswer - True if answers should be shown.
+# @param $id - Problem id.
+#
+# @return hash reference.
+# @retval reference to the has indexed by answer selection that
+# indicates the most recent answer.
+#
+sub get_last_survey_response {
+ my ($part, $showanswer, $id) = @_;
- if ( $env{'form.pdfFormFields'} eq 'yes'
- && $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )
- {
- $begin_environment = '\begin{itemize}';
- $end_environment = '\end{itemize}';
- }
- else {
- $begin_environment = '\begin{enumerate}';
- $end_environment = '\end{enumerate}';
- }
- $result .= $begin_environment;
- }
+ my $newvariation;
+ my $lastresponse; # stringified last response.
- my $temp = 0;
- my $i = 0;
- my $id = $Apache::inputtags::response['-1'];
- my $part = $Apache::inputtags::part;
- my ( $lastresponse, $newvariation, $showanswer );
if (
(
(
@@ -432,7 +411,6 @@
$newvariation = 1;
}
}
- $showanswer = &Apache::response::show_answer();
unless (
(
(
@@ -449,122 +427,237 @@
$lastresponse =
$Apache::lonhomework::history{"resource.$part.$id.submission"};
}
- if ( $direction eq 'horizontal' && $target ne 'tex') {
- $result .= '<table><tr>';
- }
my %lastresponse = &Apache::lonnet::str2hash($lastresponse);
+
+
+ return \%lastresponse;
+
+}
+##
+# Removes the names from a foil group that are marked as unused.
+#
+# @param $names - reference to the array of names to filter.
+#
+# @return arrayref
+# @retval reference to the filtered array.
+#
+sub remove_unused {
+ my ($names) = @_;
+ my @result;
+
+ foreach my $name (@{$names}) {
+ if ($Apache::response::foilgroup{$name . '.value'} ne 'unused') {
+ push(@result, $name);
+ }
+ }
+ return \@result;
+}
+##
+# Displays all foils in a survey type problem for HTML rendition.
+# TODO: See if there is any logic in this sub that can be shared
+# with display_foils_html
+#
+# @param $names - ref to array of names of the foils to display.
+# @param $part - Problem part number.
+# @param $showanswer - If true, show the answers.
+# @param $lastresponse - Ref to the last response hash.
+# @param $direction - Display direction of the radiobuttons.
+#
+# @return string
+# @retval HTML required to display the resource in a browser.
+#
+sub display_survey_html {
+ my ($names, $part, $showanswer, $lastresponse, $direction) = @_;
+ my $result;
+
+ # Figure out a few fragments of html that depend onthe
+ # orientation of the radiobuttons:
+ # closing_html - HTML to emit at the end of the resource.
+ # pre_foil - HTML to emit prior to each foil.
+ # post_foil - HTML to emit following each foil.
+ #
+ # The opening HTML is just added to the $result now
+ #
+ # Figuring these outin advance compresses the loop over foils into something
+ # pretty simple:
+ #
+ # NOTE: There's probably a really cool way to do this with style sheets
+ # and picking the selector based on the orientation, if someone wants to puzzle
+ # that out. In that case, probably the whole thing lives in a <div> and each
+ # foil lives in a <p>
+ #
+
+ my $closing_html;
+ my $pre_foil;
+ my $post_foil;
+
+ if ($direction eq 'horizontal') {
+ $result .= '<table><tr>';
+ $closing_html = '</tr></table>';
+ $pre_foil = '<td>';
+ $post_foil = '</td>';
+ } else {
+ $pre_foil = '<br />';
+ }
+ # Different rendering depending on whether answers are shown:
+
+
if ($showanswer) {
- foreach my $name (@names) {
- if ( $Apache::response::foilgroup{ $name . '.value' } ne 'unused' )
- {
- if ( ( $direction eq 'horizontal' ) && ( $target ne 'tex' ) ) {
- $result .= "<td>";
- }
- else {
- if ( $target eq 'tex' ) {
- $result .= '\item \vskip -2mm ';
- }
- else {
- $result .= "<br />";
- }
- }
- if ( defined( $lastresponse{$name} ) ) {
- if ( $target eq 'tex' ) {
- $result .= '}';
- }
- else {
- $result .= '<b>';
- }
- }
- $result .= $Apache::response::foilgroup{ $name . '.text' };
- if ( defined( $lastresponse{$name} ) && ( $target ne 'tex' ) ) {
- $result .= '</b>';
- }
- if ( ( $direction eq 'horizontal' ) && ( $target ne 'tex' ) ) {
- $result .= "</td>";
- }
- }
- }
+ foreach my $name (@{$names}) {
+
+ $result .= $pre_foil;
+ my $foiltext = $Apache::response::foilgroup{$name . '.text'};
+
+ # Bold the prior response:
+
+ if (defined($lastresponse->{$name})) {
+ $result .= '<b>' . $foiltext . '</b>';
+ } else {
+ $result .= $foiltext;
+ }
+
+ $result .= $post_foil;
+ }
+ } else {
+ my $temp = 0;
+ foreach my $name (@{$names}) {
+ $result .= $pre_foil;
+
+ $result .= &html_radiobutton(
+ $part, $Apache::inputtags::response['-1'], $name, $lastresponse, $temp
+ );
+
+ $result .= $post_foil;
+ $temp++;
+
+ }
}
- else {
- foreach my $name (@names) {
- if ( $Apache::response::foilgroup{ $name . '.value' } ne 'unused' )
- {
- if ( $direction eq 'horizontal' && $target ne 'tex' ) {
- $result .= "<td>";
- }
- else {
- if ( $target eq 'tex' ) {
- if ( $env{'form.pdfFormFields'} eq 'yes'
- && $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )
- {
- my $fieldname =
- $env{'request.symb'}
- . '&part_'
- . $Apache::inputtags::part
- . '&radiobuttonresponse'
- . '&HWVAL_'
- . $Apache::inputtags::response['-1'];
- $result .= '\item[{'
- . &Apache::lonxml::print_pdf_radiobutton(
- $fieldname, $temp )
- . '}]'
- . $Apache::response::foilgroup{ $name . '.text' }
- . "\n";
- }
- else {
- $result .= '\item \vskip -2mm ';
- }
- }
- else {
- $result .= "<br />";
- }
- }
- if ( $target eq 'tex' ) {
- if ( $env{'form.pdfFormFields'} ne 'yes'
- or $Apache::inputtags::status[-1] ne 'CAN_ANSWER' )
- {
- $result .=
- '$\bigcirc$'
- . $Apache::response::foilgroup{ $name . '.text' }
- . '\\\\'; #' stupid emacs
- }
- $i++;
- }
- else {
- $result .= '<label>';
- $result .= "<input
- onchange=\"javascript:setSubmittedPart('$part');\"
- type=\"radio\"
- name=\"HWVAL_$Apache::inputtags::response['-1']\"
- value=\"$temp\"";
-
- if ( defined( $lastresponse{$name} ) ) {
- $result .= ' checked="checked"';
- }
- $result .= ' />'
- . $Apache::response::foilgroup{ $name . '.text' }
- . '</label>';
- }
- $temp++;
- if ( $target ne 'tex' ) {
- if ( ( $direction eq 'horizontal' )
- && ( $target ne 'tex' ) )
- {
- $result .= "</td>";
- }
- }
- else {
- $result .= '\vskip 0 mm ';
- }
- }
+
+ $result .= $closing_html;
+ return $result;
+
+}
+
+
+##
+#
+# Displays all the foils of a problem in a format suitable for
+# surveys, surveys for credit, anonymous surveys and anonymous surveys for credit.
+#
+# @param $direction - Display direction of the choices ('horiztonal' or not).
+# @param $target - Rendering target.
+#
+# @return string
+# @retval Text that renders for the selected target.
+#
+sub displayallfoils{
+ my ( $direction, $target ) = @_;
+ my $result;
+ &Apache::lonxml::debug("survey style display");
+ my @names;
+ if ( $Apache::response::foilgroup{'names'} ) {
+ @names = @{ $Apache::response::foilgroup{'names'} };
+ }
+
+ # Figure out how to bracket the list of foils for
+ # the TeX target:
+ #
+
+ my $begin_environment;
+ my $end_environment;
+
+ if ($target eq 'tex') {
+
+ # Decide how to bracket the list of foils:
+
+
+ if ( $env{'form.pdfFormFields'} eq 'yes'
+ && $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )
+ {
+ $begin_environment = '\begin{itemize}';
+ $end_environment = '\end{itemize}';
}
+ else {
+ $begin_environment = '\begin{enumerate}';
+ $end_environment = '\end{enumerate}';
+ }
+ $result .= $begin_environment;
}
- if ( ( $direction eq 'horizontal' ) && ( $target ne 'tex' ) ) {
- $result .= '</tr></table>';
+ my $temp = 0;
+ my $i = 0;
+ my $id = $Apache::inputtags::response['-1'];
+ my $part = $Apache::inputtags::part;
+ my $showanswer;
+ my $lastresponse;
+ $showanswer = &Apache::response::show_answer();
+
+ my $lastresponse = &get_last_survey_response($part, $showanswer, $id);
+
+ my $used_names = &remove_unused(\@names);
+
+
+ if ($target ne 'tex') {
+ $result .= &display_survey_html($used_names, $part, $showanswer, $lastresponse, $direction);
+ } else {
+
+ if ($showanswer) {
+ foreach my $name (@{$used_names}) {
+ if ( $Apache::response::foilgroup{ $name . '.value' } ne 'unused' )
+ {
+
+ $result .= '\item \vskip -2mm ';
+
+ if ( defined( $lastresponse->{$name} ) ) {
+ $result .= '}';
+ }
+ $result .= $Apache::response::foilgroup{ $name . '.text' };
+ }
+ }
+ } else {
+ foreach my $name (@{$used_names}) {
+ if ( $Apache::response::foilgroup{ $name . '.value' } ne 'unused' )
+ {
+ if ( $env{'form.pdfFormFields'} eq 'yes'
+ && $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )
+ {
+ my $fieldname =
+ $env{'request.symb'}
+ . '&part_'
+ . $Apache::inputtags::part
+ . '&radiobuttonresponse'
+ . '&HWVAL_'
+ . $Apache::inputtags::response['-1'];
+ $result .= '\item[{'
+ . &Apache::lonxml::print_pdf_radiobutton(
+ $fieldname, $temp )
+ . '}]'
+ . $Apache::response::foilgroup{ $name . '.text' }
+ . "\n";
+ }
+ else {
+ $result .= '\item \vskip -2mm ';
+ }
+
+ if ( $env{'form.pdfFormFields'} ne 'yes'
+ or $Apache::inputtags::status[-1] ne 'CAN_ANSWER' )
+ {
+ $result .=
+ '$\bigcirc$'
+ . $Apache::response::foilgroup{ $name . '.text' }
+ . '\\\\'; #' stupid emacs
+ }
+ $i++;
+
+ $temp++;
+
+ $result .= '\vskip 0 mm ';
+ }
+ }
+ }
}
+
# Close tex bracketing:
if ($target eq 'tex') {
@@ -887,14 +980,13 @@
# @param $target - Rendition target...there are several html targets.
# @param $direction - 'horizontal' if layout is horizontal.
# @param $part - Part of the problem that's being displayed.
-# @param $solved - Solution state of the problem.
# @param $show_answer- True if answers should be shown.
#
# @return string
# @retval generated html.
#
sub display_foils_html {
- my ($whichfoils, $target, $direction, $part, $solved, $show_answer) = @_;
+ my ($whichfoils, $target, $direction, $part, $show_answer) = @_;
my $result;
# if the answers get shown, we need to label each item as correct or
@@ -1188,7 +1280,7 @@
{
$result = &display_foils_html(
- $whichfoils, $target, $direction, $part, $solved, 1);
+ $whichfoils, $target, $direction, $part, 1);
# other html
} elsif ($target ne 'tex') {
More information about the LON-CAPA-cvs
mailing list