--- loncom/interface/lonhelper.pm 2009/06/15 11:18:11 1.176 +++ loncom/interface/lonhelper.pm 2010/01/12 10:40:01 1.177 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # .helper XML handler to implement the LON-CAPA helper # -# $Id: lonhelper.pm,v 1.176 2009/06/15 11:18:11 bisitz Exp $ +# $Id: lonhelper.pm,v 1.177 2010/01/12 10:40:01 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -2195,20 +2195,42 @@ sub start_option { if (!defined($paramHash->{OPTION_TEXTS})) { $paramHash->{OPTION_TEXTS} = [ ]; $paramHash->{OPTION_VARS} = [ ]; + $paramHash->{OPTION_TYPES} = [ ]; } + # We can have an attribute: type which can have the + # values: "checkbox" or "text" which defaults to + # checkbox allowing us to change the type of input + # for the option: + # + my $input_widget_type = 'checkbox'; + if(defined($token->[2]{'type'})) { + my $widget_type = $token->[2]{'type'}; + if ($widget_type eq 'text') { # only accept legal alternatives + $input_widget_type = $widget_type; # Illegals are checks. + } elsif ($widget_type eq 'hidden') { + $input_widget_type = $widget_type; + } + } + # OPTION_TEXTS is a list of the text attribute # values used to create column headings. # OPTION_VARS is a list of the variable names, used to create the checkbox # inputs. + # OPTION_TYPES is a list of the option types: + # # We're ok with empty elements. as place holders # Although the 'variable' element should really exist. # + my $option_texts = $paramHash->{OPTION_TEXTS}; my $option_vars = $paramHash->{OPTION_VARS}; + my $option_types = $paramHash->{OPTION_TYPES}; push(@$option_texts, $token->[2]{'text'}); push(@$option_vars, $token->[2]{'variable'}); + push(@$option_types, $input_widget_type); + # Need to create and declare the option variables as well to make them # persistent. @@ -2284,6 +2306,7 @@ BUTTONS my $multichoice = $self->{'multichoice'}; my $option_vars = $self->{OPTION_VARS}; my $option_texts = $self->{OPTION_TEXTS}; + my $option_types = $self->{OPTION_TYPES}; my $addparts = $self->{'addparts'}; my $headings_done = 0; @@ -2342,17 +2365,50 @@ BUTTONS my $resource_name = HTML::Entities::encode($raw_name,"<>&\"'"); if($option_vars) { + my $option_num = 0; foreach my $option_var (@$option_vars) { + my $option_type = $option_types->[$option_num]; + $option_num++; my $var_value = "\|\|\|" . $helper->{VARS}->{$option_var} . "\|\|\|"; my $checked =""; if($var_value =~ /\Q|||$raw_name|||\E/) { $checked = "checked='checked'"; } - $col .= - " "; + if ($option_type eq 'text') { + # + # For text's the variable value is a ||| separated set of + # resource_name=value + # + my @values = split(/\|\|\|/, $helper->{VARS}->{$option_var}); + + # Normal practice would be to toss this in a hash but + # the only thing that saves is the compare in the loop + # below and for all but one case we'll break out of the loop + # before it completes. + + my $text_value = ''; # In case there's no match. + foreach my $value (@values) { + my ($res, $skip) = split(/=/, $value); + if($res eq $resource_name) { + $text_value = $skip; + last; + } + } + + $col .= + " "; + } elsif ($option_type eq 'hidden') { + $col .= " "; + } else { + $col .= + " "; + } } }