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