3. Funkcje wbudowane

Smarty dostarcza kilka wbudowanych funkcji. Funkcje wbudowane są integralną częścią języka szablonowego. Nie możesz stworzyć funkcji o takich samych nazwach, nie możesz modyfikować wbudowanych funkcji.

3.1. {capture}

Jest wykorzystywana do kolekcjonowania danych wyjściowych szablonu do zmiennej zamiast wyświetlania ich. Dowolna treść pomiędzy {capture name="foo"} i {/capture} jest kolekcjonowana do zmiennej podanej jako atrybut name. Przechwycona treść może zostać wykorzystana dzięki specjalnej zmiennej - $smarty.capture.foo gdzie foo jest wartością podaną w atrybucie name. Jeśli nie podasz atrybutu name to wtedy zostanie użyta wartość "default". Wszystkie komendy {capture} muszą zostać zamknięte przez {/capture}. Możesz zagnieżdżać komendy capture .

Note

Smarty 1.4.0 - 1.4.4 umieszczają przechwyconą treść w zmiennej nazwanej $return. Tak jak w 1.4.5, Takie zachowanie zostało zmienione aby używać atrybutu name.

Caution

Bądź ostrożny podczas przechwytywania danych wyjściowych {insert}. Jeśli jest włączone caschowanie a ty masz komendy {insert} po których oczekujesz że będą uruchamiane z zcaschowaną treścią nie przechwytuj tej treści.

Example 3.43. przechwytywanie treści szablonu

{* we don't want to print a table row unless content is displayed *}
{capture name=banner}
{include file="get_banner.tpl"}
{/capture}
{if $smarty.capture.banner ne ""}
         <tr>
                  <td>
                           {$smarty.capture.banner}
                  </td>
         </tr>
{/if}

3.2. {config_load}

Ta funkcja jest używana do załadowania zmiennych z pliku konfiguracyjnego do szablonu

Nazwa parametruTypWymaganyDomyślnieOpis
filestringtakbrakNazwa pliku konfiguracyjnego
sectionstringniebrakNazwa sekcji do załadowania
scopestringnielocalDecyduje o zasiegu załadowanych zmiennych. local - oznacza że zmienne dostępne są tylko lokalnie, parent - oznacza że zmienne dostepne są dla szablonu który je załadował i dla jego rodzica, global - oznacza że zmienne sa widoczne we wszystkich szablonach.
globalbooleanniefałszDecyduje czy zmienne są dostepne dla rodzica. Zastapione przesz scope.

Example 3.44. config_load

{config_load file="colors.conf"}
 
<html>
<title>{#pageTitle#}</title>
<body bgcolor="{#bodyBgColor#}">
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
         <tr bgcolor="{#rowBgColor#}">
                  <td>First</td>
                  <td>Last</td>
                  <td>Address</td>
         </tr>
</table>
</body>
</html>

Pliki konfiguracyjne mogą zawierać sekcje. możesz załadować zmienne z danej sekcji przez dodanie atrybutu section.

Note

Sekcje pliku konfiguracyjnego i wbudowana funkcja section nie mają nic wspólnego ze sobą, to tylko podobieństwo w nazwach.

Example 3.45. config_load z sekcjami

{config_load file="colors.conf" section="Customer"}
 
<html>
<title>{#pageTitle#}</title>
<body bgcolor="{#bodyBgColor#}">
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
         <tr bgcolor="{#rowBgColor#}">
                  <td>First</td>
                  <td>Last</td>
                  <td>Address</td>
         </tr>
</table>
</body>
</html>

3.3. {foreach}, {foreachelse}

Pętle foreach są alternatywą dla pętli section. foreach jest używana do pętli na tablicy asocjacyjnej. Wyrażenie dla foreach jest znacznie łatwiejsze niż section, ale za tą cenę może być wykorzystywana tylko na pojedynczej tablicy. Tagi foreach muszą być zakończone tagami /foreach. Wymagane parametry to from i item. Nazwa pętli foreach jest dowolna (zbudowana z liter, cyfr i podkreślników). Pętla foreach może być zagnieżdżona i nazwa zagnieżdżonej foreach musi być unikalna - różnić się od każdej innej nazwy foreach . Zmienna from (zazwyczaj tablica wartości) będzie w pętli foreach dopuki nie skończą się elemęty tablicy. foreachelse jest wykonywana wtedy jeżeli nie ma wartości w zmiennej from .

Nazwa parametruTypWymaganyDomyślnieOpis
fromstringtakbrakNazwa tablicy po której iterujemy.
itemstringtakbrakNazwa zmiennej zawierającej obecny element.
keystringniebrakNazwa zmiennej zawierającej obecny klucz.
namestringniebrakNazwa pętli uzywana aby dostać się do jej właściwości.

Example 3.46. foreach

{* this Przykład will print out all the values of the $custid array *}
{foreach from=$custid item=curr_id}
         id: {$curr_id}<br>
{/foreach}
 
OUTPUT:
 
id: 1000<br>
id: 1001<br>
id: 1002<br>

Example 3.47. foreach key

{* The key contains the key for each looped value
 
assignment looks like this:
 
$smarty->assign("contacts", array(array("phone" => "1", "fax" => "2", "cell" => "3"),
      array("phone" => "555-4444", "fax" => "555-3333", "cell" => "760-1234")));
 
*}
 
{foreach name=outer item=contact from=$contacts}
  {foreach key=key item=item from=$contact}
    {$key}: {$item}<br>
  {/foreach}
{/foreach}
 
OUTPUT:
 
phone: 1<br>
fax: 2<br>
cell: 3<br>
phone: 555-4444<br>
fax: 555-3333<br>
cell: 760-1234<br>

3.4. {include}

Include jest wykorzystywana do dołączania innych szablonów do obecnego szablonu. Każda zmienna dostępna w obecnym szablonie jest także dostępna w szablonie dołączanym. Znacznik include musi posiadać atrybut file do którego podawana jest ścieżka do dołączanego pliku. Możesz opcjonalnie podać atrybut assign, w którym podajesz nazwę zmiennej do której ma być załadowany szablon zamiast wyświetlać go.

Nazwa parametruTypWymaganyDomyślnieOpis
filestringtakbrakNazwa pliku szablonu do dołączenia.
assignstringniebrakNazwa zmiennej zawierającej wynik(wyjście) dołączonego pliku szablonu.
[var ...][var type]niebrakZmienna do przesłania do dołączanego szablonu.

Example 3.48. include

{include file="header.tpl"}
 
{* body of template goes here *}
 
{include file="footer.tpl"}

Możesz także podać zmienne do dołączanego szablonu jako atrybuty. Dowolna zmienna podana jako atrybut jest widziana jedynie w obrębie dołączanego pliku. Zmienne podane w atrybutach nadpisują dotychczasowe zmienne szablonu na wypadek takich samych nazw.

Example 3.49. Funkcja include z przekazywaniem zmiennych

{include file="header.tpl" title="Main Menu" table_bgcolor="#c0c0c0"}
 
{* body of template goes here *}
 
{include file="footer.tpl" logo="http://my.domain.com/logo.gif"}

Używaj wyrażenia dla template resources do dołączania plików z zewnątrz katalogu $template_dir. ?????

Example 3.50. foreach key

{* absolute filepath *}
{include file="/usr/local/include/templates/header.tpl"}
 
{* absolute filepath (same thing) *}
{include file="file:/usr/local/include/templates/header.tpl"}
 
{* windows absolute filepath (MUST use "file:" prefix) *}
{include file="file:C:/www/pub/templates/header.tpl"}
 
{* include from template resource named "db" *}
{include file="db:header.tpl"}

3.5. {include_php}

Znaczniki include_php są używane do dołączania skryptów php do szablonu. Jeśli ochrona jest włączona wtedy skrypt php musi być zlokalizowany w zaufanym katalogu o ścieżce $trusted_dir . Znacznik include_php musi posiadać atrybut "file", który zawiera ścieżkę do dołączanego pliku, lub względną do $trusted_dir, albo ścieżkę absolutną. include_php to przyjemny sposób do ??? handle componentized templates, i trzymanie kodu PHP poza plikami szablonów. Powiedzmy że twój szablon wyświetla nawigacje strony, która jest dynamiczne tworzona z bazy danych. Możesz zachować logikę php która pobiera dane z bazy danych w oddzielnym katalogu i dołączanie na początku twojego szablonu. Teraz możesz dołączać ten szablon gdziekolwiek nie martwiąc się czy dane z bazy danych zostały przyporządkowane przez aplikacje. Domyślnie pliki php są dołączane tylko jeden raz nawet jeśli są wywoływane w szablonie kilka razy. Możesz zażądać ładowania pliku za każdym razem jeśli w wywołaniu funkcji Include_php podasz atrybut once. Raz ustawiając once na false skrypt będzie dołączany za każdym razem kiedy jest wywołany w szablonie. Opcjonalnie możesz podać atrybut assign , która zamiast wyświetlać przyporządkuje dane wyjściowe include_php do zmiennej. Obiekt smarty jest dostępny jako $this w skrypcie PHP który dołączamy.

Nazwa parametruTypWymaganyDomyślnieOpis
filestringtakbrakNazwa pliku php do dołączenia.
oncebooleannieprawdaDecyduje o tym czy dołączac plik tylko raz czy wiele razy.
assignstringniebrakNazwa zmiennej do której zostanie przypisany wynik dziaałania dołączoego pliku

Example 3.51. include_php

load_nav.php
-------------
 
<?php
 
    // load in variables from a mysql db and assign them to the template
    require_once("MySQL.class.php");
    $sql = new MySQL;
    $sql->query("select * from site_nav_sections order by name",SQL_ALL);
    $this->assign('sections',$sql->record);
 
?>
 
 
index.tpl
---------
 
{* absolute path, or relative to $trusted_dir *}
{include_php file="/path/to/load_nav.php"}
 
{foreach item="curr_section" from=$sections}
         <a href="{$curr_section.url}">{$curr_section.name}</a><br>
{/foreach}

3.6. {insert}

Znaczniki Insert działają bardzo podobnie jak znaczniki include, z wyjątkiem tego że znaczniki nie są caschowane kiedy włączone jest włączone caschowanie szablonów (caching). Będą wykonywane podczas każdego wywołania szablonu. Powiedzmy że posiada szablon z miejscem na baner na górze strony. Baner może posiadać treść zmieszaną z HTML, obrazów, flash, itp. więc nie możemy usytuować tu statycznego linka, i nie chcemy aby treść była caschowana razem ze stroną. W następującym znaczniku insert szablon zna wartości #banner_location_id# i #site_id# (pobrane z pliku konfiguracyjnego) i potrzebuje wywołać funkcję aby pobrać treść bannera.

Nazwa parametruTypWymaganyDomyślnieOpis
namestringtakbrakNazwa funkcji.
assignstringniebrakNazwa zmiennej zawierającej wynik(wyjście) dołączonego pliku szablonu.
scriptstringniebrakNazwa skryptu php który jest ddołączany i wywoływany przed wywołaniem funkcji insert
[var ...][var type]niebrakZmienna do przesłania do dołączanego szablonu.

Example 3.52. insert

{* Przykład of fetching a banner *}
{insert name="getBanner" lid=#banner_location_id# sid=#site_id#}

W tym przykładzie używamy nazwy (name) "getBaner" i podajemy parametry #banner_location_id# i #site_id#. Smarty będzie szukał funkcji o nazwie insert_getBanner() w twojej aplikacji PHP, przekazując wartości #banner_location_id# i #site_id# jako pierwszy argument w tablicy asocjacyjnej. W twojej aplikacji wszystkie nazwy funkcji insert muszą posiadać prefix "insert_" aby zażegnać możliwy konflikt nazw. Twoja funkcja insert_getBanner() powinna przetwarzać przekazane dane i zwracać wynik. Wynik jest wyświetlany w szablonie w miejsce znaczników insert. Na przykład, Smarty wywoła funkcje: insert_getBanner(array("lid" => "12345","sid" => "67890")); i wyświetli zwrócony wynik w miejsce znaczników insert. Jeśli podasz argument "assign", de wyjściowe znaczników insert będą przyporządkowane do zmiennej. NOTA: przyporządkowywanie danych wyjściowych do zmiennej nie jest zbyt użyteczne z włączonym caschowaniem. Jeśli podasz argument "script", ten skrypt php będzie dołączony (tylko raz) przed tym jak funkcja insert będzie wykonana. To jest przypadek kiedy funkcja może jeszcze nie istnieć i najpierw musi zostać dołączony skrypt php aby wszystko działało. Ścieżka może być zarówno absolutna jak i względna do $trusted_dir. Kiedy security jest włączone, skrypt musi się znajdować w $trusted_dir. Obiekt Smarty jest przekazywany jako drugi argument. Tym sposobem możesz odwoływać się i modyfikować informacje w obiekcie Smarty z funkcji insert .

Note

Jest możliwe aby porcje szablonu nie były caschowane. Jeśli masz włączone caching , znaczniki insert nie będą caschowane. Będą uruchamiane dynamicznie za każdym razem kiedy strona jest tworzona, nawet w caschowanych stronach. To działa dobrze dla rzeczy takich jak banery, wyniki wyszukiwania, itd.

3.7. {if}, {elseif}, {else}

Wyrażenia if w Smarty mają bardzo podobną składnie jak wyrażenia if w phps, z kilkoma dodanymi rzeczami dla silnika szablonu. Każdy if musi być zakończony przez /if. else i elseif są także dopuszczone. "eq", "ne","neq", "gt", "lt", "lte", "le", "gte" "ge","is even","is odd", "is not even","is not odd","not","mod","div by","even by","odd by","==","!=",">", "<","<=",">=" . Operatory muszą być oddzielone od innych elemętów spacjami.

Example 3.53. wyrażenia warunku

{if $name eq "Fred"}
         Welcome Sir.
{elseif $name eq "Wilma"}
         Welcome Ma'am.
{else}
         Welcome, whatever you are.
{/if}
 
{* an Przykład with "or" logic *}
{if $name eq "Fred" or $name eq "Wilma"}
         ...
{/if}
 
{* same as above *}
{if $name == "Fred" || $name == "Wilma"}
         ...
{/if}
 
{* the following syntax will NOT work, conditional qualifiers
   must be separated from surrounding elements by spaces *}
{if $name=="Fred" || $name=="Wilma"}
         ...
{/if}
 
 
{* parenthesis are allowed *}
{if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}
         ...
{/if}
 
{* you can also embed php function calls *}
{if count($var) gt 0}
         ...
{/if}
 
{* test if values are even or odd *}
{if $var is even}
         ...
{/if}
{if $var is odd}
         ...
{/if}
{if $var is not odd}
         ...
{/if}
 
{* test if var is divisible by 4 *}
{if $var is div by 4}
         ...
{/if}
 
{* test if var is even, grouped by two. i.e.,
0=even, 1=even, 2=odd, 3=odd, 4=even, 5=even, etc. *}
{if $var is even by 2}
         ...
{/if}
 
{* 0=even, 1=even, 2=even, 3=odd, 4=odd, 5=odd, etc. *}
{if $var is even by 3}
         ...
{/if}

3.8. {ldelim}, {rdelim}

ldelim i rdelim są używane do wyświetlenia znaków ograniczających, w naszym przypadku "{" lub "}". Silni szablonów zawsze próbuje zinterpretować znaki ograniczające - więc to jest sposób obejścia tego.

Example 3.54. ldelim, rdelim

{* this will print literal delimiters out of the template *}
 
{ldelim}funcname{rdelim} is how functions look in Smarty!
 
 
OUTPUT:
 
{funcname} is how functions look in Smarty!

3.9. {literal}

Znaczniki literal pozwalają blokowi danych na używanie dowolnych znaków, bloki te nie są interpretowane przez silnik Smarty. Jest to użyteczne dla takich rzeczy jak sekcje javascript . Wszystko pomiędzy znacznikami {literal}{/literal} nie jest interpretowane ale wyświetlane takie jakie jest.

Example 3.55. literal

{literal}
         <script language=javascript>
 
                <!--
                       function isblank(field) {
                       if (field.value == '') 
                               { return false; }
                       else
                               {
                               document.loginform.submit();
                               return true;
                               }
                       }
                // -->
 
         </script>
{/literal}

3.10. {php}

Znaczniki php pozwalają osadzić PHP w szablonie. They will not be escaped, regardless of the $php_handling setting???. Ta opcja przeznaczona jest tylko dla zaawansowanych użytkowników, normalnie jest niepotrzebna.

Example 3.56. php

{php}
                  // including a php script directly
                  // from the template.
                  include("/path/to/display_weather.php");
{/php}

3.11. {section}, {sectionelse}

Sekcje szablonów są używane do zapętlenia tablic z danymi. Wszystkie znaczniki section muszą być zakończone przez znaczniki /section. Wymaganymi parametrami są name i loop. Nazwa (name) sekcji może być dowolna, złożona z liter, cyfr i podkreślników. Sekcje mogą być zagnieżdżone i nazwa sekcji zagnieżdżonych musi być unikalna dla każdej sekcji. Zmienna loop (zwykle tablica wartości) decyduje ile razy będzie wykonana pętla. Kiedy wyświetlamy zmienną z sekcji nazwa sekcji musi zostać podana w nawiasach kwadratowych zaraz po nazwie. sectionelse jest wykonywana jeśli w zmiennej loop nie ma wartości.

Nazwa parametruTypWymaganyDomyślnieOpis
namestringtakbrakNazwa sekcji.
loop[$variable_name]takbrakNazwa zmiennej po której bedziemy iterować.
startintegernie0Pozycja z której zaczynamy iterowanie po tablicy, Jeśli nie została podana iteracja rozpocznie się od momentu "końca tablicy"
stepintegernie1Krok użyty w iteracji.
maxintegernie1Decyduje o maksymalnej wartości petli które sekcja może wykonać
showbooleannieprawdadecyduje o tym czy wyświetlać tą sekcje.

Example 3.57. section

{* this Przykład will print out all the values of the $custid array *}
{section name=customer loop=$custid}
         id: {$custid[customer]}<br>
{/section}
 
OUTPUT:
 
id: 1000<br>
id: 1001<br>
id: 1002<br>

Example 3.58. zmienna pętli sekcji

{* the loop variable only determines the number of times to loop.
   you can access any variable from the template within the section.
   This Przykład assumes that $custid, $name and $address are all
   arrays containing the same number of values *}
{section name=customer loop=$custid}
         id: {$custid[customer]}<br>
         name: {$name[customer]}<br>
         address: {$address[customer]}<br>
         <p>
{/section}
 
 
OUTPUT:
 
id: 1000<br>
name: John Smith<br>
address: 253 N 45th<br>
<p>
id: 1001<br>
name: Jack Jones<br>
address: 417 Mulberry ln<br>
<p>
id: 1002<br>
name: Jane Munson<br>
address: 5605 apple st<br>
<p>

Example 3.59. nazwy sekcji

{* the name of the section can be anything you like,
   and it is used to reference the data within the section *}
{section name=mydata loop=$custid}
         id: {$custid[mydata]}<br>
         name: {$name[mydata]}<br>
         address: {$address[mydata]}<br>
         <p>
{/section}

Example 3.60. sekcjie zagnieżdżone

{* sections can be nested as deep as you like. With nested sections,
   you can access complex data structures, such as multi-dimensional
   arrays. In this example, $contact_type[customer] is an array of
   contact types for the current customer. *}
{section name=customer loop=$custid}
         id: {$custid[customer]}<br>
         name: {$name[customer]}<br>
         address: {$address[customer]}<br>
         {section name=contact loop=$contact_type[customer]}
                  {$contact_type[customer][contact]}: {$contact_info[customer][contact]}<br>
         {/section}
         <p>
{/section}
 
 
OUTPUT:
 
id: 1000<br>
name: John Smith<br>
address: 253 N 45th<br>
home phone: 555-555-5555<br>
cell phone: 555-555-5555<br>
e-mail: john@mydomain.com<br>
<p>
id: 1001<br>
name: Jack Jones<br>
address: 417 Mulberry ln<br>
home phone: 555-555-5555<br>
cell phone: 555-555-5555<br>
e-mail: jack@mydomain.com<br>
<p>
id: 1002<br>
name: Jane Munson<br>
address: 5605 apple st<br>
home phone: 555-555-5555<br>
cell phone: 555-555-5555<br>
e-mail: jane@mydomain.com<br>
<p>

Example 3.61. sekcje i tablice asocjacyjne

{* This is an Przykład of printing an associative array
   of data within a section *}
{section name=customer loop=$contacts}
         name: {$contacts[customer].name}<br>
         home: {$contacts[customer].home}<br>
         cell: {$contacts[customer].cell}<br>
         e-mail: {$contacts[customer].email}<p>
{/section}
 
 
OUTPUT:
 
name: John Smith<br>
home: 555-555-5555<br>
cell: 555-555-5555<br>
e-mail: john@mydomain.com<p>
name: Jack Jones<br>
home phone: 555-555-5555<br>
cell phone: 555-555-5555<br>
e-mail: jack@mydomain.com<p>
name: Jane Munson<br>
home phone: 555-555-5555<br>
cell phone: 555-555-5555<br>
e-mail: jane@mydomain.com<p>

Example 3.62. sectionelse

{* sectionelse will execute if there are no $custid values *}
{section name=customer loop=$custid}
         id: {$custid[customer]}<br>
{sectionelse}
         there are no values in $custid.
{/section}

Sekcje mają swoje własne zmienne do uchwytu własności sekcji. Są one identyfikowane jako np: {$smarty.section.sectionname.varname}.

Note

Od Smarty 1.5.0, wyrażenia zmiennych dla własności sekcji zostały zmienione z {%sectionname.varname%} na {$smarty.section.sectionname.varname}. Stare wyrażenia dalej są wspomagane ale w przykładach zobaczysz odwołania do nowych wyrażeń.

3.11.1. index

index jest używany do wyświetlania obecnego indexu pętli, zaczyna od zero ( albo podanego atrybutu start) i jest inkrementowany o jeden (albo o wartość podanego atrybutu step)

Note

If the step and start section properties are not modified, then this works the same as the iteration section property, except it starts on 0 instead of 1.

Example 3.63. section index

         {section name=customer loop=$custid}
         {$smarty.section.customer.index} id: {$custid[customer]}<br>
         {/section}
 
 
         OUTPUT:
 
         0 id: 1000<br>
         1 id: 1001<br>
         2 id: 1002<br>

3.11.2. index_prev

index_prev jest używany do wyświetlenia poprzedniego indexu pętli, przy pierwszej pętli jest ustawiony na -1.

Example 3.64. section index_prev

         {section name=customer loop=$custid}
         {$smarty.section.customer.index} id: {$custid[customer]}<br>
         {* FYI, $custid[customer.index] and $custid[customer] are identical in meaning *}
         {if $custid[customer.index_prev] ne $custid[customer.index]}
        The customer id changed<br>
         {/if}
         {/section}
 
 
         OUTPUT:
 
         0 id: 1000<br>
        The customer id changed<br>
         1 id: 1001<br>
        The customer id changed<br>
         2 id: 1002<br>
        The customer id changed<br>

3.11.3. index_next

index_next jest używany do wyświetlenia następnego indexu pętli. Przy ostatniej pętli jest on ciągle większy o jeden od obecnego indexu (uznaje ustawienia atrybutu step, jeśli jest podany.)

Example 3.65. section index_next

         {section name=customer loop=$custid}
         {$smarty.section.customer.index} id: {$custid[customer]}<br>
         {* FYI, $custid[customer.index] and $custid[customer] are identical in meaning *}
         {if $custid[customer.index_next] ne $custid[customer.index]}
        The customer id will change<br>
         {/if}
         {/section}
 
 
         OUTPUT:
 
         0 id: 1000<br>
        The customer id will change<br>
         1 id: 1001<br>
        The customer id will change<br>
         2 id: 1002<br>
        The customer id will change<br>

3.11.4. iteration

iteration jest używany do wyświetlania obecnej interakcji w pętli..

Note

Nie jest wypełniony przez właściwości sekcji start, step i max, inaczej niż index property. Iteration także startuje od zamiast 0 tak jak index. rownum to alias do iteration, diałają identycznie.

Example 3.66. section iteration

         {section name=customer loop=$custid start=5 step=2}
         current loop iteration: {$smarty.section.customer.iteration}<br>
         {$smarty.section.customer.index} id: {$custid[customer]}<br>
         {* FYI, $custid[customer.index] and $custid[customer] are identical in meaning *}
         {if $custid[customer.index_next] ne $custid[customer.index]}
        The customer id will change<br>
         {/if}
         {/section}
 
 
         OUTPUT:
 
         current loop iteration: 1
         5 id: 1000<br>
        The customer id will change<br>
         current loop iteration: 2
         7 id: 1001<br>
        The customer id will change<br>
         current loop iteration: 3
         9 id: 1002<br>
        The customer id will change<br>

3.11.5. first

first jest ustawiony na true jeżeli obecna interakcja sekcji jest pierwszą.

Example 3.67. section first

         {section name=customer loop=$custid}
         {if $smarty.section.customer.first}
        <table>
         {/if}
 
         <tr><td>{$smarty.section.customer.index} id:
                {$custid[customer]}</td></tr>
 
         {if $smarty.section.customer.last}
        </table>
         {/if}
         {/section}
 
 
         OUTPUT:
 
         <table>
         <tr><td>0 id: 1000</td></tr>
         <tr><td>1 id: 1001</td></tr>
         <tr><td>2 id: 1002</td></tr>
         </table>

3.11.6. last

last jest ustawiony na true jeżeli obecna interakcja sekcji jest ostatnią.

Example 3.68. section last

          {section name=customer loop=$custid}
         {if $smarty.section.customer.first}
        <table>
         {/if}
 
         <tr><td>{$smarty.section.customer.index} id:
                {$custid[customer]}</td></tr>
 
         {if $smarty.section.customer.last}
        </table>
         {/if}
         {/section}
 
 
         OUTPUT:
 
         <table>
         <tr><td>0 id: 1000</td></tr>
         <tr><td>1 id: 1001</td></tr>
         <tr><td>2 id: 1002</td></tr>
         </table>

3.11.7. rownum

rownum jest używany do wyświetlania obecnej interakcji w pętli, startuje od jedynki. To alias do iteration, działają identycznie.

Example 3.69. section rownum

         {section name=customer loop=$custid}
         {$smarty.section.customer.rownum} id: {$custid[customer]}<br>
         {/section}
 
 
         OUTPUT:
 
         1 id: 1000<br>
         2 id: 1001<br>
         3 id: 1002<br>

3.11.8. loop

loop jest używana do wyświetlenia ostatniego numeru indexu, który został po ostatniej pętli sekcji. Może być używany wewnątrz lub na zewnątrz sekcji.

Example 3.70. section loop

         {section name=customer loop=$custid}
         {$smarty.section.customer.index} id: {$custid[customer]}<br>
         {/section}
 
         There were {$smarty.section.customer.loop} customers shown above.
 
         OUTPUT:
 
         0 id: 1000<br>
         1 id: 1001<br>
         2 id: 1002<br>
 
         There were 3 customers shown above.

3.11.9. show

show jest używany jako parametr sekcji, jest to wartość boolowska (true/false). Jeśli parametr jest równy false sekcja nie zostanie wyświetlona. Jeśli jest obecne sectionelse, to zostanie wyświetlony.

Example 3.71. section show

         {* $show_customer_info may have been passed from the PHP
         application, to regulate whether or not this section shows *}
         {section name=customer loop=$custid show=$show_customer_info}
         {$smarty.section.customer.rownum} id: {$custid[customer]}<br>
         {/section}
 
         {if $smarty.section.customer.show}
         the section was shown.
         {else}
         the section was not shown.
         {/if}
 
 
         OUTPUT:
 
         1 id: 1000<br>
         2 id: 1001<br>
         3 id: 1002<br>
 
         the section was shown.

3.11.10. total

total jest używany do wyświetlenia liczby interakcji które odbyły się podczas gdy sekcja była w pętli. Może zostać użyty na zewnątrz lub w środku sekcji.

Example 3.72. section total

         {section name=customer loop=$custid step=2} 
         {$smarty.section.customer.index} id: {$custid[customer]}<br>
         {/section}
 
         There were {$smarty.section.customer.total} customers shown above.
 
         OUTPUT:
 
         0 id: 1000<br>
         2 id: 1001<br>
         4 id: 1002<br>
 
         There were 3 customers shown above.

3.12. {strip}

ZWiele razy projektanci web próbowali rozwiązać co zrobić ponieważ dodatkowe puste spacje i znaki łamania lini zwracają sztuczne dane wyjściowe z oddanego kodu HTML , musisz 'przysunąć do siebie' wszystkie twoje znaczniki w szablonie aby uzyskać pożądany rezultat. Zazwyczaj kończy się to nieczytelnym i nieedytowalnym szablonem. W Smary wszystko pomiędzy znacznikami {strip}{/strip} jest pozbawione pustych spacji i znaków łamania lini z początku i końca linii zanim zostaną wyświetlone. Tym sposobem możesz utrzymać czytelność szablonów i nie martwić się problemami z pustymi spacjami.

Note

strip}{/strip} nie zmienia treści zmiennych w szablonie.

Example 3.73. strip tags

{* the following will be all run into one line upon output *}
{strip}
<table border=0>
         <tr>
                  <td>
                           <A HREF="{$url}">
                           <font color="red">This is a test</font>
                           </A>
                  </td>
         </tr>
</table>
{/strip}
 
 
OUTPUT:
 
<table border=0><tr><td><A HREF="http://my.domain.com"><font color="red">This is a test</font></A></td></tr></table>