Nezobrazení flashes při AJAXu

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

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

Nox
Člen | 378
+
0
-

Není afterRender trochu pozdě? Zkus beforeRender

matoni555
Člen | 40
+
0
-

Zkusil jsem to, ale nepomohlo to. Vycházel jsem z tohoto: https://pla.nette.org/…ivajici-ajax a je tam afterRender.

uestla
Backer | 799
+
0
-

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
+
0
-

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');
	}
}
?>
uestla
Backer | 799
+
0
-

@iguana007: S tím, že se ti při neAJAXu vypíšou ty chyby dvakrát? (tj. jak ve flash messages, tak u formuláře?)