Překreslení formuláře po ajaxovém odeslání
- tomas.blaha
- Člen | 7
Zdravím ve spolek,
už několik hodin se trápím s problémem, který nemohu zdárně vyřešit.
Situace se má takto:
Mám databázi, kde je několik otázek (každá má několik parametrů –
znění, formát odpovědi, možnosti,…)
Podle toho, jaký formát odpovědi otázka má definovaný, takové se
v render metodě nastavení formuláři vstupní pole(input/radio atp.)
Formulář se odesílá přes ajax (nette.ajax.js) a onSuccess má přiřazenou funkci guideSubmitted.
Po odeslání formuláře by se měla uložit odpověď a na základě uložené odpovědi by se měla načíst nová otázka, vytvořit potřebný formulář a ten překreslit. (v šabloně je formulář ve snippetu)
Když se to pokouším udělat nyní
<?php
{snippet question}
{$nazev_otazky}
{control formGuide}
...
{/snippet}
?>
<?php
public function createComponentFormGuide() {
$form = new \GuideFormFactory;
$form = $form->create();
$current_question = $this->client->get_current_question();
... Logika pro nastavení správných polí formuláře
$this->form->onSuccess[] = [$this, 'guideSubmitted'];
return $this->form;
}
?>
<?php
public function guideSubmitted($form) {
// ... Uložení do databáze
$this->redrawControl('question');
}
?>
Překreslí se správně například nazev_otazka, ale formulář, který je jako komponenta, se nevyrenderuje „zaktualizovaný“
Napadly mě dvě možné příčiny: buď probíhá render a redraw metoda dříve, než se vše uloží do databáze, nebo je problém s tím, že je formulář vykreslován jako komponenta.
Nepadá někoho, jak to řešit?
Děkuji mockrát
- David Matějka
- Moderator | 6445
zajimavy problem. pricina je v tom, ze aby se formular zpracoval, tak se musi nejdriv vytvorit – a vytvori se s tou otazkou, se kterou tou clovek odeslal a pri vykreslovani formulare se tedy pouzije tento stav a formular se uz nevytvari s novou otazkou.
nejake hezke reseni me moc nenapada, ale jako workaround by asi slo pridat pod to redrawControl neco jako
$this->removeComponent($this['formGuide']);
a komponenta by se pote mela znovu vytvorit s novou otazkou