SMARTY – řídící struktury
Stejně jako v samotné aplikaci, i při prezentaci údajů a dat je nutné často využívat podmínek a cyklů. Zjednodušenou podobu těchto řídících příkazů máme k dispozici i v systému SMARTY. Při vytváření šablon můžeme použít podmínky i cykly typu „for“ a „foreach“.
Podmínky
Syntaxe if-elseif-else podmínek je velmi podobná (s některými úpravami) syntaxi PHP a většině ostatních programovacích jazyků. V podmínkách lze používat operátory ==, <, > >=, <=, !=, === a !==. Dále lze využít standardní logické operátory známé z PHP (&&, ||) mimo jiné i ve slovním vyjádření (and, or).
SMARTY je určeno především tvůrcům HTML kódu, kteří nemusí umět programovat, a proto byla do syntaxe šablon přidána i klíčová slova, která lze v podmínkách využít a která nahrazují výše uvedené standardní operátory. Následující seznam zobrazuje jen některé z nich (kompletní výčet najdete v příslušné části dokumentace).
operátor | popis |
---|---|
eq | rovná se |
ne, neq | nerovná se |
not | negace |
gt | větší než |
lt | menší než |
ge, gte | větší nebo rovno |
le, lte | menší nebo rovno |
is even | je sudé |
is odd | je liché |
is not even | není sudé |
is not odd | není liché |
is div by | je dělitelné číslem |
Než si ukážeme jednoduchý příklad podmínky, je nutné si připomenout dvě základní pravidla, která musí být při používání podmínek dodržována:
- vždy musí být použit uzavírací tag podmínky: {/if}
- používáte-li slovní operátory místo standardních, je nutné oddělovat je mezerou od ostatních výrazů podmínky (např.:
{if promenna eq hodnota}
)
…
<body>
<strong>SMARTY Template Engine</strong>
{* do promenne var priradime cislo aktualniho dne *}
{assign var=“var“ value=$smarty.now|date_format:“%w“}
{if $var == 1 or $var == 2}
Je začátek týdne
{elseif $var gt 2 && $var lt 5}
Je prostředek týdne
{else}
Je konec týdne
{/if}
</body>
…
Jelikož jsou podmínky v šablonách přímo převáděny do PHP syntaxe, je možné v nich používat jak nativních, tak i programátorem vytvořených funkcí (např.: {if strLen( $var ) gt 20}
). Totéž platí také pro modifikátory, s jejichž pomocí můžeme přecházející příklad přepsat do následující podoby: {if $var|count_characters gt 20}
.
Cykly
Pokud chceme v šablonách použít cykly, máme k dispozici dva příkazy: section a foreach. Oba příkazy v podstatě slouží k témuž, k procházení polí. Příkaz foreach je však jednodušší a neumožňuje nastavení omezujících vlastností cyklu (počáteční hodnota, krok cyklu, maximální hodnota iterací a další).
Section
Příkaz section má oproti příkazu foreach větší možnosti nastavení a svou funkcí se tak velmi blíží příkazu for, známému snad ze všech programovacích jazyků. Následující tabulka zobrazuje seznam atributů příkazu section.
atribut | popis |
---|---|
name | Jméno sekce, které musí být unikátní v rámci jedné šablony. |
loop | Pole, které má být procházeno. |
start | Počáteční pozice, odkud má cyklus probíhat. Pokud je start záporné číslo, pak je se začína z pozice odpovídající hodnotě start počítané od konce pole. Pokud bude hodnota start stanovena mimo rozsah pole, pak použije SMARTY nejbližší použitelnou hodnotu. |
step | Krok jednoho cyklu. Je-li hodnota atributu záporná, pak cyklus probíhá pozpátku. |
max | Maximální počet průchodů cyklem. |
show | Logická hodnota, určující zda má být sekce zobrazena. |
Jednoduchý cyklus může tedy vypadat následovně:
…
{section name=sekce1 loop=$barvy}
barva: {$barvy[sekce1]} –
obrazec: {$grafika[sekce1]}<br>
{sectionelse}
zadny objekt ani barva nejsou specifikovani
{/section}
…
Jak vidíte, atribut name slouží k odkazu na aktuální průchod cyklem. Můžeme ho však použit i u jiných polí v rámci celé šablony, přičemž nejsme vázáni jen na proměnou specifikovanou v atributu loop.
Velmi užitečný je příkaz sectionelse (musí být uzavřen tagy section), který bude proveden tehdy, pokud bude pole, která má být procházeno, prázdné.
Je samozřejmé, že cykly, ostatně stejně jako podmínky, mohou být libovolně vnořovány. Kromě vnořených cyklů ukazuje následující příklad i práci s asociativními poli.
…
{* vnejsi cyklus – jmeno a prijemni z adresare *}
{section name=adresar loop=$pole}
jmeno: {$pole[adresar].jmeno}<br>
prijmeni: {$pole[adresar].prijmeni}<br>
{* vnitrni cyklus – emaily *}
{section name=kontakty loop=$pole[adresar].emaily}
email: {$pole[adresar].emaily[kontakty]}<br>
{/section}
<hr>
{/section}
…
Vlastnosti cyklu
Nyní se na chvíli vrátíme k proměnné $smarty, kterou máme v šablonách automaticky k dispozici. Tato proměnná obsahuje mimo jiné důležité informace o konkrétním cyklu, které jsou uložené v asociativním poli. K němu můžeme přistupovat následujícím způsobem: {$smarty.section.jmeno_sekce.vlastnost}
.
Seznam všech vlastností cyklu zobrazuje následující tabulka:
vlastnost | popis |
---|---|
index | Číslo kroku cyklu. (Zápis $loopvar[jmeno_cyklu] je totožný s $loopvar[jmeno_cyklu.index] ). Tato hodnota je závislá na hodnotách atributů start a step. Začíná nulou. |
index_prev | Předcházející číslo kroku. Opět je závislá na hodnotách atributů start a step. Pokud má index hodnotu 0, pak má index_prev hodnotu -1. |
index_next | číslo následujícího kroku. Opět je závislá na hodnotách atributů start a step |
iteration (rownum) | Číslo kroku cyklu. Začíná 1. Nebere v úvahu výše uvedené atributy. |
first | Je true, pokud se jedná o první průchod cyklem. |
last | Je true, pokud se jedná o poslední průchod cyklem. |
loop | Obsahuje poslední hodnotu vlastnosti index. Tuto hodnotu je možné použít i mimo cyklus. |
show | Booleovská hodnota, která je shodná s hodnotou atributu show. |
total | Celkový počet iterací. Stejně jako vlastnost loop může i tato být použita mimo cyklus. |
Než přejdeme k ukázce použití některých z výše uvedených vlastností, rád bych upozornil na rozdíl mezi vlastnostmi index a iteration. Pokud nejsou zadané hodnoty atributů step nebo start, pak jsou tyto hodnoty totožné pouze s tím rozdílem, že index začíná vždy od nuly a iteration od 1. Pokud však nastavíme některý z uvedených atributů, budou se již hodnoty těchto vlastností lišit.
…
{section name=tabulka loop=$pole}
{if $smarty.section.tabulka.first}
<table>
<tr>
<th>ID</th>
<th>zbozi</th>
</tr>
{/if}
<tr>
<td>{$smarty.section.tabulka.iteration}</td>
<td>{$pole[tabulka]}</td>
</tr>
{if $smarty.section.tabulka.last}
<tr>
<td colspan=“2″>Pocet plozek:{$smarty.section.tabulka.total}</td>
</tr>
</table>
{/if}
{sectionelse}
zadne polozky v ceniku
{/section}
Pár slov k příkladu. Cyklus obsahuje dvě jednoduché podmínky, které testují vlastnosti first a last na hodnotu true. V případě prvního průchodu cyklem bude vytvořeno záhlaví kódu tabulky. V opačném případě dojde k vytvoření zápatí tabulky a ukončení kódu tabulky. Dále je zde alternativní část pro případ, pokud by pole uvedené v atributu loop bylo prázdné.
V některém z dalších článků si ukážeme velmi užitečnou funkci cycle, jejímž použitím se tento příklad ještě více zjednoduší.
Foreach
Příkaz foreach je obdobou stejnojmenného příkazu z PHP a slouží k jednoduchému procházení polí. Stejně jako v předešlém případě, mají HTML kodéři k dispozici tytéž vlastnosti cyklu, které jsou však tentokrát uložené v asociativním poli foreach ({$smarty.foreach.jmeno_cyklu.vlastnost}
).
Atributy příkazu foreach mohou být:
atribut | popis |
---|---|
from | pole, ktré má být procházeno |
item | název proměnné, obsahující aktuální položku pole |
key | název proměnné, obsahujcí aktuální hodnotu klíče pole |
name | jméno cyklu foreach, které je nutné pro přístup k vlastnostem cyklu |
Všimněte si, že na rozdíl od příkazu section, jsou jednotlivé položky pole ukládány do zvláštní proměné (její název je specifikován v atributu item). Opět máme k dispozici příkaz foreachelse (analogicky k sectionelse), který umožní prezentovat alternativní text v případě, pokud je pole from prázdné.
…
{foreach from=$pole item=poleItem name=data}
{$poleItem} (#ID:{$smarty.foreach.data.iteration})<br>
{/foreach}
…
Všechny zde uvedené šablony spolu s PHP skripty si můžete také stáhnout a otestovat.
Odkazy
- smarty.php.net (domovská stránka projektu SMARTY)
- smarty.php.net/docs.php (dokumentace k projektu SMARTY)
- smarty.php.net/download.php (aktuální verze ke stáhnutí)
Starší komentáře ke článku
Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.
Mohlo by vás také zajímat
-
Vlastní web: Jak nainstalovat WordPress?
24. června 2024 -
Optimalizace a zlepšení výkonu kódu: tipy a triky
14. srpna 2023 -
Jak zvýšit CTR vašeho e-mail marketingu
9. září 2024 -
AI a internetové podvody
29. října 2024
Nejnovější
-
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024 -
Šokující data od Microsoftu: Kyberútoky rostou o stovky procent!
8. listopadu 2024 -
Chcete jedinečnou doménu? Objevte koncovky FOOD, MEME a MUSIC!
7. listopadu 2024 -
OpenAI představilo novou funkci ChatGPT Search
6. listopadu 2024