AddInteger nepovinny ve formuláři

jokas
Člen | 14
+
0
-

Ahojte,

rád by jsem mněl prvek addinteger ve formuláři bez nutnosti ho vyplnit (takže nepovinný parameter) a zároveň nullable, co je.
V takovém případě musím nastavit default hodnotu na 0.
Je možné to udělat, aby daná pole zůstala prázdna ale byla typu integer a v případě vyplnění se provede kontrola pravidel?

Z dokumentace:

addInteger(string|int $name, $label=null): TextInput
Přidá políčko pro zadání celočíselného čísla (třída TextInput). Vrací buď integer, nebo null, pokud uživatel nic nezadá.

$form->addInteger(‚level‘, ‚Úroveň:‘)
->setDefaultValue(0)
->addRule($form::RANGE, ‚Úroveň musí být v rozsahu mezi %d a %d.‘, [0, 100]);

Předem děkuji za pomoc.

MajklNajt
Člen | 498
+
0
-

ahoj, pri spracovaní formulára stačí použiť:

$level = $values->level ?? 0;

EDIT: resp. ak potrebuješ v prípade zadania 0 dostať aj tak null, tak:

$level = $values->level ?: null;

Editoval MajklNajt (7. 11. 2020 14:46)

jokas
Člen | 14
+
0
-

Ahoj,

no to je v případě zpracování. Ale při vykreslení formuláře nechci mít default u všech polí 0 a následně užívatel to musí přepisovat na vlastní hodnoty, nebo pole nechá s 0. Chtěl bych, aby prvky byli prázdne a buď je vyplní číslem nebo ne (input je prázdný).
Když to nechám podle dokumentace bez setDefultValue, tak se provádí kontrola na číslo a formulář se neodešle.

Děkuji.

Editoval jokas (7. 11. 2020 16:02)

MajklNajt
Člen | 498
+
0
-

tak potom chceš toto:

$form->addInteger("level", "Úroveň:")
	->addCondition($form::FILLED)
		->addRule($form::RANGE, "Úroveň musí být v rozsahu mezi %d a %d.", [0, 100]);
jokas
Člen | 14
+
0
-

Jo, něco takého a v mém případě tohle:
$form->addInteger(FormData::COUNT, ‚Počet‘)
->addCondition($form::FILLED)
->addRule($form::RANGE, ‚Zadejte počet položek z rozpětí %d – %d‘, [0, 200]);

Odeslání formuláře:
Zadejte platné celé číslo. – formulář mi neodešle.

galab
Backer | 74
+
0
-
$form->addText(FormData::COUNT, 'Počet')
    ->setNullable()
    ->setHtmlAttribute('type', 'number')
    ->addCondition($form::FILLED)
        ->addRule($form::RANGE, 'Úroveň musí být v rozsahu mezi %d a %d.', [0, 100]);
jokas
Člen | 14
+
0
-

Funguje, to jsem myslel.

Diky.

David Grudl
Nette Core | 8227
+
0
-

Co nefunguje na tomto?

$form->addInteger(FormData::COUNT, 'Počet')
    ->addRule($form::RANGE, 'Úroveň musí být v rozsahu mezi %d a %d.', [0, 100]);
jokas
Člen | 14
+
0
-

V případě nevyplnění (nullable) inputu se form neodešle a objeví se hláška:
Zadejte prosím celé číslo.

Jde to obejít setDefaultValue = 0, ale nelíbí se mi, že po otevření formuláře je v inputech nastavená 0 a užívatel to musí přepisovat.

Od uživatele galab řešení funguje, ale vrací to string, tak je potřeba to ještě přetypovat na integer při zpracování, když pole je vyplněno.

AddInteger má funkci setNullable, ale není možné nechat input prazdny.

Editoval jokas (8. 11. 2020 9:16)

David Grudl
Nette Core | 8227
+
0
-

To má fungovat. Jakou máš verzi Nette? Form se neodešle proč, kvůli JS? Máš aktuální netteForms.js?

jokas
Člen | 14
+
0
-

Davide, je to verzi. Používám live-form-validation z npm 1.9.0. Při nalinkovaní verze 2.0 již to funguje jak má a v tom formátu jak jsi psal.

Děkuji.