diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index dab93ea830..d4d245a4d3 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -16,6 +16,7 @@ Yii Framework 2 Change Log - Enh #19304: Add filtering validator `yii\validators\TrimValidator` (WinterSilence) - Enh #19309: Optimize `yii\base\Model::attributes()` (WinterSilence) - Bug #19322: Revert force setting value to empty string in case it's `null` in `yii\validators\FilterValidator::validateAttribute()` (bizley) +- Bug #19324: Fix `yii\helpers\BaseHtml::renderSelectOptions()` giving wrong selection for boolean attributes (adnandautovic) - Bug #19329: Fix `yii\web\GroupUrlRule` to properly normalize prefix (bizley) - Bug #19328: Passing null to parameter #1 ($string) of type string is deprecated in `yii\db\oci\Schema` (Arkeins) - Bug #19237: Fix OCI PHP 8.1 passing `null` to trim() (longthanhtran) diff --git a/framework/helpers/BaseHtml.php b/framework/helpers/BaseHtml.php index 5abf8afc82..1e0d8702dd 100644 --- a/framework/helpers/BaseHtml.php +++ b/framework/helpers/BaseHtml.php @@ -1914,7 +1914,7 @@ class BaseHtml $attrs['value'] = (string) $key; if (!array_key_exists('selected', $attrs)) { $attrs['selected'] = $selection !== null && - (!ArrayHelper::isTraversable($selection) && !strcmp($key, $selection) + (!ArrayHelper::isTraversable($selection) && ($strict ? !strcmp($key, $selection) : $selection == $key) || ArrayHelper::isTraversable($selection) && ArrayHelper::isIn((string)$key, $selection, $strict)); } $text = $encode ? static::encode($value) : $value; diff --git a/tests/framework/helpers/HtmlTest.php b/tests/framework/helpers/HtmlTest.php index 3dfd9f8334..9e8eb4b500 100644 --- a/tests/framework/helpers/HtmlTest.php +++ b/tests/framework/helpers/HtmlTest.php @@ -775,6 +775,14 @@ EOD; EOD; $this->assertEqualsWithoutLE($expected, Html::checkboxList('test', ['1.1'], ['1' => '1', '1.1' => '1.1', '1.10' => '1.10'], ['strict' => true])); + $this->assertEqualsWithoutLE($expected, Html::checkboxList('test', [1.1], ['1' => '1', '1.1' => '1.1', '1.10' => '1.10'], ['strict' => true])); + + $expected = <<<'EOD' +
+ +
+EOD; + $this->assertEqualsWithoutLE($expected, Html::checkboxList('test', [1.1], ['1' => '1', '1.1' => '1.1', '1.10' => '1.10'])); } public function testRadioListWithArrayExpression() @@ -923,6 +931,14 @@ EOD; EOD; $this->assertEqualsWithoutLE($expected, Html::radioList('test', ['1.1'], ['1' => '1', '1.1' => '1.1', '1.10' => '1.10'], ['strict' => true])); + $this->assertEqualsWithoutLE($expected, Html::radioList('test', [1.1], ['1' => '1', '1.1' => '1.1', '1.10' => '1.10'], ['strict' => true])); + + $expected = <<<'EOD' +
+ +
+EOD; + $this->assertEqualsWithoutLE($expected, Html::radioList('test', ['1.1'], ['1' => '1', '1.1' => '1.1', '1.10' => '1.10'])); } public function testUl() @@ -1069,6 +1085,15 @@ EOD; $data = ['1' => '1', '1.1' => '1.1', '1.10' => '1.10']; $attributes = ['strict' => true]; $this->assertEqualsWithoutLE($expected, Html::renderSelectOptions(['1.1'], $data, $attributes)); + $attributes = ['strict' => true]; + $this->assertEqualsWithoutLE($expected, Html::renderSelectOptions([1.1], $data, $attributes)); + + $expected = <<<'EOD' + + + +EOD; + $this->assertEqualsWithoutLE($expected, Html::renderSelectOptions([1.1], $data)); $expected = <<<'EOD' @@ -1080,6 +1105,27 @@ EOD; $data = ['1' => '1', '1.1' => '1.1', 'group' => ['1.10' => '1.10']]; $attributes = ['strict' => true]; $this->assertEqualsWithoutLE($expected, Html::renderSelectOptions(['1.10'], $data, $attributes)); + + $expected = <<<'EOD' + + + +EOD; + $data = [true => 'Yes', false => 'No']; + $attributes = ['prompt' => 'Please select']; + $this->assertEqualsWithoutLE($expected, Html::renderSelectOptions(false, $data, $attributes)); + //$attributes = ['prompt' => 'Please select']; + //$this->assertEqualsWithoutLE($expected, Html::renderSelectOptions([false], $data, $attributes)); + + $expected = <<<'EOD' + + + +EOD; + $attributes = ['prompt' => 'Please select', 'strict' => true]; + $this->assertEqualsWithoutLE($expected, Html::renderSelectOptions(false, $data, $attributes)); + $attributes = ['prompt' => 'Please select', 'strict' => true]; + $this->assertEqualsWithoutLE($expected, Html::renderSelectOptions([false], $data, $attributes)); } public function testRenderTagAttributes()