Návrat originálních hodnot inputů po neúspěšné validaci

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Honza.Mottl
Člen | 104
+
+1
-

Používám ve formuláři desetinná čísla v českém formátu s čárkou a mezerou pro oddělení tisíců např. „123 456, 78“. Filtrem je převádím na anglický formát např. „123456.78“. V případě neúspěšné serverové validace se mi na klienta vracela fitrem přeformátovaná čísla v anglickém formátu. To není na klientu v pořádku a nevyhovuje to klientské validaci.

Jak se nejlépe vrátit k původním hodnotám před úpravou filtrem? Vyřešil jsem to návratem na originální hodnoty z postu v onError. Jak řešíte podobné problémy? Napadá vás něco lepšího?

    public function formValidationFailed ($form) {
        //
        // - hodnoty se znovu vytvori z POSTu
        //
        foreach ($form->getComponents(TRUE, 'Nette\Forms\IControl') as $control) {
            if (!$control->isOmitted())
            {
                $originalValue = $this->getHttpRequest()->getPost($control->name);
                if (isset($originalValue)) {
                    $control->setValue($originalValue);
                }
            }
        }
    }

    protected function createComponentEditForm()
	{
		...
		$control = $form->addText($polozka[PolozkyManager::PRIPADPOL_COLUMN_ID] . self::ROW_SEPARATOR . 'sleva_proc', '')
	    ->setAttribute('class', 'sleva_proc formatNumber')
	    ->setAttribute('maxlength', '6')
	    ->setAttribute('data-toggle', 'tooltip')
	    ->setAttribute('title', 'Sleva %')
	    ->addFilter(function ($value) {
		return str_replace(' ', '', str_replace(',', '.', $value));
	    })
	    ->addRule(Form::PATTERN, 'Sleva %: Nesprávný formát čísla.', '-?[0-9\s]*.?[0-9]{0,2}')
	    ->addRule('App\Utilities\MyValidators::slevaProcValidator', 'Sleva musí být v rozsahu %d do %d procent', [-900, 100])
	    ;

		....
            $form->onSuccess[]  = [$this, 'editFormSucceeded'];
            $form->onError[] = [$this, 'formValidationFailed'];
		...

	   return $form;
	}