Zhrnúť spoločnú funkcionalitu viacerých presenterov do jednej komponenty

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

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:

  1. Ako uchovať parametre komponenty persistenté naprieč presentermy Kategórie, Podkategórie a Produktu
  2. 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ť)

CZechBoY
Člen | 3608
+
0
-

Co si ty filtry uložit v presenteru a těm komponentám je jen předat při vytvoření?

tino415
Člen | 46
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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…

CZechBoY
Člen | 3608
+
0
-

A jak píšeš ty odkazy teď?

tino415
Člen | 46
+
0
-

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 ?