Skip to content

Commit dd9d4ef

Browse files
committed
CheckboxList: compact transmission mode in form name=val1,val2,val3
1 parent 5297f35 commit dd9d4ef

File tree

3 files changed

+88
-11
lines changed

3 files changed

+88
-11
lines changed

src/Forms/Controls/CheckboxList.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,21 @@ public function __construct($label = null, array $items = null)
4646
}
4747

4848

49+
public function loadHttpData(): void
50+
{
51+
$data = $this->getForm()->getHttpData(Nette\Forms\Form::DATA_TEXT, substr($this->getHtmlName(), 0, -2));
52+
if ($data === null) {
53+
$data = $this->getHttpData(Nette\Forms\Form::DATA_TEXT);
54+
} else {
55+
$data = explode(',', $data);
56+
}
57+
$this->value = array_keys(array_flip($data));
58+
if (is_array($this->disabled)) {
59+
$this->value = array_diff($this->value, array_keys($this->disabled));
60+
}
61+
}
62+
63+
4964
public function getControl(): Html
5065
{
5166
$input = parent::getControl();

src/assets/netteForms.js

Lines changed: 58 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888
}
8989
return values;
9090

91-
} else if (elem.name && elem.name.match(/\[\]$/)) { // multiple elements []
91+
} else if (elem.name && elem.name.substr(-2) === '[]') { // multiple elements []
9292
elements = elem.form.elements[elem.name].tagName ? [elem] : elem.form.elements[elem.name];
9393
values = [];
9494

@@ -660,16 +660,71 @@
660660
};
661661

662662

663+
/**
664+
* Compact checkboxes
665+
*/
666+
Nette.compactCheckboxes = function(form) {
667+
var name, i, elem, values = {};
668+
669+
for (i = 0; i < form.elements.length; i++) {
670+
elem = form.elements[i];
671+
if (elem.tagName
672+
&& elem.tagName.toLowerCase() === 'input'
673+
&& elem.type === 'checkbox'
674+
) {
675+
if (elem.name
676+
&& elem.name.substr(-2) === '[]'
677+
) {
678+
name = elem.name.substr(0, elem.name.length - 2);
679+
elem.removeAttribute('name');
680+
elem.setAttribute('data-nette-name', name);
681+
}
682+
683+
if (name = elem.getAttribute('data-nette-name')) { // eslint-disable-line no-cond-assign
684+
values[name] = values[name] || [];
685+
if (elem.checked) {
686+
values[name].push(elem.value);
687+
}
688+
}
689+
}
690+
}
691+
692+
for (name in values) {
693+
if (form.elements[name] === undefined) {
694+
elem = document.createElement('input');
695+
elem.setAttribute('name', name);
696+
elem.setAttribute('type', 'hidden');
697+
form.appendChild(elem);
698+
}
699+
form.elements[name].value = values[name].join(',');
700+
}
701+
};
702+
703+
663704
/**
664705
* Setup handlers.
665706
*/
666707
Nette.initForm = function(form) {
708+
if (form.method === 'get') {
709+
form.addEventListener('submit', function() {
710+
Nette.compactCheckboxes(form);
711+
});
712+
}
713+
714+
check: {
715+
for (var i = 0; i < form.elements.length; i++) {
716+
if (form.elements[i].getAttribute('data-nette-rules')) {
717+
break check;
718+
}
719+
}
720+
return;
721+
}
722+
667723
Nette.toggleForm(form);
668724

669725
if (form.noValidate) {
670726
return;
671727
}
672-
673728
form.noValidate = true;
674729

675730
form.addEventListener('submit', function(e) {
@@ -687,13 +742,7 @@
687742
Nette.initOnLoad = function() {
688743
Nette.onDocumentReady(function() {
689744
for (var i = 0; i < document.forms.length; i++) {
690-
var form = document.forms[i];
691-
for (var j = 0; j < form.elements.length; j++) {
692-
if (form.elements[j].getAttribute('data-nette-rules')) {
693-
Nette.initForm(form);
694-
break;
695-
}
696-
}
745+
Nette.initForm(document.forms[i]);
697746
}
698747

699748
document.body.addEventListener('click', function(e) {

tests/Forms/Controls.CheckboxList.loadData.phpt

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ $series = [
2929
];
3030

3131

32-
test(function () use ($series) { // invalid input
33-
$_POST = ['list' => 'red-dwarf'];
32+
test(function () use ($series) { // empty input
33+
$_POST = [];
3434

3535
$form = new Form;
3636
$input = $form->addCheckboxList('list', null, $series);
@@ -42,6 +42,19 @@ test(function () use ($series) { // invalid input
4242
});
4343

4444

45+
test(function () use ($series) { // compact mode
46+
$_POST = ['list' => 'red-dwarf,0'];
47+
48+
$form = new Form;
49+
$input = $form->addCheckboxList('list', null, $series);
50+
51+
Assert::true($form->isValid());
52+
Assert::same(['red-dwarf', 0], $input->getValue());
53+
Assert::same(['red-dwarf' => 'Red Dwarf', 0 => 'South Park'], $input->getSelectedItems());
54+
Assert::true($input->isFilled());
55+
});
56+
57+
4558
test(function () use ($series) { // multiple selected items, zero item
4659
$_POST = ['multi' => ['red-dwarf', 'unknown', 0]];
4760

0 commit comments

Comments
 (0)