Fixed Survey's handling of multi-answer questions (e.g. maxAnswers != 1)

Now stores all supplied answers to multi-answer question as arrayref
Variable [[var]] text replacement converts to comma-separated list
Expression Engine's value() returns appropriate value depending on context
Expression Engine's score() does sum of multi-answers, as you would expect
Updated related i18n & hover-help, and tests
Cleaned up survey js somewhat
This commit is contained in:
Patrick Donelan 2009-05-08 08:00:04 +00:00
parent 88d6a0d067
commit cf98c81461
6 changed files with 220 additions and 203 deletions

View file

@ -45,8 +45,19 @@ Returns the recorded response value for the answer to question_variable
sub value {
my $key = shift;
my $value = $tags->{$key} || $values->{$key};
$session->log->debug("value($key) resolves to [$value]");
return $value; # scalar variable, so no need to clone
if (ref $value eq 'ARRAY') {
my $joined = join ', ', @$value;
if (wantarray) {
$session->log->debug("value($key) in list context resolves to ($joined)");
return @$value;
} else {
$session->log->debug("value($key) in scalar|void context resolves to \"$joined\"");
return $joined;
}
} else {
$session->log->debug("value($key) resolves to [$value]");
return $value;
}
}
=head2 valueX
@ -64,8 +75,19 @@ sub valueX {
if (my $other_instance = $otherInstances->{$asset_spec}) {
my $values = $other_instance->{values};
my $value = $values->{$key};
$session->log->debug("valueX($asset_spec, $key) resolves to [$value]");
return $value;
if (ref $value eq 'ARRAY') {
my $joined = join ', ', @$value;
if (wantarray) {
$session->log->debug("valueX($asset_spec, $key) in list context resolves to ($joined)");
return @$value;
} else {
$session->log->debug("valueX($asset_spec, $key) in scalar|void context resolves to \"$joined\"");
return $joined;
}
} else {
$session->log->debug("valueX($asset_spec, $key) resolves to [$value]");
return $value;
}
} else {
# Throw an exception, triggering run() to resolve the external reference and re-run
die( { other_instance => $asset_spec } );