Jak přenést ID entity při zpracování formuláře v komponentě
- Odo
- Člen | 48
Ahoj všem,
jak nejlépe vyřešit přenesení ID entity při zpracování fomuláře
v komponentě?
Jde to zhruba o toto:
- zpracuje se signál
handleEdit($id)
- vytvoří se formulář
createComponentEditForm()
, default hodnoty se nastaví pomocí$model->getItem($id)
- uživatel vyplní a odešle formulář
- volá se opět bod 2, jenže tentokrát již není k dispozici
$id
pro načtení entity :( - zpracuje se formulář
editFormSucceeded()
Je jiná možnost, než to řešit persistentním parametrem
$id
?
- Kamil Valenta
- Člen | 822
Nevím, zda jsem to pochopil dobře, ale to $id si můžeš dát do hidden toho formu a pak ho budeš mít buď v $id (po bodu 1.) nebo ve $values->id (po bodu 4.)
- Odo
- Člen | 48
Když dám ID do hidden inputu tak přece nebude k dispozici při vytváření formuláře.
Ono jde vlastně o to uchovat ten stav ‚editace‘ pro případ, že je potřeba formulář udržet při chybě. Formulář je ve snippetu a má se zobrazit pouze při signálu editace, ne třeba při signálu stránkování nebo řazení.
- F.Vesely
- Člen | 369
Ale no tak, prvni odkaz v Google na dotaz „nette multiplier“ je dokumentace https://doc.nette.org/…n/multiplier :D
Procti si to, zajima te hlavne ten druhy priprad, kdy se tam predava to
id
.
- petr.pavel
- Člen | 535
handleEdit()
je reakce na signál, stejně tak
editFormSucceeded()
, proto se ti nezavolají oba. Co takhle místo
handleEdit()
použít actionEdit()
?
- stepos2
- Člen | 53
Pokud máš jeden formulář, nepotřebuješ Multiplier. Zajímá tě předání parametru tak, abys s ním mohl pracovat kdekoli v komponentě. Potřebuješ k tomu továrnu, viz dokumentace
Editoval stepos2 (19. 4. 2020 11:23)
- F.Vesely
- Člen | 369
On ale pri zpracovani formulare to id
nezna, protoze predtim
pouzil handleEdit($id)
. Nemuze teda pouzit jenom tovarnu
s parametrem id
, protoze by mu to pri zpracovani formulare
hodilo chybu.
Pokud by to takto chtel pouzit, tak by musel pouzivat
actionEdit($id)
. Pochopil jsem ale, ze to nechce, protoze treba ma
stranku s vypisem polozek a po kliku na tlacitko chce zobrazit na te same
strance pres snippet formular a na tohle se Multiplier hodi.
Napriklad takto:
{snippet editForm}
{ifset $editId}
{control edit-$editId}
{/ifset}
{/snippet}
public function handleEdit(int $id): void
{
$this->template->editId = $id;
$this->redrawControl('editForm');
}
public function createComponentEdit(): Multiplier
{
return new Multiplier(function ($id) {
... tady klidne muze pouzit tovarnu
});
}
- Odo
- Člen | 48
Moje původní řešení je zhruba takové:
{snippet form}
{default $action = ''}
{if $action == 'edit'}
{control editForm}
{/if}
{/snippet}
/** @persistent */
public $id;
public function handleEdit($id)
{
$this->template->action = 'edit';
$this->redrawControl('form');
// $this->id = $id se nastaví automaticky
}
protected function createComponentEditForm()
{
$item = $this->model->getItem($this->id);
$form = new \App\BaseForm;
// přidání prvků
$form->setDefaults($item);
return $form;
}
Zajímalo mne, zda to jde udělat jednodušeji/správněji :)