Nette 2.3.8 – Formulář ve vnořené komponentě

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

Dobrý den,
v presenteru si vytvářím v továrničce komponentu, která mi vykreslí tabulku klientů…

	protected function createComponentClients()
	{
		return new \Clients($this->context->getService('dibi'));
	}

V komponentě Clients mám opět továrničku, která po ajaxovém volání tvoří komponentu detailu klienta…

	protected function createComponentClientDetail()
	{
		return new ClientDetail($this->dibi, $this->clientId);
	}

V komponentě ClientDetail mám další továrničku, která po ajaxovém volání vytvoří komponentu s formulářem a metodami zpracování…

	protected function createComponentUpdateForm()
	{
		return new ClientForm($this->dibi, $this->clientId);
	}

V komponentě ClientForm mám další továrničku, to už je standartní Nette formulář…

	protected function createComponentForm()
	{
		// kupa blbostí co potřebuju (standarní nette formulář)
		$form->onSuccess[] = array($this, 'formSubbmitted');
		return $form;
	}

Co to dělá:
Seznam klientů se vykreslí, když si kliknu na klienta, tak se mě do modalu ajaxově natáhne jeho detail, když si v detailu kliknu na upravit, tak se mi ajaxem natáhne formulář s datama (vše zatím funguje jak má). Když formulář chci odeslat, tak to spadne. Formulář (ten Nette) má action=„/neni-podstatne/admin/clients-view“ což mě nedává úplně smysl (clients-view je název akce presenteru, ve kterém se vykresuje seznam klientů (nad touto akcí se vytvoří komponenta Clients). Nevíte co s tím?

Konkrétně to spadne s touto hláškou:
exception ‚ErrorException‘ with message ‚Undefined index: guestIdentificator‘ in C:\xampp\htdocs\bla-bla\app\model\Admin\ClientDetail\ClientDetail.php:39“ Což je defakto první místo kde v daném flow je potřeba vědět „clientId“, což aplikace nemůže samozřejmě znát, protože se tam vůbec clientId nemělo jak dostat (v atributu action ve formuláři je totiž odkaz na akci presenteru nikoliv na danou vnořenou komponentu).

David Matějka
Moderator | 6445
+
+1
-

ta akce je spravne, vzdy se vytvareji akce na ten presenter, kde je ta komponenta – nikoliv primo na komponenty. Odkud beres to clientId ?

F.Raven
Člen | 12
+
0
-

To předávám signálem

	public function handleUpdate($id)
	{
		$this->clientId = $id;
		$this->update = 1;
		$this->invalidateControl();
	}

na komponentu ClientDetail. Následně se v šabloně invaliduje snippet v templatu komponenty ClientDetail

<div class="box">
     {snippet update}
          {if $update}
               {control updateForm}
          {/if}
     {/snippet}
</div>
David Matějka
Moderator | 6445
+
+2
-

pri odeslani formulare se to ID ztrati, takze ho musis predat pres persistentni parametr nebo treba hidden input u formulare