jak renderovat ve smycce?

pp
Člen | 48
+
0
-

Zdravim,
mam formular kde nad vybranou polozkou spoustim cyklus casove narocnejsich operaci a vysledek se zobrazi az po dokonceni cyklu.
Rad bych zobrazil uzivateli info po dokonceni kazde iterace. Myslel jsem si, ze v sablone pouziju snippet a v nem vypisu result ale takto mi to nefunguje.

protected function createComponentForm() {
                $form = new UI\Form;
                $form->addSelect( 'router_id', '')->setItems($this->routerManager->getRouters([2]))->setPrompt('Vyber:');
                $form->addSubmit('send', 'OK');

                $form->onSuccess[] = function(UI\Form $form) {
                    $values = $form->getValues(TRUE);
                    $list = $this->routerManager->getListFromRouter($values['router_id']);
                    foreach($list as $a){
                        $this->template->result = $this->routerManager->add($a);
							$this->redrawControl('snippetResult');
                    }
                };
                $form->setRenderer(new \Nextras\Forms\Rendering\Bs3FormRenderer());
                return $form;
}
{snippet snippetResult}
    {$result}
{/snippet}
Rob Bob
Člen | 60
+
0
-

Takhle to nepůjde, payload se snippety se pošle tak jako tak až na konci životního cyklu presenteru. Obecně je tohle trochu problém, protože HTTP a PHP na tohle není dělané. Asi takové nejčistší řešení je trochu si to rozložit na jednotlivé tasky a uložit si je do databáze, pak mít nějaký task runner (jiný proces), který je bude zpracovávat a ukládat výsledek/stav zpět do databáze a pak mít další proces, který se bude dotazovat na stav tasku (ten už bude např. pravidelně spouštěný AJAXem ze strany klienta). Je to trochu složitější architektura, ale je to dobře škálovatelné a znovupoužitelné.

Další možnost by mohla být předčasně posílat output buffer (ob_get_contents() a ob_flush()), ale toho bych se asi trochu bál.

Editoval Rob Bob (8. 12. 2017 11:32)