Posílání form errors do flash messages

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

Potřeboval bych aby se chyby zjištěné při validaci AppForm na straně serveru posílaly do flash messages a nevypisovali při renderování formu.
Nevíte někdo jak to vyřešit, nejlépe globálně pro celou APP.
Např mě napadlo že by to možná šlo vydolovat v BasePresenter/startup Edit: BasePresenter/beforeRender

Editoval daliborcaja (13. 3. 2011 23:29)

jtousek
Člen | 951
+
0
-

Předpokládám, že ti jde o ajaxovou validaci formuláře. Zkus tohle:

https://forum.nette.org/…rane-serveru

daliborcaja
Člen | 57
+
0
-

No ajaxovou validaci jsem zrovna neměl na mysli ale je to zajímavá myšlenka. Mi se jenalo pouze o to aby se ty chyby nevypsaly u formu a tím mi rozhodily grafiku, ale aby se vypisovaly v místě pro to určeném a to tam kde se vypisují flash messages.
Teď je otázka co je lepší, jestli předělat všechny formy na ajaxovou validaci (což se mi zdá pro tuto konkrétní aplikaci zbytečné), nebo jen v beforeRender načíst a unsetovat errors z formu.
Spíše mě tedy zajímalo jak v beforeRenderu přistoupit k tomu formu, respektive zjistit že se jedná o request způsobený odesláním formuláře a kterého. To že se případně ještě před beforeRender provede callback formu mi nevadí, protože používám vždy onSubmit který se provede jen když je form validní.

daliborcaja
Člen | 57
+
0
-

Nakonec si asi odpovím sám, okoukal jsem to z te ajaxové validace.

public function beforeRender() {
    $post = $this->request->post;
    if (isset($post['name'])) {
        $control = $this[$post['name']];

        // tady bude uz jenom predani tech errors z formu do flash messages a vymazani ve formu

    }
}

Ještě to musím testnout.

Šaman
Člen | 2666
+
0
-

Vypisovat errory nemusíš vůbec, pokud používáš šablony pro vykreslení formulářů. Teď jsem chtěl zkusit jestli půjde vypisovat chyby do bloku flash přímo v šabloně formuláře a zjistil jsem, že při defaultním vykreslení bez šablony se input zvýrazní červeně a chyba se vykreslí do bubliny k tomu inputu. Dokonce i s vypnutým JS. Zkus upgradovat a možná už to nebudeš muset řešit.

bojovyletoun
Člen | 667
+
0
-

Napadá mě:

$form->onInvalidSubmit[]=function($form){
	$form->getPresenter->flashMessage(var_export($form->errors,true));
	$form->cleanErrors();
}
daliborcaja
Člen | 57
+
0
-

Šaman napsal(a):

Zkus upgradovat a možná už to nebudeš muset řešit.

Díky za tip, mám celkem starou verzi.

bojovyletoun napsal(a):

Napadá mě:

$form->onInvalidSubmit[]=function($form){...}

Více méně tak jsem to měl přesně na mysli ale na jiném místě, ale tohle bude asi lepší, jelikož si můžeš zvolit jestli to použít pro konkrétní form nebo ne. Akorát tu callback funkci do samostatné metody v basePresenter ať se to tam tisíckrát neopakuje.

uestla
Backer | 799
+
0
-

Chceš-li to globálně pro celou aplikaci, je nejlepší využít dědění:

class BaseForm extends AppForm
{
	public function addError($message)
	{
		$this->valid = FALSE;
		if ($message !== NULL) {
			$this->getPresenter()->flashMessage($message, 'fail');
		}
	}
}

A místo AppForm pak používat BaseForm…

Patrik Votoček
Člen | 2221
+
0
-

uestla napsal(a):

a nepoužívat přidávání errorů na itemech…

uestla
Backer | 799
+
0
-

To je pravda odvěká :-((
Ale třeba přijde den, kdy poradím dobře…