Jak na return uvnitř šablony?
- petr.pavel
- Člen | 535
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?
- petr.pavel
- Člen | 535
@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.
- petr.pavel
- Člen | 535
@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
..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
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:
- celý kód v ifu (nepřehledné)
- if před include (porušení zapouzdření logiky)
- komponenta pro složité případy (kvůli režii nevhodné pro jednoduché situace)
- ten můj return, se kterým jsem spokojený, jen nevím, jestli je to dost Nette friendly :-)
- 22
- Člen | 1478
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
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)
- jasir
- Člen | 746
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)