Jak přenést ID entity při zpracování formuláře v komponentě

Odo
Člen | 48
+
+1
-

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:

  1. zpracuje se signál handleEdit($id)
  2. vytvoří se formulář createComponentEditForm(), default hodnoty se nastaví pomocí $model->getItem($id)
  3. uživatel vyplní a odešle formulář
  4. volá se opět bod 2, jenže tentokrát již není k dispozici $id pro načtení entity :(
  5. zpracuje se formulář editFormSucceeded()

Je jiná možnost, než to řešit persistentním parametrem $id?

Kamil Valenta
Člen | 822
+
0
-

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

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

Muzes pouzit Multiplier. To ti zaruci, ze budes vzdycky znat id pri vytvareni formulare.

Odo
Člen | 48
+
0
-

Aha, ale co je Multiplier?

F.Vesely
Člen | 369
+
+1
-

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

handleEdit() je reakce na signál, stejně tak editFormSucceeded(), proto se ti nezavolají oba. Co takhle místo handleEdit() použít actionEdit()?

Odo
Člen | 48
+
+1
-

@F.Vesely: Diky, vypada to super jednoduse :)

@petr.pavel: Jde o komponenty, ktere (pokud se nepletu) nemaji startup ani action metody.

stepos2
Člen | 53
+
+1
-

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

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

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 :)