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()