[Best practice?] Presenter > Formulář > Zpracování

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
mirimCZ
Člen | 24
+
0
-

Ahoj,

tož sem si dneska všiml, že asi dělám něco špatně kolem zpracování formuláře. Nikdy to teda nezpůsobilo žádný problém a ani teď to vlastně není moc problém, ptám se tedy čistě z pohledu best practice a toho, že chci používat nette pokud možno čistě :)

Mám presenter, můžeme mu říkat třeba Graf, ten má jedinou akci Default. Akce má za úkol vykreslit graf z defaultních hodnot, které získává z modelu:

public function actionDefault()
{
	$idMeasure = $this->serviceDetectionStats->getLastMeasureId();
	$engines = $this->serviceDetectionStats->getEngineList();
	$this->template->chart = $this->createChartStats($idMeasure, $engines);
}

Pak mám formulář, říkejme mu Filtr – ten má jediné pole a to select, kde je možné vybrat různá měření, z hodnot měření se bude vykreslovat graf (1 měření ku N hodnotám). Odeslání se děje z actionDefault na actionDefault. onSuccess callback Filtru je metoda v presenteru – filtrSuccess:

public function filterSuccess(\DetectionStatsModule\Forms\DetectionStatsFilterForm $form)
{
	$values = $form->getValues();
	$this->template->chart = $this->createChartStats($values['idMeasure'], $values['engines']);
}

Metoda createChartStats($idMeasure, $engines) je zodpovědná za získání dat a posléze vytvoření grafu, její implementace pro nás není důležitá.

No a jak už asi mnozí tuší, můj problém je ten, že s touto implementací se při odeslání Filtru metoda createChartStats vykoná 2x – poprvé z actionDefault (s defualtními hodnotami), podruhé z filterSuccess (s hodnotami z Filtru). To nechci, ta metoda bude procesně náročná. Takže se chci zeptat co s tím a jak to dělat lépe/správně.

Předem díky za všechny odpovědi.

_____

Momentálně jsem to vyřešil tak, že createChartStats jsem přejmenoval na createChartConfig, což si jen uloží argumenty do vlastnosti třídy a databussiness kolem grafu se děje v beforeRender. Jsem docela přesvědčenej, že to tam nepatří, ale zatím to ničemu nevadí, nicméně vím, že by nehezké věci mohli nastat :)

Editoval mirimCZ (5. 5. 2014 14:58)

sKopheK
Člen | 207
+
0
-

Metodu createChartStats() s defaultními hodnotami volej jen, pokud není formulář odeslán.

$form = $this['Filtr'];
if (!$form->isSubmitted())
{
    $idMeasure = $this->serviceDetectionStats->getLastMeasureId();
    $engines = $this->serviceDetectionStats->getEngineList();
    $this->template->chart = $this->createChartStats($idMeasure, $engines);
}

ale ještě lepší by bylo ty hodnoty vyplněné ve formuláři předat v URL a vykreslovat podle toho.

Editoval sKopheK (5. 5. 2014 15:34)

mkoubik
Člen | 728
+
0
-

mirimCZ napsal(a):
No a jak už asi mnozí tuší, můj problém je ten, že s touto implementací se při odeslání Filtru metoda createChartStats vykoná 2×

To rozhodně není tvůj největší problém. Horší je že po tom odeslání formuláře nepřesměrováváš (ani nemůžeš – zmizely by ti ty hodnoty), takže zůstaneš zaseklý na POST požadavku. Nemůžeš rozumně refreshovat, nemůžeš nikomu poslat odkaz, navíc máš vlastně dvě různé akce GET /graf/ a POST /graf/ se stejným obsahem, atd. Prostě bordel.

V obsluze formuláře si ulož hodnoty do persistentních parametrů a přesměruj na tu samou akci. v metodě akce si pak načti hodnoty z těch parametrů a pokud tam je null, tak teprve výchozí z modelu.

Editoval mkoubik (5. 5. 2014 17:25)

mirimCZ
Člen | 24
+
0
-

Formulář se posílá přes GET.

mkoubik
Člen | 728
+
0
-

Přesměrovávat bys to měl tak jako tak, protože je to signál – v URL ti předpokládám zůstává ?do=....