Template path provider pro komponenty, presentery, extensions
- akadlec
- Člen | 1326
Jak by jste řešili nějaký template path provider? Řeším teď situaci kdy dělám vizuální extension a chtěl bych tam mít možnost aby si aplikace sama řekla kde má ta komponenta hledat šablony.
Napadlo mě udělat nějakou službu co půjde té komponentě předat a bude implementovat nějaký definovaný interface. A v okamžkiku kdy bude komponenta dělat vykreslování tak se podívá zda má takovou službu dostupnou a poku ano tak se jí optá na to kde hledat šablony a pokud ji mít nebude tak prostě použije výchozí cestu.
Co vy na to?
- duskohu
- Člen | 778
@akadlec cau, toto by som neriesil v komponente, tam by som
nadefinoval len nejaku default sablonu, a v aplikaci (kde vytvaras komponentu
pouzil proces vyhladavania sablon a nahradil default) tym padom si vie ten co
pouziva tvoju extension sam definovat tento proces.
Ja napriklad v komponentach definujem default
sablonu:
a potom na vyhladavanie sablon mam svoje extension ktory sa postara o najdenie
sablony (podla mnou definovaneho kluca) pre moju komponentu v momente ked ju
vytvaram, ak sablonu nenajde, ponecha default.
- David Kudera
- Člen | 455
Taky něco takovýho máme. Původně jsme měli vždy komponentu a ve stejné složce i základní template.latte. Naše kodérka se v těch všech souborech ale občas ztrácela, takže všechy šablony jsou ve složce components/templates. Navíc komponenta si může šablonu přenastavit přes anotaci @template.
Máme na to i takový speciální zápis, který se převede na cesty:
- User/Detail ⇒ Components/templates/User/Detail/template.latte
- User/Detail:otherVariant ⇒ Components/templates/User/Detail/otherVariant.latte
Používá se to fakt šikovně a navíc je pro to vytvořený rovnou i makro {includeTemplate}, který má vlastně kód zkopírovaný z klasickýho include makra, jen první prohnaný přes ten převod na cestu. Zase.. pro kodére (a i pro mě) je to o dost přehlednější
- akadlec
- Člen | 1326
@duskohu proč ne? To jak se vykreslí komponenta si určuje přeci komponenta ne? Řeším to tak protože ta komponenta se nevytváří přímo klasicky createComponentXY a zase u každé takové metody řešit nějaké setování mi nepřipadá moc košér když bych to mohl řešit přes konstruktor.
- akadlec
- Člen | 1326
Proto právě přemýšlím nad tím providerem který bude nepovinný, když bude tak poskytne cestu, když nebude tak si ji vezme z defaultu
btw ty taky nutíš uživateli že musí zadat cestu k šabloně přes seter což je imho to samé jen v bleděmodrém. Akorát do tvé komponenty se to musí vložit při každém jejím vytvoření, kdežto service by se předala přes konstruktor.
Editoval akadlec (17. 9. 2014 13:37)
- akadlec
- Člen | 1326
Tak trochu obnovím neb nastal čas to vyřešit.
Mám appku která má možnost si změnit téma z přednastavených. K tomu je služba která toto vše zabezpečuje, připraví správné staticky, a umí si najít šablony/layouty.
Idea je taková že metody formatTemplate/formatLayout pro presentery a potažmo i pro komponenty by nějak šáhly na tuto službu a optaly se „hele nemáš tam šablonu pro tuhle komponentu/presenter?“ pokud jo, tak by se komponenta/presenter zobrazily s onou šablonou a pokud ne, tak by se použilo default formátování a hledání default.latte.
Otázka ale teď je jak to vyřešit pokud možno univerzálně. Přidat nějaké eventy onGetTemplate onGetLayout na které by se pověsila ta služba a buď by vrátila šablonu a nebo nic? To se mi moc nelíbí. Nebo má nette (2.3) nějakou takovou podporu?
Dělám jádro pro CMS, ale zase nechtěl bych to na přímo do toho zadrátovat, aby se dalo použít i pro jinou skladbu appky. Má někdo tip?