Validace SelectBox přes addRule VALID

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
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í.