Zhrnúť spoločnú funkcionalitu viacerých presenterov do jednej komponenty
- tino415
- Člen | 46
Nemôže sem postnúť zdrojové kódy, tak sa to pokúsim opísať môj problém čo najpresnejšie:
Mám stránku ktorá zobrazuje produkty,
produkty sú organizované do kategórií a podkategórií pričom majú viacero
parametrov (30+),
na každej podstránke sa zobrazuje filter, v ktorom viem vyklikať možnosti a
on ma následne
presmeruje na podstránku buď z kategóriamy, podkategóriamy alebo
produktami, podľa toho čo som
vyklikal. Ešte dodám že parametre filtra tých (30+) musia byť persistentné
medzi kategóriamy, podkategóriamy a produktamy.
Doteraz táto funkcionalita bola implementovaná tak že presentery pre
kategórie, podkategórie a produkty mali spoločného rodiča ktorý mal tých
30 parametrov nastavených ako persistentné a filter bol iba formulár ktorý
podľa parametrov presmeroval na jeden z daných presenterov.
Presentery pre kategórie, podkategórie a produkty následne pri zobrazení
nastavili formuláru filtra hodnoty podľa svojích persistentných
premenných.
Lenže v rámci refaktoringu aplikácie sme sa stotožnili z filozofiou že presenter by mal byť iba kontainer na komponenty.
Avšak keď som sa pokúšal upraviť filter aby spravoval aj parametre v url a všetko okolo filtrovania, tak som narazil na dva problémy:
- Ako uchovať parametre komponenty persistenté naprieč presentermy Kategórie, Podkategórie a Produktu
- Ako nastaviť parametre komponenty ak budem presemerovávať z nejakého iného presenteru (nie kategória, podkategória, produkt) ?
Na prvý problém na napadlo riešenie že by som presentery pre kategórie, podkategóriu a produkt zlúčil. Avšak každý z týchto presenterov má nejaké svoje komponenty z persistentnými parametramy ktoré nechem zdielať medzi nimi (zoraďovanie, stránkovanie).
Ide takéto niečo nejak elegantne vyriešiť ?
(Filter bol jedná z motivácií pre refaktoring, vzhľadom na to že je jeho logika rozťahaná cez niekoľko presenterov a komponentov, tak bol dosť problém ho upravovať/opravovať)
- tino415
- Člen | 46
CZechBoY napsal(a):
Co si ty filtry uložit v presenteru a těm komponentám je jen předat při vytvoření?
Nie som si istý či úplne rozumiem, ale to znie ako aktuálne riešenie, kde mám persistentné parametre na presentery a potom ich predávam do filter formu ?
Skôr by ma zaujímalo či by sa táto funkcionalita dala nejak úplne vytiahnuť do komponenty.
Ako som spomínal, chcel by som dosiahnuť to, aby presenter bol iba kontajner v ktorom sa vytvárajú komponenty…
Ale ďakujem za nápad :)
- CZechBoY
- Člen | 3608
Počkej, a kde teda bereš ty filtry?
Myslel jsem něco takovýho
class ProductsPresenter extends Presenter
{
/**
* @var array
* @persistent
*/
public $filters;
protected function createComponentPage()
{
return $this->pageResolver->resolvePageComponent($this->filters);
}
}
class PageResolver
{
public function resolvePageComponent(array $filters)
{
if (!empty($filters['sub_category_id'])) {
return $this->categoryPageFactory->create($filters);
}
}
}
nebo něco na ten způsob…
V presenteru nemáš prakticky nic, jen předáš vykonávání na konkrétní
komponentu.
- tino415
- Člen | 46
CZechBoY napsal(a):
Počkej, a kde teda bereš ty filtry?
Myslel jsem něco takovýho
class ProductsPresenter extends Presenter { /** * @var array * @persistent */ public $filters; protected function createComponentPage() { return $this->pageResolver->resolvePageComponent($this->filters); } } class PageResolver { public function resolvePageComponent(array $filters) { if (!empty($filters['sub_category_id'])) { return $this->categoryPageFactory->create($filters); } } }
nebo něco na ten způsob…
V presenteru nemáš prakticky nic, jen předáš vykonávání na konkrétní komponentu.
Aha, už chápem, takto by to mohlo ísť, jediné čo sa mi moc nepozdáva je to že sa mi predĺžia routy, každý z tých 30 parametrov má asi 3–4 rôzne názvy kvôli spätnej kompatibilite zo staršímy systémamy :D, dá sa nejak dýnamicky pridávať persistentné parametre ?
- CZechBoY
- Člen | 3608
Co teď konkrétně myslíš? Chceš s co nejmenší bolestí opakování
vytvořit aliasy parametrů v url na property v presenteru?
Já jsem teda počítal s polem, ale asi můžeš to pole vytvořit i nějak
ručně. Vhodné by bylo i nějaké zapouzdření do přepravky, jinak se
upíšeš k smrti a každá změna bude znamenat změny na X různých
místech.
- tino415
- Člen | 46
CZechBoY napsal(a):
Co teď konkrétně myslíš? Chceš s co nejmenší bolestí opakování vytvořit aliasy parametrů v url na property v presenteru?
Já jsem teda počítal s polem, ale asi můžeš to pole vytvořit i nějak ručně. Vhodné by bylo i nějaké zapouzdření do přepravky, jinak se upíšeš k smrti a každá změna bude znamenat změny na X různých místech.
Po dlhšej dobe som sa k tomu vrátil,teraz už vidím že buď prepíšem všetky linky v šablonach a v routry alebo budem musieť hackovať presenter…
- tino415
- Člen | 46
CZechBoY napsal(a):
A jak píšeš ty odkazy teď?
no mám filter ako persistentné parametre a niekotré parametre sú súčasťou url npt teda mám niečo ako /region/<$filter[‚regionSlug‘] alebo /terms/<$filter[‚regionSlug‘]/<$filter[‚hotelSlug‘]
znova som sa vratil k tejto moznosti a neviem ako napisat taketo pravidla do url, neviete niekto ako na to ?