predani last id do presenteru a redirect
- crookslovacko
- Člen | 75
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)
- Jan Mikeš
- Člen | 771
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
@Lexi: Má to nějaké výhody oproti tomuhle?
public $onSave = [];
pubf successForm()
{
$this->table->save();
$this->onSave();
}
- Jan Mikeš
- Člen | 771
@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
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
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
@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
@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
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
@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
@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
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á