Ajax volání formuláře a validace onValidate
- xpalko
- Člen | 9
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
- xpalko
- Člen | 9
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
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');
}
};
?>
- xpalko
- Člen | 9
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
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
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
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
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…