Ajax volání formuláře a validace onValidate

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

Ahoj,

řeším problém s nezobrazováním chybových zpráv při ajax volání formuláře a jeho validaci pomocí onValidate jak tomu je např. v https://doc.nette.org/cs/forms#…

Normální volání funguje, chybová hláška se vypíše, při ajax volání nic :(

Ve fóru jsem našel pár dotazů, ale odpověď vždy žádná…

Díky

xpalko

Glottis
Člen | 129
+
0
-

cao, formular mas ve snippetu? invalidujes ho?

xpalko
Člen | 9
+
0
-

Ukázka řešení, které funguje bez ajax volání bez problemu:

protected function createComponentTaskForm()
{
	...
    $form->onValidate[] = function($form) {
        if ($form['text']->value == 'test') {
            $form->addError('Žádné testy prosím');
        }
    };
	...
}

s ajax voláním nic, zkoušel jsem tedy pouziti ajax volani a flashMessages a opet nic

protected function createComponentTaskForm()
{
	...
    $form->onValidate[] = function($form) {
        if ($form['text']->value == 'test') {
		$this->flashMessage('Žádné testy prosím.', 'error');
            $this->invalidateControl('flashMessages');
        }
    };
	...
}

Formular ve snippetu nemam, ale flashMessages ano ten invaliduju (a o ten mi jde). V pripade, ze kod tam az do onSuccess[], ajax volani a flashMessages uz funguje, ale validaci bych mel radeji v onValidate[]

public function taskFormSubmitted(Form $form)
{
    if ($form->values->text == 'test') {
        $this->flashMessage('Žádné testy prosím.', 'error');
        $this->invalidateControl('flashMessages');
        return;
    }
	...
}
Glottis
Člen | 129
+
0
-

neni problem v te anonymni fci? urcte v ni $this povede na presenter?

tohle nezafunguje? ale asi to je nesmysl :)

<?php
function($form) use ($presenter) {
        if ($form['text']->value == 'test') {
    		$presenter->flashMessage('Žádné testy prosím.', 'error');
		$presenter->invalidateControl('flashMessages');
        }

};
?>
Glottis
Člen | 129
+
0
-

njn placam, ja vim ;)

zkousel jsem si jak to mas ty a me to funguje. zkus se podivat jestli se ti vubec neco odesilal a co. pres chrome treba.

xpalko
Člen | 9
+
0
-

Funguje ti prosim ktera verze, ta druha? Pouzivam Nette 2.0.10, tedy nejnovejsi a ukazkovou sandbox aplikaci z gitu – teda „vse“ by melo byt v poradku od autora, ja v podstate dopsal jen tu validaci onValidate[], protoze me zajima validace celkoveho formulare, nejen jednotlivych prvku…

Glottis
Člen | 129
+
0
-

jo ta druha ajaxova

<?php
        {snippet flash}
            <div n:foreach="$flashes as $flash" class="flash {$flash->type}">{$flash->message}</div>
        {/snippet}

    protected function createComponentForm($name) {
        $form = new Nette\Application\UI\Form();
        $form->addText('textfield');
        $form->addSubmit('testbutton', "Odeslat");

        $form->getElementPrototype()->class('ajax');
        $form->setTranslator($this->translator);

        $form->onSuccess[] = callback($this->presenter, 'successForm');
        $form->onError[] = callback($this->presenter, 'errorForm');
        $form->onValidate[] = function ($form) {
            $this->flashMessage(time());
            $this->invalidateControl();
        };
        return $form;
    }
?>

vsim sem si tohoto: $form->getElementPrototype()->class(‚ajax‘);
mas ta navazany ajax na formulare? :)

xpalko
Člen | 9
+
0
-

Kouknul jsem do firebugu, co mi to pise, a zjistil jsem, ze to reseni 2/ vyhazuje fatal error ‚Using $this when not in object context‘ na radek $this->flashMessage(time());, coz je asi logicke, je to anonymni fukce a o $this nic nemuze vedet?! Funguje pouze reseni 1/, kdy pracuju s predavanou promenou $form (do te pridam error). Ono i podle toho onValidate by zadna chyba „nenaskocila“, protoze vlastne formulari nereknu, ze je chyba, jen vypisu flash!

Tridu ajax u formulare samozrejme mam, formular se spravne odesila pomoci post pres ajax.

Teda zajimave, jestli ze ti to funugje… ???

Editoval xpalko (15. 3. 2013 14:06)

Glottis
Člen | 129
+
0
-

zahadicka, nevim proc mi to funguje :)
kdy zto obejdes pres callback tak ti to pojede, ze jo? :)

<?php
$form->onValidate[] = callback($this->presenter, 'mojeValidace');
?>

a pridas metodu
a nebo si podstrc presenter pres use do te anonymni fce jak jsme psal

<?php
$self = $this;
function ($form) use ($self) {
	$self->flashMessage("test");
	$self->invalidateControl();
}
?>
xpalko
Člen | 9
+
0
-

Tak uz to funguje. Problem byl opravdu v tom $this pres anonymni funkci – driv jsem si mel zapnout firebug – to je moje chyba – pres use uz to funguje – jeste ale je nutne pridat v te anonymni funkci addError, aby se neprovedlo onSuccess[] – flash formular neznevalidnil.

Problem, proc asi nefunguje priklad 1/ pres $form->addError (jak bys mi libilo, aby to bylo „ciste“), bude v tom, ze ten samotny formular, co se odesila, neni {snippet} a tudiz se nenacte znovu a nezobrazi se {control $form errors} – alespon je co vyzkouset…

Diky za pomoc, s Nette si hraji ani ne tyden, delam hlavne v Zendu…