Nezobrazení flashes při AJAXu
- matoni555
- Člen | 40
Zdravím,
mám jednoduchý kontaktní formulář s dvěma povinnými údaji
využívající AJAX. Problém je ten, že když nějaký povinný údaj chybí,
tak se nezobrazí flash zpráva s chybou. Pokud jsou však povinné údaje
vyplněny, formulář se odešle a flash zpráva se zobrazí.
Pokud vypnu JavaScript, tak vše funguje v pořádku.
Bohužel nevím, kde dělám chybu.
Kód BasePresenter.php:
public function afterRender()
{
if ($this->isAjax() && $this->hasFlashSession())
$this->invalidateControl('flashes');
}
Kód ContactPresenter.php dědící od BasePresenter.php:
protected function createComponentPostForm()
{
$form = new Form();
$form->getElementPrototype()->class('ajax');
$form->addText('name', 'Jméno:', 30, 50)
->addRule(Form::FILLED, 'Jméno je povinné.');
$form->addText('email', 'Email:', 30, 50);
$form->addText('phone', 'Telefon:', 30, 50);
$form->addTextArea('message', 'Text:', 50, 8)
->addRule(Form::FILLED, 'Text zprávy je povinný.');
$form->addSubmit('save', 'Odeslat');
$form->onSuccess[] = array($this, 'postForm_onSubmit');
return $form;
}
Kód @layout.latte:
{snippet flashes}
{foreach $flashes as $flash}<div class="flash {$flash->type}">{$flash->message}</div>{/foreach}
{/snippet}
Kód default.latte:
{block content}
<h2><span class="blue">Kontakt</span></h2>
{snippet form}
{control postForm}
{/snippet}
{/block}
Děkuji za rady
- matoni555
- Člen | 40
Zkusil jsem to, ale nepomohlo to. Vycházel jsem z tohoto: https://pla.nette.org/…ivajici-ajax a je tam afterRender.
- uestla
- Backer | 799
Při chybě (tj. když se odešle nevalidně vyplněný formulář) se chyba neukládá do flashMessage, ale připne se k instanci formuláře.
Čili bych doporučil snippet s formulářem invalidovat vždy při odeslání, nezávisle na validitě. To znamená:
$form->onSubmit[] = array($this, 'invalidatePostFormSnippet');
$form->onSuccess[] = array($this, 'postForm_onSubmit');
// a dále v Presenteru:
function invalidatePostFormSnippet($form)
{
$this->invalidateControl('form');
}
- iguana007
- Člen | 970
Já to řeším takto:
<?php
class FooForm extends AppForm
{
public function __construct($parent, $name)
{
parent::__construct($parent, $name);
$this->getElementPrototype()->class = 'ajax';
$this->onSuccess[] = array($this, 'successSubmit');
$this->onError[] = array($this, 'invalidSubmit');
return $this;
}
public function invalidSubmit(AppForm $form) {
foreach ($form->errors as $error) {
$this->presenter->flashMessage($error, 'error');
}
$this->presenter->invalidateControl('flashes');
}
}
?>