úprava dat po odeslaní formuláře

vlkodlak
Člen | 160
+
0
-

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 | 758
+
+1
-

https://doc.nette.org/…s/validation#…

Jestli jsem pochopil správně, nehledáš onValidate?

vlkodlak
Člen | 160
+
0
-

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

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

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

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 | 1165
+
+1
-

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

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