Překreslení formuláře po ajaxovém odeslání

tomas.blaha
Člen | 7
+
0
-

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

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

CZechBoY
Člen | 3608
+
0
-

Nebo explicitne rict komponente aby vygenerovala novou otazku. tzn. implementovat logiku na vygenerovani nove otazky bokem a potom to zavolat v success/kde potrebujes.