Nette 2.3.8 – Formulář ve vnořené komponentě
- F.Raven
- Člen | 12
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
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
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
pri odeslani formulare se to ID ztrati, takze ho musis predat pres persistentni parametr nebo treba hidden input u formulare