[Best practice?] Presenter > Formulář > Zpracování
- mirimCZ
- Člen | 24
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
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
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)