Validace SelectBox přes addRule VALID
- michal.lohnisky
- Člen | 64
Ahoj,
používám Nette v2.2.2. Pokud nastavím
$form['selectbox']->addRule(\Nette\Forms\Form::VALID, 'Nevalidní select!');
nginx spadne. Po bližším zkoumání jsem přišel na to, že zásobník vypadá takto:
#0 Nette\Forms\Rules::validateRule() called at [<path>/private/vendor/nette/forms/src/Forms/Rules.php:227]
#1 Nette\Forms\Rules->validate() called at [<path>/private/vendor/nette/forms/src/Forms/Controls/BaseControl.php:620]
#2 Nette\Forms\Controls\BaseControl::validateValid()
#3 call_user_func() called at [<path>/private/vendor/nette/forms/src/Forms/Rules.php:262]
#4 Nette\Forms\Rules::validateRule() called at [<path>/private/vendor/nette/forms/src/Forms/Rules.php:227]
#5 Nette\Forms\Rules->validate() called at [<path>/private/vendor/nette/forms/src/Forms/Controls/BaseControl.php:464]
#6 Nette\Forms\Controls\BaseControl->validate() called at [<path>/private/vendor/nette/forms/src/Forms/Controls/SelectBox.php:106]
#7 Nette\Forms\Controls\SelectBox->validate() called at [<path>/private/vendor/nette/forms/src/Forms/Container.php:140]
#8 Nette\Forms\Container->validate() called at [<path>/private/vendor/nette/forms/src/Forms/Form.php:469]
#9 Nette\Forms\Form->validate() called at [<path>/private/vendor/nette/forms/src/Forms/Form.php:401]
#10 Nette\Forms\Form->fireEvents() called at [<path>/private/vendor/nette/application/src/Application/UI/Form.php:138]
#11 Nette\Application\UI\Form->signalReceived() called at [<path>/private/vendor/nette/application/src/Application/UI/Presenter.php:324]
#12 Nette\Application\UI\Presenter->processSignal() called at [<path>/private/vendor/nette/application/src/Application/UI/Presenter.php:207]
#13 Nette\Application\UI\Presenter->run() called at [<path>/private/vendor/nette/application/src/Application/Application.php:149]
#14 Nette\Application\Application->processRequest() called at [<path>/private/vendor/nette/application/src/Application/Application.php:88]
#15 Nette\Application\Application->run() called at [<path>/web/index.php:40]
Voláním #3
se zopakují body #5
a #4
jako #1
a #0
. Předpokládám, že se to tímto script
dostane do nekonečné smyčky.
Je to chyba v Nette? Nebo jak správně validovat selectBox?
Díky.
- michal.lohnisky
- Člen | 64
Ještě doplním, že pokud nastavím
$form['selectbox']->addRule(\Nette\Forms\Controls\SelectBox::VALID, 'Nevalidní select!');
pak dostanu výjimku
Nette\MemberAccessException: Call to undefined static method Nette\Forms\Controls\SelectBox::validateselectBoxValid().
- michal.lohnisky
- Člen | 64
Pokud někdo zadal špatný option, který při odeslání formuláře nebyl v nabídce, dostal jsem hlášku „Please select a valid option.“. Protože je v aplikaci hodně JS, a protože jeden resource může v aplikaci používat více lidí najednou, může se to, že člověk zadá špatný option, klidně stát. Já jsem jen chtěl tu chybovou hlášku nahradit vlastním textem. Nic víc.
- michal.lohnisky
- Člen | 64
To mě napadlo, ale já bych ji potřeboval přizpůsobit přímo pro tento input, nechci obecnou hlášku. Tím validátorem jsem myslel, že tu zprávu budu moct přepsat pouze pro ten jeden select.
- michal.lohnisky
- Člen | 64
Jasný, díky. Dobře a to je oficiální řešení? Mě to přijde jako workaround. Správný způsob mi přijde tak, jak jsem to dělal na začátku, kde mi Nette hodilo chybu.
- Aurielle
- Člen | 1281
Nedíval jsem se přesně do API, nicméně SelectBox se validuje na předem známé hodnoty snad vždy, a proto není nutné přidávat validační pravidlo. Naopak v těch $defaultMessages se daná zpráva týká pouze validity SelectBoxu, takže bych se ji nebál upravit tam. Chápu, že to není nejšikovnější, ale specifické řešení vázané na definici konkrétního formuláře nejspíš není.