Skládání šablon: dědění layoutu

fordo.pytlik
Člen | 26
+
0
-

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

@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 | 2632
+
+2
-

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

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šší 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.)

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 | 2632
+
+1
-

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í nechal content, 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, nebo container, 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ám n: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)