predani last id do presenteru a redirect

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

Ahojte

jeden mensi problemek:

mam klasicky formular ktery resim pres tovarnicku a chci ho po uspesnem odeslani redirectnout is poslednim ulozenym id:

protected function createComponentNewSellForm()
        {
            $form = $this->newSellFormFactory->create();
            $form->onSuccess[] = function ($form) {
              $id = $form->values['id'];
              $form->getPresenter()->redirect('Admin:finishedsell', $id);
            };
            return $form;
        }

problem je ze pokud chci ve values id tak se nevypise. Pokus je ve values cokoliv jineho co je v inputech napr jmeno tak se hodnota preda..
id je autoincrement a envytvarim si ho sam ale db.
Musim si to ve formulari nejak ulozit treba pres cache ci jinak?. Diky

Pro jistotu i formular se succes

public function create()
	{
		$form = new Form;

                $form->addText('jmeno', 'Jméno:')
                        ->setRequired('Zadejte prosím název')
                        ->setAttribute('class', 'newuser');

                $form->addText('rozmer', 'Rozměr:')
                        ->setAttribute('class', 'newuser');
                $types = $this->database->table('type')->fetchPairs('id', 'type_name');

                $form->addSelect('type' ,'Typ zboží',$types)
                        ->setAttribute('class', 'newuser');

                $form->addTextArea('popis', 'Popis:')
                        ->setAttribute('class', 'newuser');

                $form->addText('cena', 'Cena:')
                        ->setAttribute('class', 'newuser');

                $form->addSubmit('send', 'Nové zboží')
                     ->setAttribute('class', 'btn');

		$form->onSuccess[] = array($this, 'formNewSellSucceeded');

                return $form;
        }

        public function formNewSellSucceeded(Form $form, $values)
	{

                $this->database->table('sell')->insert(array(
                    'jmeno' => $values->jmeno,
                    'type_id' => $values->type,
                    'rozmer' => $values->rozmer,
                    'popis' => $values->popis,
                    'cena' => $values->cena
                     ));

        }

Editoval crookslovacko (15. 6. 2016 4:34)

Oli
Člen | 1215
+
+1
-

Metoda insert vrací last insert. Takze si to predej z formNewSellSucceeded. Výtvor si property treba onSave. V formNewSellSucceeded zavoolej $this->onSave($lastInsert); a přepis si tu událost v presenteru.

Jan Mikeš
Člen | 771
+
0
-

Ahoj, ja pouzivam predavani callbacku skrze create() metodu mych factories a funguje perfektne, viz priklad:

public function create(callable $callback)
{
        $form = new Form;

        ///       ...

        $form->onSuccess[] = function($form, $values) use ($callback) {
			$this->formNewSellSucceeded($form, $values, $callback);
		}

        return $form;
}

public function formNewSellSucceeded(Form $form, $values, callable $callback)
{
	$insertedRow = $this->database->table('sell')->insert(array(
		'jmeno' => $values->jmeno,
		'type_id' => $values->type,
		'rozmer' => $values->rozmer,
		'popis' => $values->popis,
		'cena' => $values->cena
	));

	$callback($form, $values, $insertedRow);
}
protected function createComponentNewSellForm()
{
	return $this->newSellFormFactory->create(function($form, $values, $row){
		$form->getPresenter()->redirect('Admin:finishedsell', $row->id);
	});
}
Pavel Kravčík
Člen | 1196
+
0
-

@Lexi: Má to nějaké výhody oproti tomuhle?

public $onSave = [];

pubf successForm()
{
	$this->table->save();
	$this->onSave();
}
Jan Mikeš
Člen | 771
+
0
-

@PavelKravčík napada me jen to, ze nekomu eventovy pristup nemusi vyhovovat, jinak zadne vyhody to asi nema.

V pripade factory mi jde spise o pragmatismus, event s nazvem onSave → ukladani prece neprovadi factory, event onSave by se mi hodil spise nekam do fasady nebo modelove tridy, to uz bychom ale dost komplikovali takto jednoduchy priklad.

Oli
Člen | 1215
+
0
-

Je to asi trochu slovíčkaření, ale vnímám to tak, že formulář zavolá nějaký $this->repositoryManager->save($data);. A tu metodu zavolám potom. Jako co se stane až se to uloží → $this->onSave(). Nikdy mě nenapadlo se po tom ani pídit, ale události fungujou jen s prefixem on, ne? Jinak by dávalo větší smysl afterSave

Mohlo by se to pojmenovat i jako onSuccess, ale to by se zase pletlo s formulářovým onSuccessem. Případně onRedirect, pokud se tam řeší jen ten redirect… To je celkem jedno.

Každopádně tvoje metoda se mě nelíbí. Je sice názornější a pro někoho, kdo není na události zvyklej asi lepší, ale já jsem línej a předávat všude by se mě to nechtělo. :)

Jan Mikeš
Člen | 771
+
+1
-

Ja se snazim velice striktne dodrzovat SRP a tady mi to vylozene vadi, form factory ma mit jen jeden ukol a tim je vytvoreni objektu (v nasem pripade formulare). Udalosti ve factory tride a jejich spousteni tam podle me nemaji co delat a tato zodpovednost by se mela presunout nekam jinam.

Jak ale pise @Oli je to uz dost o slovickareni a filozofii, coding standartech apod…

Editoval Lexi (15. 6. 2016 9:42)

Pavel Kravčík
Člen | 1196
+
0
-

@Lexi @Oli: Naopak je to velice zajímá diskuze. OnSave() asi nebyl nejlepší příklad pojmenování toho příkladu, šlo mi jen o to jestli to bude mít nějakou výhodu, když je s tím o trochu více psaní. Plus pokud bych tam těch callbacků chtěl více, tak bych je musel všechny předat hned v „create“? Každopádně jsem o tom tvém přístupu přemýšlel také, akorát jsem nedokázal najít dost „pro“, abych ho upřednostil před eventy, proto se ptám.

Rezignace na „standardy“ přišla hned po objevení @inject. :D

David Matějka
Moderator | 6445
+
0
-

@PavelKravčík onSave ma ve factory tu nevyhodu, ze pokud bys factory pouzil vicekrat v ramci jednoho requestu, tak tam budou eventy z obou mist. Jinak receno, factory by si nemela drzet stav

Oli
Člen | 1215
+
0
-

Jsem si jaksi úplně nevšiml/neuvědomil, že se jedná o factory. Tam bych události taky nedával. Já to ale dělám přes generovaný továrničky a formulář se potom stará o vykreslení i o poslání dat nějakým nanageru/repository. Zakončen událostí (když jsem línej a nevadí to logice tak jen $this->presenter->redirect()). Což ale není nic co bych doporučoval, to je moje lenost :-)

Pavel Kravčík
Člen | 1196
+
0
-

@DavidMatějka: Díky!

@Oli: To právě používáme teď a toho bych se rád zbavil. Je to v pohodě pro menší věci s přesně danou funkčností, ale ne pro znovupoužitelné komponenty na více místech.

Oli
Člen | 1215
+
+1
-

@PavelKravčík pak už ale není problém přidat tu property a v presenteru odchytit událost. Nový věci se snažím psát takhle, ale není to zásadní problém i když to uděláš tou „línější cestou“. Co je pak ale blbý, že to není jednotný.

Co za problém považuju, pokud nastavení hodnot z formuláře je součástí formulářové třídy. Pak je nepohodlný ukládat entitu pomocí jiný entity. Například vytvořením článku automaticky vytvořit připojenou galerii. To jsem tak měl dřív a na jednoduchý věci v pohodě, pro složitější už to moc není…

crookslovacko
Člen | 75
+
0
-

No jestli můžu z pohledu nováčka tak jsem teď hodně narážel na problém, že formuláře sou s presentery pro mě zvláštně spojené..např flash msg a pod…takže víc valím componenty a formuláře jen tam kde chci něco jen jednou.
Vaši diskuzi jsem pročetl a stejně mě nejsou uplně jasné dvě věci:

Je to řešení navržené elegantní?
Jak by jste to řešili být mnou..třeba se i vykašlat na formulář a řešit to třeba komponentou či třeba presenterem.
Nějak mi při tom studování mnoha materialů tohle uniká