Okamžité odeslání formuláře (vždy prodleva cca 5sec.)

emololftw
Člen | 82
+
0
-

Dobrý den všem,

měl bych spíše obecný dotaz. Mám v nette kompletní aplikaci a teď přichází ladění. Mám zde modul(presenter), který „tahá“ z DB okolo 2000 řádků a vykresluje výsledky do grafů (chart.js). Vše funguje perfektně, ale mám zde dotaz ohledně odezvy požadavku.

Pokud vyberu jiné časové období (počet řádků bude cca totožný). A submitnu formulář, než se vykreslí nový obsah, systém čeká cca 5 vteřin a až poté redirectne na stránku s novými výsledky, které ihned vykreslí. Přemýšlel jsem nad ajax snippetem, ale přesto se zeptám zkušenějších.

Chtěl bych docílit toho, že po odeslání formuláře se ihned dostanu na požadovanou stránku s parametry a nepohodlné vykreslování grafů překryl například nějákým divem, který po načtení stránky skryji.

Pro představu mám zde komponentu pro formulář:

public function createComponentShortForm(): Nette\Application\UI\Form
{
    return $this->rangeFormFactory->createSimple(function ($s) {
        $objRange = App\Model\Shift::makeArrayFromRange($s['w']);
        $this->redirect('this', [
            'p1' => $objRange->shiftStart,
            'p2' => $objRange->shiftEnd,
            'p3' => $s['q']]
        );
    },
        ['q' => $this->parametersHelper->g('q')],
    );
}

A následně akce, která tahá cca 2000 řádků z DB

public function actionSummary()
    {
        $sType = match($this->parametersHelper->g('appliedFunctions')) {
            'ctmachining' => ['CT_Machining' => []],
            'ct' => ['CT' => []],
            'downtimes' => ['getDowntimes' => [null, 60]],
            default => ['ProducedPieces' => []]
        };

        return $this->template->oee = $this->shiftHelper
            ->rangeCustom(
                generateCustomOnce:[
                    $this->parametersHelper->g('shiftStart'),
                    $this->parametersHelper->g('shiftEnd'),
                ],
                functionsDetail:$sType,
                returnSUMColumn:true,
                generateRange:$this->parametersHelper->g('timestep')
            )[key($sType)];
    }

Server jede na localhostu s php 8.0.1

Děkuji všem a přeji pevné zdraví.

Kamil Valenta
Člen | 822
+
0
-

Action se procesuje ještě před handlem.
Udělej si z actionSummary() renderSummary() a měl bys mít po problému.

Nebo samozřejmě ten graf donačítat ajaxem až po načtení stránky…

emololftw
Člen | 82
+
0
-

Kamil Valenta napsal(a):

Action se procesuje ještě před handlem.
Udělej si z actionSummary() renderSummary() a měl bys mít po problému.

Nebo samozřejmě ten graf donačítat ajaxem až po načtení stránky…

Děkuji za odpověď. Vůbec mne to netrklo přesunout fetch dat do render metody. Navýšení je tam maličké, myslím si, že nyní budu řešit problém jquery funkcí click, že po stisknutí formuláře se zobrazí loading gif.

Marek Bartoš
Nette Blogger | 1280
+
0
-

Imho tam máš ještě problém s neefektivním dotazem, 5 sekund je opravdu hodně. Zkontroloval bych si, zda se data získávají pomocí indexovaného sloupce a zda databáze při dotazu index používá. To zjistíš skrze sql příkaz EXPLAIN (většina databází integrovaných do nette ti explain vypíše v tracy baru pod dotazem)

emololftw
Člen | 82
+
0
-

Mabar napsal(a):

Imho tam máš ještě problém s neefektivním dotazem, 5 sekund je opravdu hodně. Zkontroloval bych si, zda se data získávají pomocí indexovaného sloupce a zda databáze při dotazu index používá. To zjistíš skrze sql příkaz EXPLAIN (většina databází integrovaných do nette ti explain vypíše v tracy baru pod dotazem)

Velice zajímavý postřeh. Omlouvám se neuvedl jsem, že je type SIMPLE. Avšak problém nejspíš bude někde s DB, jelikož alternativou co beží na produkci je tahat data do skupin (delší časový interval → místo hodin → dny) a odezva je již v normálu.

Děkuji za Váš čas.