Ako dostat values z formFactory do presentera?

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

Caute, nejak som sa pomotal a neviem s toho von :D

mam AbstractFormFactory:

	public function create($entity, Form $form = NULL)
	{
		...
		$form->onSuccess[] = $this->process;
		...
		return $form;
	}

	/**
	 * @param Form $form
	 */
	public function process(Form $form)
	{
		$values = $this->normalize($form->getValues()); // tu si znormalizujem data
		/*... TU POTREBUJEM ODOSLAT DATA DO PRESENTERU ...
		napr. */
		$form->onSuccess($values);
	}

a v presenteri:

	protected function createComponentUserForm()
	{
		$form = $this->userFormFactory->create($this->myUser->contact);
		$form->onSuccess[] = function($values) {

			try {
				... TU SA POSLU DATA DO FACADE NECH SA POSTARA ON ...
			} catch (\ModelException $e) {
			  $this->flashMessage($e->getMessage(), 'danger');
			}

			$this->redirect('this');

		};
		return $form;
	}

lenze tento sposob mi tym padom zavola aj metodu process …

ako by som mal idealne ziskat uz znormalizovane data do presenteru? dik za akukolvek radu

EDIT: pokial je to v tomto stave, vrati mi Recoverable Error v metode AbstractFormFactory->process (array given – to je vysledok AbstractFormFactory->normalize)

Editoval marioff (21. 1. 2015 22:43)

marioff
Člen | 69
+
0
-

oki , asi nik nevie :)

ja to mam vyriesene zatial tak, ze mam udalost vo userFormFactory a v metode process zavolam ju.. a tym padom v createComponent…() bude:

$form = $this->userFormFactory->create($this->myUser->contact);
$this->userFormFactory->onVsetkoJeOk[] = function($values) {

lenze toto riesenie sa mi vobec nepaci :(

newPOPE
Člen | 648
+
+1
-

No neviem ci to nemotas ty a zbytocne :).

Pouzitie signalu/eventu moze byt uplne v poriadku a to v pripade ak potrebujes „poslat“ data z komponenty/formu do presenteru tak je to jedno z najlepsich rieseni.

marioff
Člen | 69
+
0
-

ale ked zavolam event vo forme (onSuccess) ako mam v priklade tak sa zavola 2×

cize technicky by som nemal narazit ak nevyuzijem nejak even vo Form, ale vytvorim vlastny ako je v druhom prispevku?

newPOPE
Člen | 648
+
0
-

onSuccess nevolaj rucne vo forme. Ano druhy priklad je OK.

bazo
Člen | 620
+
0
-

cele zle. FACADE si injektni do tej komponenty. data z formularu spracuj vo funkcii process.
v komponente si vytvor property $onSuccess = []. nepliest s onSuccess formulara
k tejto property moze pristupovat presenter. do tohto onSuccess callbacku si posli vysledok spracovania dat fasadou z komponenty

tvoj priklad nema vobec zmysel. to uz mozes mat ten formular rovno v presenteri a komponentu nepotrebujes. zmysel obalovania formularov do komponent je ten, ze uz si komponenta sama rovno spracuje aj hodnoty z formu, cize presenter neobsahuje ziadne dalsie zavislosti potrebne na toto spracovanie, ale len tovarnicku na vyrobu tejto komponenty.

marioff
Člen | 69
+
0
-

formular nemozem mat v presenteri, lebo sa moze ten isty pouzit aj inde.. a fasadu tak ci tak potrebujem mat injektnutu aj v presenteri, lebo od nej berem dalsie udaje na zobrazenie

preto som sa to tak snazil vyriesit, aj ked asi fakt trochu nelogicky…

sry za blbu otazku ale mozem v komponente po uspesnom (resp. neuspesnom, po zachyteni vynimky) ulozeni dat vypisat flash spravu a presmerovat? nepotrebujem nato presenter?

Ot@s
Backer | 476
+
+2
-

marioff napsal(a):
sry za blbu otazku ale mozem v komponente po uspesnom (resp. neuspesnom, po zachyteni vynimky) ulozeni dat vypisat flash spravu a presmerovat? nepotrebujem nato presenter?

V komponentě máš k dispozici $this->presenter. Nech se ale raději inspirovat formulářem v UI\Control

Oli
Člen | 1215
+
+1
-

Presenter na to nepotřebuješ, ale je to s ním pohodlný. Potřebuješ ho ale trochu jinak, než jsi ho použil ty.

public function process(Form $form)
{
    $values = $this->normalize($form->getValues()); // tu si znormalizujem data
    $this->presenter->flashMessage('Data byla úspěšně uložena');
	$this->presenter->redirect('Presenter:action');
	// Pokud chceš přesměrovat na tu samou stránku, tak presenter nepotřebuješ
	$this->redirect('this');
}

To o co se snažíš ty je, že každý presenter, kam je připojená komponenta si může přesměrovat kam chce a napsat flash jakou chce (případně udělat jakékoli dodatečné úpravy).

// komponenta
public $onSuccess = [];

public function process(Form $form)
{
    $values = $this->normalize($form->getValues()); // tu si znormalizujem data
    $this->onSuccess($this, $values);
}

// presenter1
protected function createComponentUserForm()
{
    $form = $this->userFormFactory->create($this->myUser->contact);
    $form->onSuccess[] = function(AbstractFormFactory $factory, $values) {
		$this->flashMessage('Prsenter 1 úspěšně uložil data');
	    $this->redirect('Presenter1:akce1');
    };
    return $form;
}

// presenter2
protected function createComponentUserForm()
{
    $form = $this->userFormFactory->create($this->myUser->contact);
    $form->onSuccess[] = function(AbstractFormFactory $factory, $values) {
		$this->flashMessage('Prsenter 2 úspěšně uložil data');
    	$this->redirect('Presenter2:akce2');
    };
    return $form;
}
marioff
Člen | 69
+
0
-

oki, urobil som to tak ako navrhol Oli.. len s tym ze udalost som nazval onProcess .. dakujem