Globální nastavení filtrů pro šablony

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

V mé aplikaci používám šablonový filtr curlyBrackets, musím to ale říct (Template::registerFilter) minimálně v předku všech presenterů a pak taky v každé komponentě (nebo jejich společném předkovi, pokud existuje). Mám pocit, že by bylo rozumné mít možnost nastavit defaultní sadu filtrů, která by se použila automaticky pro všechny šablony – třeba pomocí nějaké statické proměnné třídy Template + accessor methods. Každá instance třídy Template by si pak svůj seznam filtrů inicializovala z té statické proměnné.

Asi by to chtělo zároveň implementovat odregistrování filtru u šablony, aby bylo možné defaulty zrušit (a nebo přidat booleovký parametr do konstruktoru, zda je vůbec převzít ;-)

Jednodušší možnost by byla to udělat stejně jako u helperů, tj. inicializace natvrdo u deklarace private $filters. Každopádně by bylo dobré to u obou udělat stejně.

Tímhle nápadem si nejsem úplně jistý, ale to už zvážíš ty, jestli to je blbost nebo ne :-)

David Grudl
Nette Core | 8105
+
0
-

dmajda napsal(a):

…Mám pocit, že by bylo rozumné mít možnost nastavit defaultní sadu filtrů, která by se použila automaticky pro všechny šablony

To by způsobilo komplikace při používání komponent třetích stran.

Jednodušší možnost by byla to udělat stejně jako u helperů, tj. inicializace natvrdo u deklarace private $filters. Každopádně by bylo dobré to u obou udělat stejně.

Protože helpery přímo neovlivňují zpracování šablony (je nutné je explicitně volat), troufl jsem si dát do třídy Template sadu defaultních helperů. U filtrů to udělat nechci.

Spíš bych ti navrhl jít cestou globálně dostupné továrničky na šablony (nebo metody, co existující objekt šablony nakonfiguruje, nevím jak se ten design pattern jmenuje). (Sjednotit tento přístup by měla v dohledné době třída Configurator.)

phx
Člen | 651
+
0
-

Nevim k cemu by toto bylo. V projektu by snad pokazde mel byt nejaky abstract class BasePresenter extends Presenter jako predek vseho a do nej staci dat napr tot:

	abstract class BasePresenter extends Presenter {

		protected function beforeRender() {
			$this->template->registerFilter('CurlyBracketsFilter::invoke');
			$this->template->registerFilter('TemplateFilters::netteLinks');
			$this->template->registerFilter('TemplateFilters::relativeLinks');
		}
	}
dmajda
Člen | 22
+
0
-

David Grudl napsal(a):

dmajda napsal(a):

…Mám pocit, že by bylo rozumné mít možnost nastavit defaultní sadu filtrů, která by se použila automaticky pro všechny šablony

To by způsobilo komplikace při používání komponent třetích stran.

To mě nenapadlo.

Spíš bych ti navrhl jít cestou globálně dostupné továrničky na šablony (nebo metody, co existující objekt šablony nakonfiguruje, nevím jak se ten design pattern jmenuje). (Sjednotit tento přístup by měla v dohledné době třída Configurator.)

Nějak nevidím, jak tohle myžnosti realizovat bez hackování Nette (konkrétně asi přepsání Control::createTemplate) nebo nutnosti psát nějaký kód na víc než jednom místě (minimálně předek komponent a předek presenterů), což byl hlavní důvod téhle připomínky.

Jinak se mi to trochu rozleželo, řešení se statickou proměnnou se mi teď moc nelíbí, je moc globální (případné problémy komponent třetích stran jsou v podstatě důsledek té globality).

BTW Railsy berou engine použitý na zpracování šablony z přípony souboru. U Nette je to ale asi nepříliš vhodné řešení, protože filtrů tady může být víc.

dmajda
Člen | 22
+
0
-

phx napsal(a):

Nevim k cemu by toto bylo. V projektu by snad pokazde mel byt nejaky abstract class BasePresenter extends Presenter jako predek vseho

To ale není předek komponent. Ten kód bych musel psát i do něj a já nerad píšu něco 2×.

phx
Člen | 651
+
0
-

Jejda tak to jsem prehlidl, ze se jedna o komponenty.

Osobne bych to resil statickou tridou/funkci, kterou bych volal v BasePresenter a BaseComponent.

Muzu te prosimte poprosit o ukazku jak pracujes v komponente s sablonou? DEKUJI

UPDATE: Ha uz jsem to na foru nasel. Treba ti to taky pomuze: https://forum.nette.org/…iewtopic.php?…

Editoval phx (24. 10. 2008 10:16)

David Grudl
Nette Core | 8105
+
0
-

Spíš bych ti navrhl jít cestou globálně dostupné továrničky na šablony (nebo metody, co existující objekt šablony nakonfiguruje, nevím jak se ten design pattern jmenuje). (Sjednotit tento přístup by měla v dohledné době třída Configurator.)

Nějak nevidím, jak tohle myžnosti realizovat bez hackování Nette (konkrétně asi přepsání Control::createTemplate) nebo nutnosti psát nějaký kód na víc než jednom místě (minimálně předek komponent a předek presenterů), což byl hlavní důvod téhle připomínky.

Přepsat (jako ve smyslu OOP) metodu createTemplate() je přece zcela legitimní cesta, ne?

Ja jasné, že se v kódu komponenty nebo presenteru nevyhneš jednomu „řádku“ navíc (ať už klasickému nastavení filtru, nebo přepsání createTemplate() nebo zavolání globální služby, co šablonu nakofiguruje). Ale to je v pořádku. Z kódu bude patrné, co se děje, narozdíl od magických řešení.

dmajda
Člen | 22
+
0
-

phx napsal(a):

UPDATE: Ha uz jsem to na foru nasel. Treba ti to taky pomuze: https://forum.nette.org/…iewtopic.php?…

Dík az odkaz, použití $this->presenter->... mě nenapadlo a je to cesta, jak tu šablonu nastavit jen na jednom místě (v presenteru). Bohužel za cenu vnesení závislosti komponenty na presenteru, což není vůbec hezké.

Pro sebe téma uzavírám s tím, že nejlepší řešení bude problém neřešit a malé porušení DRY u nastavování šablon přežiju.