From 571b05bcce14a89395c8e85ce1c0897b04be3d24 Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 15 Aug 2023 05:41:40 +0900 Subject: [PATCH 1/2] test: add test for set_checkbox() --- tests/system/Helpers/FormHelperTest.php | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/system/Helpers/FormHelperTest.php b/tests/system/Helpers/FormHelperTest.php index 639d03c48f..ca90ce53c1 100644 --- a/tests/system/Helpers/FormHelperTest.php +++ b/tests/system/Helpers/FormHelperTest.php @@ -867,6 +867,29 @@ final class FormHelperTest extends CIUnitTestCase $this->assertSame(' checked="checked"', set_checkbox('foo', '0', true)); } + /** + * @see https://github.com/codeigniter4/CodeIgniter4/issues/7814 + */ + public function testSetCheckboxWithUnchecked(): void + { + $_SESSION = [ + '_ci_old_input' => [ + 'post' => [ + ], + ], + ]; + + $this->assertSame( + '', + set_checkbox('fruit', 'apple', true) + ); + + $this->assertSame( + '', + set_checkbox('fruit', 'apple') + ); + } + /** * @runInSeparateProcess * @preserveGlobalState disabled From f2f7dcf22366fdd145406b955335b734007e891e Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 15 Aug 2023 05:42:33 +0900 Subject: [PATCH 2/2] fix: set_checkbox() incorrect checking set_checkbox() with default true checks unchecked checkbox when redirected back with input. --- system/Helpers/form_helper.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/system/Helpers/form_helper.php b/system/Helpers/form_helper.php index c553bddee2..7f8f191a3a 100644 --- a/system/Helpers/form_helper.php +++ b/system/Helpers/form_helper.php @@ -629,8 +629,11 @@ if (! function_exists('set_checkbox')) { return ''; } + $session = Services::session(); + $hasOldInput = $session->has('_ci_old_input'); + // Unchecked checkbox and radio inputs are not even submitted by browsers ... - if ((string) $input === '0' || ! empty($request->getPost()) || ! empty(old($field))) { + if ((string) $input === '0' || ! empty($request->getPost()) || $hasOldInput) { return ($input === $value) ? ' checked="checked"' : ''; }