viac flashMessage sprav v jednej sablone
- dubak
- Člen | 41
Zdravim,
akurat riesim jeden problem. Pozeral som forum a nasiel som iba jedno 2 roky stare vlakno, kde sa to nedoriesilo. Mam v presenteri signal, ktory vykona to co chcem a naplni flashMessage spravou, napr.:
<?php
public function handleNieco($param)
{
//vykona co chcem
$this->flashMessage('Sprava o uspechu.');
$this->redirect('Homepage:zvolena sablona');
}
?>
Lenze problem je vtom, ze nielen v sablone „zvolenasablona“ aj v @layout sablone mam potom spominane:
{foreach $flashes as $flash}<div class="flash {$flash->type}">{$flash->message}</div>{/foreach}
a potom dostanem teda vypisanu flash spravu 2-krat.
Ano, riesenie by mohlo byt pouzivat iba jeden hlavny system na zobrazovanie, ale
takto viem spravu zobrazit blizsie k miestu, kde sa akcia odohrala a nie niekde
v zahlavi webu.
Cize otazka znie, ako povedat (urobit), aby sa sprava zobrazila iba na zvolenom mieste
Diky moc
- Mikulas Dite
- Člen | 756
To nejde, $flashes
je v době vykreslování už konstantní a
nic se s ním neděje. Teoreticky by šlo rozšířit $flash
o nový atribut, třeba $flash->location
a pomocí přepsání
metody flashMessage()
ho nastavovat. (Šlo by i zneužít ten
atribut type
, ale bylo by to trošku nepřehledné.)
Flashmessage bych ale z pohledu UI chápal tak, že patří vždy na stejné místo. Asi používáš flash message moc. Formulářové chyby se vypisují přes form errors v šabloně u formuláře, vizuální komponenty jako třeba anketa by taky nemuseli flash message používat → vypíšou si jenom něco do šablony a taky to bude na správném místě.
Klidně pošli tvoje použití (myšlenku, ne kód) a vymyslíme, jestli by to bez flash message nešlo.
- dubak
- Člen | 41
No kludne poslem aj kod, len neviem ci to bude potom prehladne. Pokusim sa
zhrnut myslienku,
mam taky Newsletter formular. Ten som standardne vytvoril cez createComponent
metodu a frci cez AJAX:
<?php
protected function createComponentJqueryNewsletterForm($name)
{
$form = new AppForm($this, $name);
$form->getElementPrototype()->class('ajaxjQueryForm');
$form->addText('name', 'Meno:', 20, 30)
->addRule(AppForm::FILLED, 'Meno je povinné.')
->getControlPrototype()
->class('input');
$form->addText('email', 'E-mail:', 20, 60)
//musi byt vyplnene
->addRule(AppForm::FILLED, 'E-mailová adresa je povinná.')
//musi mat tvar email adresy
->addRule(AppForm::EMAIL, 'Zadajte platnú e-mailovú adresu.')
->getControlPrototype()
->class('input');
//submit button
$form->addImage('send', WWW_ROOT.'/obr/btn_search.gif')
->getControlPrototype()
->title('Odoslať')
->class('loginSubmit');
$form->onSubmit[] = array($this, 'submitJqueryNewsletterForm');
return $form;
}
?>
Metoda ktora formular spracuje:
<?php
public function submitJqueryNewsletterForm(AppForm $form)
{
$entry = $form->getValues();
$newsletterModel = new NewsletterModel();
if( $newsletterModel -> odoslatAjaxNewsletterMail($entry) )
{
$this->flashMessage('Váš email bol odoslaný. Ďakujeme.');
if (!$this->isAjax()){
$this->redirect('this');
}
// AJAX poziadavka
else {
// zneplatnenie snippetu
$this->invalidateControl('newsletterFormular');
$this->invalidateControl('flashes');
// vyprazdnenie hodnot formulara
$form->setValues(array(), TRUE);
}
}else{
$this->flashMessage('Váš email nebol odoslaný.');
}
}
?>
Po odoslani formulara pride uzivatelovi potvrdzujuci email aj s pripadnou
unsubscribe linkou. O to sa stara model. No a teraz neviem ci to ako som to
vyriesil je spravne, ale takto ma to napadlo:
Po kliknuti na unsubscribe linku mi signal spracuje metoda v presenteru:
<?php
public function handleUnsubscribe($hash)
{
$newsletterModel = new NewsletterModel();
if($newsletterModel -> unsubscribeUser($hash)){
// odhlasenie prebehlo spesne
$this->flashMessage('Boli ste úspešne odhlásený z odberu noviniek.');
$this->redirect('Homepage:unsubscribe');
}else{
// HASH bol zly => presmerujem na uvod $this->redirect('Homepage:default');
}
}
?>
A potom v sablone sa mi vykresli ten oznam o uspesnom odhlaseni
z newslettera. To mam umiestnene hned nad formularom, aby clovek videl ze to
suvisi spolu. Tam sa mi vypisuje aj flash sprava o uspesnom zaradeni do
newsletter databazy.
Lenze ako som pisal aj v @layout sablone mam flash messages DIV kvoli
inym veciam.
Cize nejaka idea ako zobrazit info o odhlaseni z newslettera nad formularom
v sablone?
Vdaka
- Filip Procházka
- Moderator | 4668
Presenter by měl mít svoje zprávičky a každá komponenta (potomek Control) by měl mít taky svoje zprávičky. Proto pokud chceš mít zprávičky ještě i u jiného prvku stránky, je logické ho oddělit do komponenty a přiřazovat zprávičky jenom jemu.
Editoval HosipLan (2. 4. 2011 21:58)
- dubak
- Člen | 41
HosipLan napsal(a):
Presenter by měl mít svoje zprávičky a každá komponenta (potomek Control) by měl mít taky svoje zprávičky. Proto pokud chceš mít zprávičky ještě i u jiného prvku stránky, je logické ho oddělit do komponenty a přiřazovat zprávičky jenom jemu.
Hmmmmmm, ale ako to oddelenie urobit? To je to, co neviem.
- kravčo
- Člen | 721
Pridať flash správičku správnemu objektu:
<?php
$presenter->flashMessage('Toto je prezenter');
$control->flashMessage('Toto je kontrolka');
Spraviť si môžeš niečo ako FormControl:
class FormControl extends Nette\Application\Control
{
public function setForm(Nette\Application\AppForm $form)
{
$this->addComponent($form, 'form');
}
// ...
}
So šablónou:
{foreach $flashes as $flash}
<div class="flash {$flash->type}">{$flash->message}</div>
{/foreach}
{$control['form']}
Ktorú vypíšeš namiesto formulára…