SMARTY – řídící struktury

7. listopadu 2003

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

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Další článek bonsaje
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *