Jak používat vlastní chybové zprávy?

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

Zdravím,

nechci používat $this->flashMessage() nebo $form->addError(), protože potřebuji do šablony předávat více informací o zprávě, než jen text a type. Vytvořil jsem si tedy třídu Message s metodou error($text, $elementId), kde $elementId je id html prvku, na který je vyvolána zpráva. Pak používám vlastní třídu Form, která dědí z Nette\Application\UI\Form a v metodě submit() vytváří z formulářových errorů objekty Message. V budoucnu si přidám do BasePresenteru něco jako addErrorMessage(...) a addSuccesMessage(...).
Teď mám ale problém: Kam mám ty objekty Message dávat? A potom, kde je vykreslovat? Mohu je renderovat třeba v metodě afterRender() v BasePresenteru, ale to pak budu muset to damé dělat někde v těch formulářích v submit()

Nebo to je celé špatně a tyhle věci se dělají jinak? …

Díky za odpovědi!

Oli
Člen | 1215
+
0
-

Prvně se zeptám, k čemu to potřebuješ? Možná se mýlím, ale flashMessage a addError chápu, jako seznámení uživatele s nějakou interakcí s aplikací. Úspěšné uložení formuláře, nevyplněné jméno, aplikace spadla, … K tomu všemu mě zatím vždycky stačil jen pouhej text. On stejně nic víc vědět nepotřebuje. Veškerou ostatní logiku okolo toho problému řeším v presenteru/komponentě.

Proto jestli například zpracováváš nějakou logiku okolo toho v šabloně, tak to pravděpodobně děláš špatně. :-)

Xethilos
Člen | 19
+
-1
-

Jestli chceš více informací ve flashMessage, tak přepsat na toto.

	public function flashMessage($message, $parameter, $type = 'info') {
    $id = $this->getParameterId('flash');

    $messages = $this->getPresenter()->getFlashSession()->$id;
    $messages[] = $flash = (object) array(
                'message' => $message,
                'type' => $type,
                'parameter' => $parameter
    );

    $this->getTemplate()->flashes = $messages;
    $this->getPresenter()->getFlashSession()->$id = $messages;

    return $flash;
}

Editoval Xethilos (11. 11. 2014 7:16)

Tepster
Člen | 28
+
0
-

Oli napsal(a):

Prvně se zeptám, k čemu to potřebuješ? Možná se mýlím, ale flashMessage a addError chápu, jako seznámení uživatele s nějakou interakcí s aplikací. Úspěšné uložení formuláře, nevyplněné jméno, aplikace spadla, … K tomu všemu mě zatím vždycky stačil jen pouhej text. On stejně nic víc vědět nepotřebuje. Veškerou ostatní logiku okolo toho problému řeším v presenteru/komponentě.

Proto jestli například zpracováváš nějakou logiku okolo toho v šabloně, tak to pravděpodobně děláš špatně. :-)

  1. Barva zprávy. Ano, to se dá řešit pomocí toho „type“ u flashMessage.
  2. Kde se má zpráva zobrazit. Chci třeba chybové zprávy u formulářů zobrazovat přímo u jednotlivých inputů a to v šabloně nedokážu zajistit, když tam nevím, jaký input daný error vyvolal.
  3. Někdy chci, aby zpráva po 5 sekundách zmizela.
  4. Další vizuální vlastnosti zprávy…
Michal Vyšinský
Člen | 608
+
+1
-

ono se dá udělat toto:

$flash = $this->flashMessage('text');
$flash->color = 'red';
$flash->block = 'header';
$flash->timeout = 5;
$flash->...

Je to asi nejjednodušší řešení bez zásahu do funkčnosti flash message. Bylo by ale lepší si tyto vlastnosti zapouzdřit do objektu a přepsat funkci flashMessage aby vytvářela ten tvůj objekt.

ali
Člen | 342
+
+1
-

@Tepster
2. Pokud si vykrteslujes render formulare rucne tak

{foreach $form[jmeno_inputu]->errors as $error}$error{$error}

Jinak defaultni render zobrazuje chyby normalne pod formularovym polickem

$form["jmeno_inputu"]->addError("chyba")

3. tohle res pres jQuery
4. CSS

Tepster
Člen | 28
+
-1
-

Díky moc za odpovědi. Jenom tedy přepíšu funkci flashMessage(), aby vytvářela objekty mé třídy Message.