Template path provider pro komponenty, presentery, extensions

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

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?

enumag
Člen | 2118
+
0
-

Něco takového právě zkouším. Dělám to tak že cestu k šabloně hledám v TemplateFactory, respektive TemplateFactory volá jinou službu TemplateLocator která najde soubory. Je to určené pro šablony komponent i presenterů. Zatím s tím ale sám nejsem spokojen.

duskohu
Člen | 778
+
0
-

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

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

@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.

duskohu
Člen | 778
+
0
-

@akadlec no pokial to nevytvaras cez createComponentXY, tak dajme tomu, ale preco to nezovsobecnit? a nepouzit to kde budes chciet? a preco vnucujes pouzivatelovy rozsirenia kde a ako ma sablonu definovat, co ak si to bude chciet definovat sam?

akadlec
Člen | 1326
+
0
-

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

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?

Tomáš Votruba
Moderator | 1114
+
0
-
akadlec
Člen | 1326
+
0
-

Tak teď nevím zda jsem to popsal blbě, ale nejde mě o hledání souborů atd. ale jak nette donutit aby použilo konkrétní template, ale univerzálně.