Globální nastavení filtrů pro šablony
- dmajda
- Člen | 22
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 | 8218
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
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
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.
- phx
- Člen | 651
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 | 8218
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
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.