Jak na return uvnitř šablony?

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

Ahoj lidi.
Představte si malou šablonku, kterou pomocí {include 'sablonka.latte'} vkládám do hlavních šablon.
Někdy sice vkládám, ale šablonka sama pozná, že se tentokrát nemá nic vykreslit.

Klasickým ifem vznikne obluda:

{var $mamVykreslit = strašně složitá konstrukce}
{if $mamVykreslit}
  hromada
  řádek
  šablony
{/if}

Jsem zvyklý používat spíš logiku

{if $vyjmecnyStav}
  return;
{/if}

hromada
řádek
šablony

ale nevím, jak toho správně docílit v Nette/Latte. Zatím mám

{if $vyjmecnyStav}
  <?php return; ?>
{/if}

což funguje, ale divím se, že jsem nenašel žádné makro Latte.

Jak byste ten return/předčasné opuštění šablony řešili vy?

voda
Člen | 561
+
0
-
{? return;}

dokumentace

Nebo si můžeš makro {return} vytvořit.

Tharos
Člen | 1030
+
0
-

A proč ne jednoduše takhle?

{if !$vyjmecnyStav}
hromada
řádek
šablony
{/if}
petr.pavel
Člen | 535
+
0
-

@voda: Ha, tohle už vypadá víc Latte :-) I tak mě ale překvapuje, že už neexistuje nějaké {terminate}. Vím, že si můžu definovat vlastní makro, ale mě jde taky o to, jak tenhle problém vyřešit „Nette-friendly“. Možná, že fakt, že hledám příkaz return znamená, že mám program špatně navržený.

@Tharos: To jsi akorát opsal můj první příklad. Ten, u kterého píšu, že se mu chci vyhnout. Nechci mít celou šablonu uzavřenou v jednom velkém ifu. A představ si ještě komplikovanější případy, 100 řádků šablony, 10 výjimečných situacích v různých částech šablony.

Jde mi obecně o zachycení logiky „Jestliže je vše ok, pokračuj, jinak uteč.“ Tím získám kód, který se zabývá jen tím, kvůli čemu ho vlastně píšu (business logic). Ne neustálým ošetřování krajních situací.
Vyhazování výjimek usiluje o podobnou věc. Výjimky mi ale nepřijdou jako dobré řešení pro šablony.

22
Člen | 1478
+
0
-

k čemu máš presenter? to podle mě do šablony vůbec nepatří…

petr.pavel
Člen | 535
+
0
-

@22: Příklad: Když vypisuji seznam kategorií výrobků (hlavní šablona) a u každé výrobky této kategorie (pod-šablona), tak se může stát, že některé kategorie výrobky vůbec nemají. Pod-šablona nejsou jen opakující se řádky tabulky, je to i záhlaví té tabulky, nadpis atp. Když kategorie nemá žádné výrobky, nechci zobrazovat ani to záhlaví. Prostě přeskočit celou pod-šablonu. Tohle je přeci čistě prezenční logika a patří do šablony.

Radši rovnou varuji: Tohle je hodně zjednodušený příklad, tak prosím nenavrhuj hodit {if !$products->count()} před {include 'podsablona.latte'}. Předpokládej, že ta podmínka je složitější. Logicky by měla patřit do pod-šablony (zapouzdření).

22
Člen | 1478
+
0
-

..asi bych si tu šablonu udělal jako komponentu a logiku přesunul do komponenty šablony. Do šablony předal maximalně příznak $show = TRUE/FALSE. Vyhodnocování nějakých složitých podmínek v šabloně je pro mě sci-fi a kodér tě bude určitě milovat.

Edit: nakonec už z významu slov: presenční logika ⇒ presenter, nikoliv template logika

Editoval 22 (22. 6. 2011 12:51)

petr.pavel
Člen | 535
+
0
-

Souhlasím, že když míra logiky v šabloně přesáhne únosnou mez, tak už to chce komponentu. S tím složitým příkladem jsem to přepískl.

Když tedy uberu složitosti, jaký postup bys volil pro jednoduché podmínky? Pořád se mi nechce mít dlouhý kus v ifu, ať už je to šablona nebo jiná část aplikace. Je to takové špagetové.

Zatím tu jsou možnosti:

  1. celý kód v ifu (nepřehledné)
  2. if před include (porušení zapouzdření logiky)
  3. komponenta pro složité případy (kvůli režii nevhodné pro jednoduché situace)
  4. ten můj return, se kterým jsem spokojený, jen nevím, jestli je to dost Nette friendly :-)
22
Člen | 1478
+
0
-

pokud bych to měl udělat bez komponenty, tak bych asi využil dědičnost šablon.
Upřímně řečeno, nevím, v čem je if nepřehledný z bodu 1):

{if $showOne}
	...
{/if}

{ifset $showTwo}
	...
{/ifset}

nehledě na to, že můžeš zapsat:

<table n:if="$showOne">
	...
</table>

Editoval 22 (22. 6. 2011 19:07)

petr.pavel
Člen | 535
+
0
-

Nepřehledný není v příkladu, kde je jedna řádka se třemi tečkami. :-)
Když máš několik do sebe vnořených ifů a všechny končí až na konci šablony o dvou stech řádcích, tak máš celou šablonu zbytečně odsazenou. Nejde mi ale jen o ty mezery na začátku řádku. Je to signál programátorovi, že je tu nějaká výjimka, kterou musí brát v potaz, když se snaží porozumět kódu.

Snad by šlo říct, že if je buď pro alternativy nebo pro výjimečné stavy. Možná je to pocitová věc, ale mě přijde přehlednější si odbýt výjimečné stavy na začátku a pak už řešit jen ty alternativy. Nemíchat jablka s hruškami.

Pokud výjimečný stav znamená, že z téhle šablony nechci vůbec nic, ale naprosto ani písmenko, tak je bezpečnější, když rovnou uteču, než když se budu spoléhat na if na úplném konci, za který můžu omylem něco připsat.

P.S. Nepochopil jsem, jak to myslíš s tou dědičností. Mohl bys, prosím, dát příklad?

Editoval petr.pavel (22. 6. 2011 13:23)

22
Člen | 1478
+
0
-

Programování v šabloně je prostě špatně, už nevím, co bych k tomu dodal.

Aurielle
Člen | 1281
+
0
-

V tom případě nechápu, na co máme Latte.

22
Člen | 1478
+
0
-

aby suplovalo presenter?

jasir
Člen | 746
+
0
-

Já myslím, že je to zcela korektní požadavek. Mohu například inkludovat ze šablony jinou šablonu, například menu/statistika, a to když má nula položek se nemá vykreslit vůbec. V pořádku, ať o tom rozhodne sama šablona, že její výstup je prázdný řetězec.
Ještě jinak – presenter naplní šablonu daty a šablona rozhodne, jak je vykreslí. A rozhodnutí, že je nevykreslí vůbec je zcela korektní.

Editoval jasir (22. 6. 2011 14:59)