viac flashMessage sprav v jednej sablone

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

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

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

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

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

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

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…