Skip to content

Commit 64f4624

Browse files
committed
MultiChoiceControl: fixed order of selected items
1 parent 62ce2d0 commit 64f4624

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

src/Forms/Controls/MultiChoiceControl.php

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,13 @@ public function getItems(): array
118118
*/
119119
public function getSelectedItems(): array
120120
{
121-
$selected = array_intersect_key($this->items, array_flip($this->value));
122-
return is_array($this->disabled)
123-
? array_diff_key($selected, $this->disabled)
124-
: $selected;
121+
$res = [];
122+
foreach ($this->value as $key) {
123+
if (isset($this->items[$key]) && !isset($this->disabled[$key])) {
124+
$res[$key] = $this->items[$key];
125+
}
126+
}
127+
return $res;
125128
}
126129

127130

tests/Forms/Controls.MultiChoiceControl.loadData.phpt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,3 +245,16 @@ test('disabled items ignored in multi-choice', function () use ($series) {
245245

246246
Assert::same([0], $input->getValue());
247247
});
248+
249+
250+
test('order of selected items preserved', function () {
251+
$series = [1 => 'Ananas', 2 => 'Banana', 3 => 'Lemon'];
252+
$_POST = ['select' => ['3', '2']];
253+
254+
$form = new Form;
255+
$input = $form['select'] = new MultiChoiceControl(null, $series);
256+
257+
Assert::same([3, 2], $input->getValue());
258+
Assert::same([3 => 'Lemon', 2 => 'Banana'], $input->getSelectedItems());
259+
Assert::true($input->isFilled());
260+
});

0 commit comments

Comments
 (0)