Skip to content

Commit 95122cf

Browse files
committed
Fix the handling of values for multiple choice types
Choice values must always be strings, but a place was missing the casting, breaking the comparison of selected choices when the callback does not return a string.
1 parent d83582a commit 95122cf

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

ChoiceList/ArrayChoiceList.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ public function getValuesForChoices(array $choices)
155155
$givenValues = array();
156156

157157
foreach ($choices as $i => $givenChoice) {
158-
$givenValues[$i] = call_user_func($this->valueCallback, $givenChoice);
158+
$givenValues[$i] = (string) call_user_func($this->valueCallback, $givenChoice);
159159
}
160160

161161
return array_intersect($givenValues, array_keys($this->choices));

Tests/Extension/Core/Type/ChoiceTypeTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,6 +1327,42 @@ public function testSubmitMultipleExpandedNumericChoices()
13271327
$this->assertNull($form[4]->getViewData());
13281328
}
13291329

1330+
public function testSingleSelectedObjectChoices()
1331+
{
1332+
$form = $this->factory->create('choice', $this->objectChoices[3], array(
1333+
'multiple' => false,
1334+
'expanded' => false,
1335+
'choices' => $this->objectChoices,
1336+
'choices_as_values' => true,
1337+
'choice_label' => 'name',
1338+
'choice_value' => 'id',
1339+
));
1340+
1341+
$view = $form->createView();
1342+
$selectedChecker = $view->vars['is_selected'];
1343+
1344+
$this->assertTrue($selectedChecker($view->vars['choices'][3]->value, $view->vars['value']));
1345+
$this->assertFalse($selectedChecker($view->vars['choices'][1]->value, $view->vars['value']));
1346+
}
1347+
1348+
public function testMultipleSelectedObjectChoices()
1349+
{
1350+
$form = $this->factory->create('choice', array($this->objectChoices[3]), array(
1351+
'multiple' => true,
1352+
'expanded' => false,
1353+
'choices' => $this->objectChoices,
1354+
'choices_as_values' => true,
1355+
'choice_label' => 'name',
1356+
'choice_value' => 'id',
1357+
));
1358+
1359+
$view = $form->createView();
1360+
$selectedChecker = $view->vars['is_selected'];
1361+
1362+
$this->assertTrue($selectedChecker($view->vars['choices'][3]->value, $view->vars['value']));
1363+
$this->assertFalse($selectedChecker($view->vars['choices'][1]->value, $view->vars['value']));
1364+
}
1365+
13301366
/*
13311367
* We need this functionality to create choice fields for Boolean types,
13321368
* e.g. false => 'No', true => 'Yes'

0 commit comments

Comments
 (0)