úprava dat po odeslaní formuláře
- vlkodlak
- Člen | 175
zdravim,
mám formulář
protected function createComponentTimesheet()
{
$form = new \Nette\Application\UI\Form;
$form->addtext('week');
$form->addtext('employee')
->setRequired('Please fill "Employee Number."');
$form->addSubmit('send2', 'Show Timesheet');
$form->onSuccess[] = [$this, 'formSuccessTimesheet'];
$form->renderer;
return $form;
}
a mám funkci zpracovávající data odeslaná formulářem
public function formSuccessTimesheet(Form $form, $data): void
{
....
}
můj dotaz funkce probehné, vše správně, ale já ještě potřebují zkontrolovat správnost zapsaneho datumu v $form->addtext(‚week‘);
- když vložím na začátku funkce (…formSuccessTimesheet…) kontrolu ta je provedená, ale po vložení do databáze
- když jsem zkusil nastavit zachyceni ve funkci actionTimesheet() tak sice zda se že to je správný okamžik, kdy provést kontrolu odeslaných dat, ale zas nedaří se mi vytáhnout odeslaná data a tím pádem je vrátit pro další zpracovaní
- Kamil Valenta
- Člen | 822
https://doc.nette.org/…s/validation#…
Jestli jsem pochopil správně, nehledáš onValidate?
- vlkodlak
- Člen | 175
Kamil Valenta napsal(a):
https://doc.nette.org/…s/validation#…
Jestli jsem pochopil správně, nehledáš onValidate?
ano, to vypadá použitelné jen otázka zda při validaci mohu rovnou provést korekci hodnoty místo vypisovaní chyby?
- Keeehi
- Člen | 36
- když vložím na začátku funkce (…formSuccessTimesheet…) kontrolu ta je provedená, ale po vložení do databáze
Jak po vložení do databáze? Žádnou práci s databází tu nemáš. Je samozřejmě možné, že máš nastavenou i nějakou další obsluhu na onSuccess a ta dělá to vkládání. Pokud bys chtěl tuto funkci tomu předřadit, můžeš nějak modifikovat to pole onSuccess. Tím tvým zápisem to vkládáš až na konec pole
$form->onSuccess[] = [$this, 'formSuccessTimesheet'];
Na začátek se to dá vložit pomocí
array_unshift($form->onSuccess, [$this, 'formSuccessTimesheet']);
- vlkodlak
- Člen | 175
Keeehi napsal(a):
- když vložím na začátku funkce (…formSuccessTimesheet…) kontrolu ta je provedená, ale po vložení do databáze
Jak po vložení do databáze? Žádnou práci s databází tu nemáš. Je samozřejmě možné, že máš nastavenou i nějakou další obsluhu na onSuccess a ta dělá to vkládání. Pokud bys chtěl tuto funkci tomu předřadit, můžeš nějak modifikovat to pole onSuccess. Tím tvým zápisem to vkládáš až na konec pole
$form->onSuccess[] = [$this, 'formSuccessTimesheet'];
Na začátek se to dá vložit pomocí
array_unshift($form->onSuccess, [$this, 'formSuccessTimesheet']);
@Keeehi ano, samozřejmě zde v otázce jsem vše očistil a vynechal zbytečný balast, který by rušil od otázky, jde o to, že funkce je vykonaná, nebyť toho, že dostava se mi nevalidní hodnota, kterou potřebují zkontrolovat opravit, před tím než proces webu vše převezme a zpracuje. Protože jsem předřadil kontrolu na první řádky formSuccessTimesheet, ale bez výsledně proces zápisu proběhne a až pak je vykonaná kontrola, která proběhne. Proto můj dotaz kde jsem u dělal chybu, proč dochází k obracenému pořadí.
- Milo
- Nette Core | 1283
Píšeš, že chceš tu hodnotu opravit, pokud bude chybná. Tak ji oprav, než ji vložíš do databáze.
Ale – autokorekce bych moc nedělal. Uživatel něco záda, uloží a myslí si, že se uložilo to co zadal.
IMHO je lepší udělat week nullable, a potom vymýšlet výchozí hodnotu, a přes addRule povolit pouze určité vstupy.
- Keeehi
- Člen | 36
vlkodlak napsal(a):
Protože jsem předřadil kontrolu na první řádky formSuccessTimesheet, ale bez výsledně proces zápisu proběhne a až pak je vykonaná kontrola, která proběhne. Proto můj dotaz kde jsem u dělal chybu, proč dochází k obracenému pořadí.
Tak těžko ti můžeme říct, v čem jsi udělal chybu když celý kód funkce formSuccessTimesheet smrskneš na tři tečky.
- Marek Bartoš
- Nette Blogger | 1280
když vložím na začátku funkce (…formSuccessTimesheet…) kontrolu ta je provedená, ale po vložení do databáze
Já si tipnu, i bez kódu. Po zavolání $form->addError()
jsi nezavolal return;
a ani jsi uložení do databáze neobalil
do else{...}
if(/* invalid input */) {
$form->addError(/* error message */);
return; // Zbytek kódu už se nestane
}
/* store in database */
- Keeehi
- Člen | 36
No ono by možná nebylo od věci kontrolovat jakýkoli problém s formulářem.
if($form->hasErrors()) {
return;
}
Jasně, pokud by byl s formulářem i nějaký jiný problém, průběh scriptu by se nedostal ani do onSuccess. Ovšem ta kontrola na error před uložením (i když možná zbytečná) mi tam přijde hezčí.