diff --git a/system/Helpers/form_helper.php b/system/Helpers/form_helper.php index b030b2f06009..465da04f6034 100644 --- a/system/Helpers/form_helper.php +++ b/system/Helpers/form_helper.php @@ -295,14 +295,14 @@ function form_dropdown($data = '', $options = [], $selected = [], $extra = ''): if ($selected === []) { $superglobals = service('superglobals'); if (is_array($data)) { - $postValue = $superglobals->post($data['name'] ?? ''); + $postValue = $superglobals->post(preg_replace('/\[\]$/', '', $data['name'] ?? '')); if (isset($data['name']) && $postValue !== null) { - $selected = [$postValue]; + $selected = is_array($postValue) ? $postValue : [$postValue]; } } else { - $postValue = $superglobals->post($data); + $postValue = $superglobals->post(preg_replace('/\[\]$/', '', $data)); if ($postValue !== null) { - $selected = [$postValue]; + $selected = is_array($postValue) ? $postValue : [$postValue]; } } } diff --git a/tests/system/Helpers/FormHelperTest.php b/tests/system/Helpers/FormHelperTest.php index 7ed8c8668123..bfd3d12e0efe 100644 --- a/tests/system/Helpers/FormHelperTest.php +++ b/tests/system/Helpers/FormHelperTest.php @@ -588,6 +588,36 @@ public function testFormDropdownInferred(): void service('superglobals')->unsetPost('cars'); } + public function testFormDropdownInferredArray(): void + { + $options = [ + 'Swedish Cars' => [ + 'volvo' => 'Volvo', + 'saab' => 'Saab', + ], + 'German Cars' => [ + 'mercedes' => 'Mercedes', + 'audi' => 'Audi', + ], + ]; + $expected = << + + + + + + + + + \n + EOH; + service('superglobals')->setPost('cars', ['volvo', 'audi']); + $this->assertSame($expected, form_dropdown('cars', $options)); + $this->assertSame($expected, form_dropdown(['name' => 'cars'], $options)); + service('superglobals')->unsetPost('cars'); + } + public function testFormDropdownWithSelectedAttribute(): void { $expected = <<<'EOH' @@ -684,6 +714,29 @@ public function testFormMultiselectArrayData(): void $this->assertSame($expected, form_multiselect($data)); } + public function testFormMultiselectInferred(): void + { + $expected = << + + + + + \n + EOH; + $options = [ + 'small' => 'Small Shirt', + 'med' => 'Medium Shirt', + 'large' => 'Large Shirt', + 'xlarge' => 'Extra Large Shirt', + ]; + + service('superglobals')->setPost('shirts', ['med', 'large']); + $this->assertSame($expected, form_multiselect('shirts[]', $options)); + $this->assertSame($expected, form_multiselect(['name' => 'shirts[]', 'options' => $options])); + service('superglobals')->unsetPost('shirts'); + } + public function testFormFieldset(): void { $expected = <<