Skládání šablon: dědění layoutu
- fordo.pytlik
- Člen | 26
Ahoj,
zdá se, že jsem se trochu zamotal do šablon a potřeboval bych trochu nakopnout. Snažím se vytvořit nějakou čistou strukturu, aby se kód zbytečně neopakoval.
Zjednodušeně mám šablonu @layout.latte
a v ní je vložen
{include #content}
a potom mám
- X souborů, kde chci
content
obalit určitým elementy - Y souborů, kde chci
content
obalit jinýmy elementy - Z souborů, kde chci
content
obalit zase jinak… - atd…
Mohu do šablony @layout.latte
vložit pouze to co je splečné
úplně pro všechny a pak pro jednotlivé šablony
foo\default.latte
a bar\default.latte
okopírovat
„obalovací elementy“, ale to se mi nechce, protože by to znamenalo spoustu
opakování a případná změna by byla složitá… navíc jednotlivé
šablony by byly složitější…
Nebo bych mohl udělat šablonu @layoutX.latte
a tam vložit
vše společné pro X souborů. To by mi zjednodušilo dílčí soubory, ale
vytvořilo by my 3 (možná 5) souborů @layout?.latte
, které by
se opět opakovali…
Přiznám se, že jiné řešení mě nenapadá…
Nevím, zda jsem to popsal správně, pokusím se to ukázat na kódu, zpracovaném dle prvního případyu:
Mám @layout.latte
<html>
<body>
<div>
<!-- nějaký další kód tady -->
{include #content}
</div>
</body>
</html>
A dílčí šablonu X foo/default.latte
:
{block content}
<div class="wrapper-x">
<!-- spousta další bloků -->
<div class="foo-x">
<!-- samotný obsah začíná až tady -->
<h1> Tady je obsah stránky<h1>
</div>
</div>
A dílčí šablonu X foo/bar.latte
:
{block content}
<div class="wrapper-x">
<!-- spousta další bloků -->
<div class="foo-x">
<!-- samotný obsah začíná až tady -->
<h1> Jiný nadpis... <h1>
<p>...</p>
</div>
</div>
Je vidět, že některé obalující prvky jsou pořád stejné a opakují se, ale zase někde potřeba nejsou…
Ideálně bych chtěl, aby foo/bar.latte
mohl vypadat
například takle:
{block content}
<h1> Jiný nadpis... <h1>
<p>...</p>
Editoval fordo.pytlik (3. 11. 2019 9:49)
- teekey99
- Člen | 45
@fordopytlik Co znamená „spousta další logiky“? Jakou „logiku“ potřebuješ mít zrovna v šabloně? Ideálně žádnou.
Napiš konkrétně, co tam má být a pak se určitě najde řešení. Takhle, jak jsi to napsal, je to moc širokej pojem a těžko říct, jestli potřebuješ nějaký parciální šablony, rozdílný layouty nebo komponenty atd.
- Šaman
- Člen | 2667
Layout šablon může být vícenásobný. Takže můžeš mít BaseLayout,
pak několik mezilayoutů, které se vloží (obalí) tím BaseLayoutem a pak
běžné šablony, které se vloží do mezilayoutu.
Jen si pak ty různé úrovně nazvi jinak, než content
(třeba
ten vyšší jako wrapper
). Teď střilim od boku, ale
myslím, že by to nedělalo dobrotu. (Jinak já tohle občas používám pro
unikátní stránky – ten nejvyšší layout jen načítá css, js, favicon a
vyplňuje hlavičku, wrapper pak řeší třeba menu a základní rozložení,
které se už třeba mezi moduly může lišit.)
Editoval Šaman (19. 10. 2019 14:02)
- fordo.pytlik
- Člen | 26
teekey99 napsal(a):
@fordopytlik Co znamená „spousta další logiky“? Jakou „logiku“ potřebuješ mít zrovna v šabloně? Ideálně žádnou.
Měl jsem na mysli spousta dalších HTML bloků, ve kterých je to zabaleno, nebo jsou specifické pro layoutX, omlouvám se za zmatky. (upravil jsem i svůj dotaz, aby to nemátlo)
Šaman napsal(a):
Layout šablon může být vícenásobný. Takže můžeš mít BaseLayout, pak několik mezilayoutů, které se vloží (obalí) tím BaseLayoutem a pak běžné šablony, které se vloží do mezilayoutu.
Jen si pak ty různé úrovně nazvi jinak, nežcontent
(třeba ten vyšší jakowrapper
). Teď střilim od boku, ale myslím, že by to nedělalo dobrotu. (Jinak já tohle občas používám pro unikátní stránky – ten nejvyšší layout jen načítá css, js, favicon a vyplňuje hlavičku, wrapper pak řeší třeba menu a základní rozložení, které se už třeba mezi moduly může lišit.)
děkuji, to je přesně to co jsem potřeboval… pro příští generace se pokusím shrnout:
@layout.html
bude vypadat pořád stejně,
default.latte
bude vypadat, tak jak potřebuji, jen s drobnou
úpravou (+ v presenteru nastavuji layoutX):
{block contentX}
<h1> Jiný nadpis... <h1>
<p>...</p>
a přibyde @layoutX.latte
:
{extends '@layout.latte'}
{block content}
<div class="wrapper-x">
<!-- spousta další bloků -->
<div class="foo-x">
{include #contentX}
</div>
</div>
Editoval fordo.pytlik (3. 11. 2019 10:08)
- Šaman
- Člen | 2667
Je to vlastně už jen kosmetika, ale doporučoval bych:
- Block
content
vyhradit běžné šabloně. V ní je vlastní obsah, tedy content. A hlavně té pak nezáleží na tom, kam se vloží, bude stále stejná mezi projekty. Že se má vložit do jiného layoutu se nastaví v presenteru, většinou v nějakém FooBasePresenteru pro celou skupinu poděděných presenterů, třeba jako modul (ačkoliv z pohledu routování o pravé moduly jít nemusí). Tato šablona by zkrátka neměla mít o nějaké vyšší struktuře tušení a proto bych jí nechalcontent
, který se používá v dokumentaci, na fóru a ve všech ukázkách. - ta mezivrstva pak bude používat třeba ten
wrapper
, nebocontainer
, nebo jakkoli jinak. Ten mezilayout už samozřejmě musí vědět, že existuje víc vrstev layoutu.
Našel jsem ukázku u sebe na Githubu:
- @baseLayout.latte
- @layout.latte pro potomky SecuredPresenteru, tedy část aplikace, kde je zaručené, že je přihlášený uživatel. Přidává menu, odhlašovací tlačítko (ta podmínka která může vykreslit přihlašovací formulář nemůže nastat, je zbytečná), flashmessage a nakonec includuje content, tedy tohle spolu s a baselayoutem se chová jako běžný layout a koncová šablona o této struktuře netuší nic.
- nějaká
konkrétní šablona Místo
{block content}
tady používámn:block
atribut, ale je to totéž.
Rozhodnutí, kde se bude hledat layout pro koncovou šablonu dělá
presenter. V tomto případě mám vlastní strukturu (ne jako v příkladech
v dokumentaci) a v ní se naslepo hledá nejbližší layout, ale není nutné
to dělat tak obecně a místo toho lze tuto metodu přetížit v každém
BasePresenteru od kterého níž se má používat určitý layout (dneska bych
to asi preferoval, je to míň magické). Jedná se o metodu formatLayoutTemplateFiles()
, která vrací pole cest k layoutům, použije se první nalezený.
Pro pořádek dodávám, že formatTemplateFiles()
upravuji jen
kvůli té změněné struktuře a při držení defaultní struktury není
potřeba tuto měnit (vrací pole cest k šablonám pohledů, použije se zase
první nalezená).
Editoval Šaman (3. 11. 2019 13:10)