Validace SelectBox přes addRule VALID

michal.lohnisky
Člen | 64
+
0
-

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
+
0
-

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().
CZechBoY
Člen | 3608
+
0
-

čau,
co od toho vůbec očekáváš?
Nehledáš spíš FILLED?

michal.lohnisky
Člen | 64
+
0
-

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.

CZechBoY
Člen | 3608
+
0
-

Tak to bys musel přepsat položku v \Nette\Forms\Rules::$defaultMessages

michal.lohnisky
Člen | 64
+
0
-

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.

Aurielle
Člen | 1281
+
0
-

Nic ti nebrání ty $defaultMessages modifikovat při vytvoření formuláře tak, aby ti to jiné formuláře neovlivnilo ;)

michal.lohnisky
Člen | 64
+
0
-

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
+
0
-

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í.

RSS tématu Téma zavřeno