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:
parent
88d6a0d067
commit
cf98c81461
6 changed files with 220 additions and 203 deletions
|
|
@ -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 } );
|
||||
|
|
|
|||
|
|
@ -815,8 +815,13 @@ sub responseValuesByVariableName {
|
|||
my %options = validate(@_, { useText => 0 });
|
||||
|
||||
my %lookup;
|
||||
while (my ($address, $response) = each %{$self->responses}) {
|
||||
next if (!$response || !$address);
|
||||
|
||||
# Process responses in id order (so that questions with maxAnswers != 1 stringify according
|
||||
# to natural ordering of answers (e.g. answer 0, answer 1, etc..
|
||||
for my $address (sort keys %{$self->responses}) {
|
||||
next if !$address;
|
||||
my $response = $self->responses->{$address};
|
||||
next if !$response;
|
||||
|
||||
# Turn responses s-q-a string into an address array
|
||||
my @address = split /-/, $address;
|
||||
|
|
@ -846,7 +851,11 @@ sub responseValuesByVariableName {
|
|||
}
|
||||
|
||||
# Add variable => value to our hash
|
||||
$lookup{$question->{variable}} = $value;
|
||||
if (!$question->{maxAnswers} || $question->{maxAnswers} > 1) {
|
||||
push @{$lookup{$question->{variable}}}, $value;
|
||||
} else {
|
||||
$lookup{$question->{variable}} = $value;
|
||||
}
|
||||
}
|
||||
return \%lookup;
|
||||
}
|
||||
|
|
@ -866,8 +875,11 @@ sub responseScoresByVariableName {
|
|||
my $self = shift;
|
||||
|
||||
my %lookup;
|
||||
while (my ($address, $response) = each %{$self->responses}) {
|
||||
next if (!$response || !$address);
|
||||
# Process responses in id order, just to be consistent with responseValuesByVariableName
|
||||
for my $address (sort keys %{$self->responses}) {
|
||||
next if !$address;
|
||||
my $response = $self->responses->{$address};
|
||||
next if !$response;
|
||||
|
||||
# Turn responses s-q-a string into an address array
|
||||
my @address = split /-/, $address;
|
||||
|
|
@ -887,8 +899,8 @@ sub responseScoresByVariableName {
|
|||
# Use question score if answer score undefined
|
||||
my $score = (exists $answer->{value} && length $answer->{value} > 0) ? $answer->{value} : $question->{value};
|
||||
|
||||
# Add variable => score to our hash
|
||||
$lookup{$question->{variable}} = $score;
|
||||
# Add variable => score to our hash (or add to existing score for multi-answer questions, e.g. maxAnswers != 1)
|
||||
$lookup{$question->{variable}} += $score;
|
||||
}
|
||||
|
||||
# Add section score totals
|
||||
|
|
@ -933,6 +945,11 @@ A hash reference. Each matching key in the string will be replaced with its asso
|
|||
sub getTemplatedText {
|
||||
my $self = shift;
|
||||
my ($text, $params) = validate_pos(@_, { type => SCALAR }, { type => HASHREF });
|
||||
|
||||
# Turn multi-valued answers into comma-separated text
|
||||
for my $value (values %$params) {
|
||||
$value = join(',', @$value) if ref $value eq 'ARRAY';
|
||||
}
|
||||
|
||||
# Replace all instances of [[var]] with the value from the $params hash reference
|
||||
$text =~ s/\[\[([^\%]*?)\]\]/$params->{$1}/eg;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue