diff --git a/src/Bridges/FormsLatte/FormMacros.php b/src/Bridges/FormsLatte/FormMacros.php index 07bba735c..173e06760 100644 --- a/src/Bridges/FormsLatte/FormMacros.php +++ b/src/Bridges/FormsLatte/FormMacros.php @@ -140,9 +140,9 @@ public function macroInput(MacroNode $node, PhpWriter $writer) $node->replaced = true; $name = array_shift($words); return $writer->write( - ($name[0] === '$' ? '$_input = is_object(%0.word) ? %0.word : end($this->global->formsStack)[%0.word]; echo $_input' : 'echo end($this->global->formsStack)[%0.word]') - . '->%1.raw' - . ($node->tokenizer->isNext() ? '->addAttributes(%node.array)' : '') + ($name[0] === '$' ? '$_input = is_object(%0.word) ? %0.word : end($this->global->formsStack)[%0.word]; ' : 'echo end($this->global->formsStack)[%0.word]; ') + . ($node->tokenizer->isNext() ? 'foreach(%node.array as $_k => $_v) {$_input->setHtmlAttribute($_k, $_v);} ' : '') + . 'echo $_input->%1.raw' . " /* line $node->startLine */", $name, $words ? 'getControlPart(' . implode(', ', array_map([$writer, 'formatWord'], $words)) . ')' : 'getControl()' diff --git a/src/Forms/Controls/SelectBox.php b/src/Forms/Controls/SelectBox.php index ebcdfb1c0..4b80a3fdd 100644 --- a/src/Forms/Controls/SelectBox.php +++ b/src/Forms/Controls/SelectBox.php @@ -26,6 +26,9 @@ class SelectBox extends ChoiceControl /** @var mixed */ private $prompt = false; + /** @var bool */ + private $autoDefault = false; + /** @var array */ private $optionAttributes = []; @@ -47,6 +50,7 @@ public function __construct($label = null, array $items = null) public function setPrompt($prompt) { $this->prompt = $prompt; + $this->setDefaultValueAuto(null, true); return $this; } @@ -61,6 +65,13 @@ public function getPrompt() } + public function setDefaultValue($value) + { + $this->autoDefault = true; + return parent::setDefaultValue($value); + } + + /** * Sets options and option groups from which to choose. * @return static @@ -82,7 +93,13 @@ public function setItems(array $items, bool $useKeys = true) $items = $res; } $this->options = $items; - return parent::setItems(Nette\Utils\Arrays::flatten($items, true)); + parent::setItems(Nette\Utils\Arrays::flatten($items, true)); + + if ($this->prompt === false && $this->items) { + reset($this->items); + $this->setDefaultValueAuto(key($this->items)); + } + return $this; } @@ -106,6 +123,15 @@ public function getControl(): Nette\Utils\Html } + public function setHtmlAttribute(string $name, $value = true) + { + if ($name === 'size' && $value > 1) { + $this->setDefaultValueAuto(null, true); + } + return parent::setHtmlAttribute($name, $value); + } + + /** * @return static */ @@ -124,4 +150,14 @@ public function isOk(): bool || !$this->options || $this->control->size > 1; } + + + private function setDefaultValueAuto($value, bool $autoDefault = false) + { + if ($this->autoDefault === false) { + $this->setDefaultValue($value); + $this->autoDefault = $autoDefault; + } + return $this; + } } diff --git a/tests/Forms.Latte/expected/FormMacros.forms.html b/tests/Forms.Latte/expected/FormMacros.forms.html index 0557fa5ed..746d2e3bd 100644 --- a/tests/Forms.Latte/expected/FormMacros.forms.html +++ b/tests/Forms.Latte/expected/FormMacros.forms.html @@ -108,12 +108,12 @@ - + - + diff --git a/tests/Forms/Controls.SelectBox.defaultValue.phpt b/tests/Forms/Controls.SelectBox.defaultValue.phpt new file mode 100644 index 000000000..1832ebbbc --- /dev/null +++ b/tests/Forms/Controls.SelectBox.defaultValue.phpt @@ -0,0 +1,47 @@ +addSelect('foo', null, ['bar' => 'Bar', 'foo' => 'Foo']); +Assert::same('bar', $select->getValue()); + +$select->setPrompt('Baz'); +Assert::null($select->getValue()); + +$select->setDefaultValue('foo'); +Assert::same('foo', $select->getValue()); + + +$form = new Form; +$select = $form->addSelect('foo') + ->setPrompt('Baz') + ->setItems(['bar' => 'Bar', 'foo' => 'Foo']); +Assert::null($select->getValue()); + + +$form = new Form; +$select = $form->addSelect('foo') + ->setItems(['bar' => 'Bar', 'foo' => 'Foo']) + ->setDefaultValue('foo') + ->setPrompt('Baz'); +Assert::same('foo', $select->getValue()); + + +$form = new Form; +$select = $form->addSelect('foo') + ->setPrompt('Baz') + ->setItems(['bar' => 'Bar', 'foo' => 'Foo']) + ->setDefaultValue('foo'); +Assert::same('foo', $select->getValue()); diff --git a/tests/Forms/Controls.SelectBox.isOk.phpt b/tests/Forms/Controls.SelectBox.isOk.phpt index 094c69368..ebdc274b1 100644 --- a/tests/Forms/Controls.SelectBox.isOk.phpt +++ b/tests/Forms/Controls.SelectBox.isOk.phpt @@ -17,7 +17,7 @@ require __DIR__ . '/../bootstrap.php'; $form = new Form; $select = $form->addSelect('foo', null, ['bar' => 'Bar']); -Assert::false($select->isOk()); +Assert::true($select->isOk()); $select->setDisabled(true); Assert::true($select->isOk()); diff --git a/tests/Forms/Controls.SelectBox.render.phpt b/tests/Forms/Controls.SelectBox.render.phpt index 6c8a9e11e..86b542e32 100644 --- a/tests/Forms/Controls.SelectBox.render.phpt +++ b/tests/Forms/Controls.SelectBox.render.phpt @@ -35,7 +35,7 @@ test(function () { Assert::same('', (string) $input->getLabel('Another label')); Assert::type(Html::class, $input->getControl()); - Assert::same('', (string) $input->getControl()); + Assert::same('', (string) $input->getControl()); }); @@ -96,7 +96,7 @@ test(function () { // validation rules 0 => 'Second', ])->setRequired('required'); - Assert::same('', (string) $input->getControl()); + Assert::same('', (string) $input->getControl()); }); @@ -108,7 +108,7 @@ test(function () { // container 0 => 'Second', ]); - Assert::same('', (string) $input->getControl()); + Assert::same('', (string) $input->getControl()); });