Skip to content

Commit d5b87df

Browse files
authored
Submit value of hidden field if checkbox is unchecked and matching hidden field exists
1 parent 4ffb91c commit d5b87df

File tree

4 files changed

+56
-5
lines changed

4 files changed

+56
-5
lines changed

src/Codeception/Lib/InnerBrowser.php

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,20 +1063,36 @@ protected function getFormFor(Crawler $node)
10631063
*/
10641064
protected function getFormValuesFor(Form $form)
10651065
{
1066+
$formNodeCrawler = new Crawler($form->getFormNode());
10661067
$values = [];
10671068
$fields = $form->all();
10681069
foreach ($fields as $field) {
1069-
if ($field instanceof FileFormField || $field->isDisabled() || !$field->hasValue()) {
1070+
if ($field instanceof FileFormField || $field->isDisabled()) {
10701071
continue;
10711072
}
1073+
1074+
if (!$field->hasValue()) {
1075+
// if unchecked a checkbox and if there is hidden input with same name to submit unchecked value
1076+
$hiddenInput = $formNodeCrawler->filter('input[type=hidden][name="'.$field->getName().'"]:not([disabled])');
1077+
if (!count($hiddenInput)) {
1078+
continue;
1079+
} else {
1080+
// there might be multiple hidden input with same name, but we will only grab last one's value
1081+
$fieldValue = $hiddenInput->last()->attr('value');
1082+
}
1083+
} else {
1084+
$fieldValue = $field->getValue();
1085+
}
1086+
1087+
10721088
$fieldName = $this->getSubmissionFormFieldName($field->getName());
10731089
if (substr($field->getName(), -2) === '[]') {
10741090
if (!isset($values[$fieldName])) {
10751091
$values[$fieldName] = [];
10761092
}
1077-
$values[$fieldName][] = $field->getValue();
1093+
$values[$fieldName][] = $fieldValue;
10781094
} else {
1079-
$values[$fieldName] = $field->getValue();
1095+
$values[$fieldName] = $fieldValue;
10801096
}
10811097
}
10821098
return $values;
@@ -1295,7 +1311,7 @@ public function sendAjaxGetRequest($uri, $params = [])
12951311
* 'task' => 'lorem ipsum',
12961312
* 'category' => 'miscellaneous',
12971313
* ]]);
1298-
* ```
1314+
* ```
12991315
*
13001316
* @param string $uri
13011317
* @param array $params

tests/data/app/view/form/button.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55
<button type="submit" name="btn0">Submit</button>
66
</form>
77
</body>
8-
</html>
8+
</html>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<form method="POST" action="/form/uncheck_hidden">
2+
3+
<input type="text" name="wireless" value="mouse">
4+
5+
<input type="hidden" name="coffee" value="123"> <!-- this should be discarded -->
6+
7+
<!-- Do you need coffee ? (label) -->
8+
<input type="hidden" name="coffee" value="8569" disabled="disabled">
9+
<input type="hidden" name="coffee" value="8">
10+
<input type="hidden" name="coffee" value="0">
11+
<input type="checkbox" name="coffee" value="1" id="coffee-id" checked>
12+
13+
<!-- check all other work as intended -->
14+
<input type="checkbox" name="tea" value="1" id="tea-id" checked>
15+
<input type="checkbox" name="vanilla" id="vanilla-id" checked>
16+
<input type="checkbox" name="butter" id="butter-id" >
17+
18+
<button type="submit">Submit Preference</button>
19+
</form>

tests/unit/Codeception/Module/TestsForWeb.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1780,4 +1780,20 @@ public function testHaveServerParameter()
17801780
$server = $this->module->client->getRequest()->getServer();
17811781
$this->assertArrayHasKey('my', $server);
17821782
}
1783+
1784+
public function testUncheckHidden()
1785+
{
1786+
$this->module->amOnPage('/form/uncheck_hidden');
1787+
$this->module->uncheckOption('#coffee-id');
1788+
$this->module->click("Submit Preference");
1789+
$form = data::get('form');
1790+
$this->assertEquals('0', $form['coffee']);
1791+
1792+
// test all other inputs are submitted as intended
1793+
$this->assertEquals('mouse', $form['wireless']);
1794+
$this->assertEquals('1', $form['tea']);
1795+
$this->assertEquals('on', $form['vanilla']); // 'on' is set internally
1796+
$this->assertFalse(isset($form['butter']));
1797+
1798+
}
17831799
}

0 commit comments

Comments
 (0)