PHPTAL jest implementacją pythonowskiego systemu Zope Page Template w języku PHP. Jego cechą charakterystyczną odróżniającą go od Smarty jest to, że zmienne występują wyłącznie w atrybutach znaczników. Poznanie biblioteki PHPTAL pozwala spojrzeć na podział przetwarzanie/ prezentacja z nieco węższej perspektywy.
Instalacja i pierwszy skrypt
Biblioteka PHPTAL jest rozpowszechniana w postaci
spakowanego archiwum {stala}latest.tar.gz{/stala}. Po rozpakowaniu
archiwum otrzymamy plik {stala}PHPTAL.php{/stala}
oraz folder PHPTAL/. Instalacja pakietu PHPTAL sprowadza
się do umieszczenia pliku {stala}PHPTAL.php{/stala} oraz
folderu {stala}PHPTAL/{/stala} w miejscu zawartym w ścieżkach
dostępu, np.:
1 2 |
C:\php\PEAR\PHPTAL.php C:\php\PEAR\PHPTAL\ |
Skrypt stosujący szablony PHPTAL składa się
z dwóch plików: {stala}index.php{/stala} oraz {stala}sz.html{/stala}. Pliki te
należy umieścić w tym samym folderze. Plik index.
php zawiera instrukcję dołączającą bibliotekę {stala}PHPTAL{/stala},
utworzenie obiektu {stala}$template{/stala} oraz instrukcje
przetwarzające szablon:
1 2 3 4 5 6 7 8 9 10 |
<?php require_once \'PHPTAL.php\'; $template = new PHPTAL(\'sz.html\'); try { echo $template->execute(); } catch (Exception $e){ echo $e; } ?> |
Parametrem konstruktora {stala}PHPTAL(){/stala} jest nazwa
pliku z szablonem. Plik {stala}sz.html{/stala} zawiera kod HTML
strony powitalnej:
1 2 3 |
<body> <h1>Witaj</h1> </body> |
Zmienne
Przekazywanie zmiennych
W bibliotece PHPTAL zmienne szablonu są przekazywane
jako właściwości obiektu {stala}$template{/stala}:
1 2 |
$template->tytul = \'Lorem ipsum\'; $template->tekst = \'Dolor sit amet\'; |
lub poprzez wywołanie metody {stala}set(){/stala}:
1 2 |
$template->set(\'tytul\', \'Lorem ipsum\'); $template->set(\'tekst\', \'Dolor sit amet\'); |
W szablonie {stala}sz.html{/stala} dostęp do zmiennych uzyskujemy
stosując nazwę właściwości:
1 2 |
<h1 tal:content=\"tytul\">tytuł zastępczy</h1> <p tal:content=\"tekst\">treść zastępcza</p> |
Jeśli do szablonu przekażemy zmienną o nazwie
abc i wartości abecadło:
1 |
$template->abc = \'abecadło\'; |
to w szablonie operujemy nazwą abc, podając ją
jako wartość atrybutu {stala}tal:content{/stala}:
1 |
<p tal:content=\"abc\">xyz</p> |
Powyższy znacznik spowoduje zastąpienie tekstu
xyz napisem abecadło (tj. treść elementu p zostanie
zastąpiona wartością zmiennej o nazwie abc).
Wygenerowany zostanie następujący kod HTML:
1 |
<p>abecadło</p> |
Zwróćmy uwagę, że tekst xyz pomiędzy znacznikami {html}
oraz
{/html} może być dowolny, gdyż ulega
zamianie.
Atrybuty
Wartości atrybutów
Wartości atrybutów znaczników HTML ustalamy wykorzystując
{stala}tal:attributes{/stala}. Ze skryptu index.php do
szablonu przekazujemy wartość atrybutu:
1 |
$template->url = \'lorem.html\'; |
Natomiast w szablonie wywołujemy {stala}tal:attributes{/stala},
podając nazwę atrybutu (href) oraz nazwę
zmiennej (url), która ma być użyta jako wartość:
1 |
<a tal:attributes=\"href url\" href=\"bbb\">...</a> |
Kilka atrybutów
Pojedynczy znacznik HTML może zawierać kilka
atrybutów. W takiej sytuacji atrybut {stala}tal:attributes{/stala}
zawiera kilka wpisów oddzielonych średnikiem. Do
szablonu przekazujemy zmienne klasa oraz identyfikator:
1 2 |
$template->klasa = \'naglowek\'; $template->identyfikator = \'glowny\'; |
W szablonie w atrybucie {stala}tal:attributes{/stala} wymieniamy
zarówno class, jak i id, podając nazwy zmiennych,
które mają być użyte jako wartości:
1 |
<p tal:attributes=\"class klasa; id identyfikator\">lorem</p> |
Powyższy szablon wygeneruje kod:
1 |
<p class=\"nagłówek\" id=\"glowny\">lorem</p> |
Składanie wartości atrybutu z kilku zmiennych
Niekiedy atrybut HTML może powstawać z kilku
zmiennych przekazanych do szablonu. W takiej sytuacji
wykorzystujemy modyfikator string.
Do szablonu przekazujemy etykietę hiperłącza,
folder oraz fragment nazwy pliku:
1 2 3 4 5 6 |
$etykieta = \'Dolor sit amet\'; $folder = \'fld/dir/\'; $url = \'lorem.html\'; $template->etykieta = $etykieta; $template->folder = $folder; $template->url = $url; |
Na bazie tych trzech zmiennych należy wygenerować
odnośnik:
1 |
<a href=\"fld/dir/abc-lorem.html\">Dolor sit amet</a> |
W PHP zadanie to realizują instrukcje:
1 2 3 4 5 6 7 |
echo \'<a href=\"\'; echo $folder; echo \'abc-\'; echo $url; echo \'\">\'; echo $etykieta; echo \'</a>\'; |
W szablonie PHPTAL należy wykorzystać atrybuty
{stala}tal:content{/stala} oraz {stala}tal:attributes{/stala} w następujący
sposób:
1 |
<a tal:content=\"etykieta\" tal:attributes=\"href string:${folder}abc-${url}\"href=\"b\">a</a>
|
Podsumowanie
Główną przyczyną umieszczenia instrukcji przetwarzania
szablonu w atrybutach HTML była – jak podaje
dokumentacja – chęć stosowania edytorów
wizualnych. Argument ten wydaje się ważny wyłącznie
dla osób pracujących w programach WYSIWYG.
Jako zwolennik ręcznego pisania kodu (PHP/HTML/CSS) nie uznałbym tego za ważny plus. Jednak
z takiego podejścia wynikają inne, moim zdaniem
ważniejsze, korzyści:
- silniejsze wymuszenie programowania obiektowego,
- bardziej rygorystyczna niż to ma miejsce na przykład
w przypadku Smarty separacja przetwarzania
od prezentacji.
Dokumentacja PHPTAL jawnie zaleca stosowanie
obiektów oraz korzystanie z metod, które decydują
o przetwarzaniu szablonu. W miejsce wyrażeń
osadzanych w szablonie:
1 |
<span tal:condition=\"php: cart.countItems() GT 5\">...</span> |
zalecane jest zdefiniowanie metody {stala}hasMoreThan-FiveItems(){/stala}:
1 |
<span tal:condition=\"cart/hasMoreThanFiveItems\"> ...</span> |
W ten sposób zawartość szablonu sprowadzi
się do odczytywania właściwości i wywoływania
metod obiektów przekazanych do szablonu. Podejście
takie zastosowane w odniesieniu do wszystkich
aspektów szablonu spowoduje, że atrybuty
(m.in. href hiperłączy) będą także przekazywane
jako właściwości lub zwracane przez metodę.
W miejsce:
1 |
<a tal:content=\"etykieta\" tal:attributes=\"href string:${folder}abc-${url}\" href=\"b\">a</a>
|
pojawi się:
1 |
<a tal:content=\"obiekt/etykieta\" tal:attributes=\"href obiekt/pelnyUrl\" href=\"b\">a</a> |
Mimo że pozostanę użytkownikiem szablonów
Smarty (głównie z powodu trudności w generowaniu
przy użyciu PHPTAL plików tekstowych oraz LaTeX-a), to uważam, że lekcja wypływająca z poznania
systemu PHPTAL jest bardzo ważna. Uściśla bowiem
zakres obejmowany pojęciami przetwarzanie
oraz prezentacja. Im precyzyjniej określimy wszystkie
cechy prezentacyjne aplikacji, tym łatwiej będzie
w przyszłości wprowadzać zmiany w kodzie.
Rozbicie szablonu na kilka plików
Makrodefinicje
W celu rozbicia dużego szablonu na kilka plików
w PHPTAL stosujemy makrodefinicje. W osobnym
pliku o nazwie {stala}makro-menu.html{/stala} umieszczamy definicję
makra o nazwie {stala}main_menu{/stala}:
1 2 3 4 5 6 7 |
<div metal:define-macro=\"main_menu\">
<ul>
<li><a href=\"lorem.html\">lorem</a></li>
<li><a href=\"ipsum.html\">ipsum</a></li>
<li><a href=\"dolor.html\">dolor</a></li>
</ul>
</div>
|
W szablonie głównym makro wywołujemy korzystając
z atrybutu {stala}metal:use-macro{/stala}. Wartość atrybutu
zawiera nazwę pliku oraz nazwę makrodefinicji:
1 |
<span metal:use-macro=\"makro-menu.html/main_menu\" /> |
Znacznik {html}{/html}, który zawiera wywołanie
makra, jest automatycznie usuwany. Nie pojawia
się on w generowanym kodzie HTML. Ponieważ tak
zapisany znacznik span jest niepoprawny, lepiej do
wywoływania makr stosować br:
1 |
<br metal:use-macro=\"makro-menu.html/main_menu\" /> |
Przekazywanie zmiennych do makr
Wszystkie zmienne przekazane do szablonu, np.
tytul oraz opcje:
1 2 |
$template->tytul = \'lorem ipsum\'; $template->opcje = array(\'dolor\', \'sit\'); |
są automatycznie dostępne wewnątrz makr. Makrodefinicja
menu zawarta w pliku {stala}makro-menu.html{/stala}
wykorzystuje obie zmienne tytul oraz opcje:
1 2 3 4 5 6 |
<div metal:define-macro=\"menu\">
<h4 tal:content=\"tytul\">...</h4>
<ul tal:repeat=\"el opcje\">
<li tal:content=\"el\">...</li>
</ul>
</div>
|
Obiekty
Dostęp do pól obiektów
Do przekazywania złożonych danych dokumentacja
PHPTAL zaleca stosowanie klas i obiektów. Po
zdefiniowaniu klasy Osoba:
1 2 3 4 5 6 7 8 9 10 |
class Osoba { public $imie; public $nazwisko; function_construct($AImie, $ANazwisko) { $this->imie = $AImie; $this->nazwisko = $ANazwisko; } } |
do szablonu przekazujemy obiekt o nazwie student:
{stala}$template->student = new Osoba(‘Jan’, ‘Kowalski’){/stala}
W szablonie publiczne pola obiektu są dostępne
jako: student/imie oraz student/nazwisko:
1 2 3 4 |
<tr> <td tal:content=\"student/imie\">...</td> <td tal:content=\"student/nazwisko\">...</td> </tr> |
Obiekty Propel
W przypadku obiektów generowanych przez oprogramowanie
Propel dostęp do pól jest realizowany
metodami {stala}get(){/stala}. PHPTAL pozwala na wywoływanie
dowolnych metod obiektu. Operator -> języka
PHP:
1 |
$osoba->getImie() |
zostaje w PHPTAL zastąpiony przez kropkę:
1 |
$osoba.getImie() |
Klasa Osoba ma metody {stala}getImie(){/stala}, {stala}getNazwisko(){/stala},
{stala}getWiek(){/stala} oraz {stala}getPlec(){/stala}. Po przekazaniu do
szablonu tablicy obiektów klasy Osoba:
1 |
$template->osoby = OsobaPeer::doSelect(new Criteria); |
stosujemy iterację {stala}tal:repeat{/stala}. W kolejnych obrotach
wywołujemy metody dostępu do pól obiektu o:
1 2 3 4 5 6 7 |
<tr tal:repeat=\"o osoby\">
<td tal:content=\"string:${repeat/o/number}.\"></td>
<td tal:content=\"php:o.getImie()\"></td>
<td tal:content=\"php:o.getNazwisko()\"></td>
<td tal:content=\"php:o.getWiek()\"></td>
<td tal:content=\"php:o.getPlec()\"></td>
</tr>
|
Oczywiście uruchomienie tego przykładu wymaga
instalacji bazy danych wypełnionej rekordami.
Zadanie to realizuje skrypt {stala}create-db-filled.bat{/stala}
(należy pamiętać o wprowadzeniu – w miejsce
AX1BY2CZ3 – hasła administratora).
Przykłady
ABBA
Pierwszy przykład, strona z piosenkami zespołu
ABBA, powstaje na podstawie plików tekstowych.
W skrypcie {stala}index.php{/stala} przetwarzamy pliki tekstowe.
Całość odczytanych informacji przekazujemy do szablonu
jako obiekt o nazwie menu – patrz listing 1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
class MenuItem { public $url; public $caption; function __construct($aurl, $acaption) { $this->url = $aurl; $this->caption = $acaption; } } class Menu { private $ile; private $numer; public $tytul; public $tekst; public $piosenki; function __construct() { $plik = file(\'dane/00lista.log\'); $this->ile = count($plik); $this->numer = 0; if (isset($_GET[\'id\']) && str_ievpifr($_GET[\'id\'], 1, $this->ile)) { $this->numer = $_GET[\'id\'] - 1; } $tmp = explode(\':\', trim($plik[$this->numer])); $nazwaPlikuWybranego = $tmp[1]; $this->tytul = $tmp[0]; $this->tekst = file_get_contents(\'dane/\' . $nazwaPlikuWybranego); $this->piosenki = array(); for ($i = 0; $i < $this->ile; $i++) { $linia = explode(\':\', trim($plik[$i])); $this->piosenki[$i] = new MenuItem(\'index.php?id=\' . ($i + 1), $linia[0]); } } } $template = new PHPTAL(\'templates/sz.html\'); $template->menu = new Menu; try { echo $template->execute(); } catch (Exception $e){ echo $e; } |
Obiekt ten ma następujące właściwości:
1 2 3 4 5 |
$menu->tytul $menu->tekst $menu->piosenki[] $menu->piosenki[n]->url $menu->piosenki[n]->caption |
Dwie pierwsze właściwości, {stala}$menu->tytul{/stala} oraz
{stala}$menu->tekst{/stala}, zawierają dane piosenki wybranej
z menu. Właściwość {stala}$menu->piosenki[]{/stala} jest tablicą,
która zawiera wszystkie opcje menu. Każda
z opcji ma właściwość {stala}$menu->piosenki[n]->url{/stala}
oraz {stala}$menu->piosenki[n]->caption{/stala}. W szablonie
{stala}sz.html{/stala} najpierw ustalamy tytuł strony:
1 |
<title tal:content=\"string:ABBA: ${menu/tytul}\"> ...</title>
|
następnie drukujemy menu:
1 2 3 4 5 |
<ol>
<li tal:repeat=\"element menu/piosenki\">
<a tal:attributes=\"href element/url; title element/caption\" tal:content=\"structure php:str_replace (\' \', \' \', element.caption)\">...</a>
</li>
</ol>
|
po czym wyświetlamy tytuł i tekst wybranej piosenki:
1 2 |
<h2 tal:content=\"menu/tytul\">...</h2> <p tal:content=\"structure php:nl2br(menu.tekst)\">...</p> |
Ptaki
Drugi przykład jest bardziej skomplikowany. Witryna
„Ptaki” udostępnia zawartość bazy danych.
Całość jest zaimplementowana przy użyciu Propela.
Uruchomienie przykładu należy rozpocząć od
instalacji bazy danych. Zadanie to realizuje skrypt
zrzut-db.bat, w którym wystarczy wymienić hasło
administratora MySQL. Co ciekawe, wymiana systemu
Smarty na PHPTAL sprowadziła się do kilku
banalnych zmian w kodzie index.php.
Jak widać na listingu 2, wymieniona została
jedna instrukcja {stala}require_once{/stala}, instrukcje przekazujące
dane do szablonu oraz sposób wyświetlania
szablonu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
//require_once \'Smarty.class.php\'; require_once \'PHPTAL.php\'; ... case 4: $c = new Criteria; $c->addAscendingOrderByColumn(RodzinaPeer::RODZINA); $rodziny = RodzinaPeer::doSelect($c); // $s->assign(\'rodziny\', $rodziny); $template->rodziny = $rodziny; break; ... //$s->assign(\'akcja\', $akcja); //$s->assign(\'folder\', $folder); $template->akcja = $akcja; $template->folder = $folder; //$s->display(\'index.tpl\'); try { echo $template->execute(); } catch (Exception $e){ echo $e; } |
Przygotowanie szablonu PHPTAL było znacznie
trudniejsze. W szablonie głównym index.html warunkowo
wywołujemy jedną z makrodefinicji zapisanych
w plikach {stala}home.html{/stala}, {stala}ptaki.html{/stala}, {stala}rodziny.html{/stala}, {stala}ptak.html{/stala}:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<div id=\"tekst\">
<div tal:condition=\"php:akcja EQ 2\" tal:omit-tag=\"\">
<br metal:use-macro=\"home.html/home\" />
</div>
<div tal:condition=\"php:akcja EQ 3\">
<br metal:use-macro=\"ptaki.html/ptaki\" />
</div>
<div tal:condition=\"php:akcja EQ 4\">
<br metal:use-macro=\"rodziny.html/rodziny\" />
</div>
<div tal:condition=\"php:akcja EQ 5\">
<br metal:use-macro=\"ptaki.html/ptaki\" />
</div>
<div tal:condition=\"php:akcja EQ 6\">
<br metal:use-macro=\"ptak.html/ptak\" />
</div>
</div>
|
Każda z makroinstrukcji stosuje zmienne przekazane
do szablonu. Zmienne te są obiektami Propel
lub tablicami obiektów. Na przykład makroinstrukcja
rodziny.html/rodziny przetwarza tablicę
zawierającą obiekty klasy Rodzina. Obiekty te
mają metody:
- {stala}getUrl(){/stala} – zwraca adres strony WWW
- {stala}getRodzina(){/stala} – zwraca nazwę rodziny
Makrodefinicja przyjmuje więc postać:
1 2 3 4 5 6 7 |
<div metal:define-macro=\"rodziny\" tal:omit-tag=\"\">
<ul>
<li tal:repeat=\"rodz rodziny\">
<a tal:content=\"php:rodz.getRodzina()\" tal:attributes=\"href php:folder . \'rodzina/\' rodz.getUrl()\'.html\'\" ></a>
</li>
</ul>
</div>
|
Zmienna o nazwie {stala}$folder{/stala} jest konieczna z powodu
użycia względnych przyjaznych URL-i.
Zmienna osadzona w napisie
Zmienna może zostać osadzona w dowolnym napisie.
Treścią elementu HTML zostaje wówczas napis, w którym
występują zmienne. W skrypcie {stala}index.php{/stala} przekazujemy
do szablonu zmienną o nazwie cena:
1 |
$template->cena = \'659\'; |
Zmienna $cena zostaje osadzona w napisie
Cena wynosi … złotych przy użyciu modyfikatora
wyrażeń string:
1 |
<p tal:content=\"string: Cena wynosi $cena złotych\">...</p> |
Zmienne zawierające kod HTML
Należy pamiętać, że wartości zmiennych są przed
wydrukowaniem automatycznie zabezpieczane
wywołaniami {stala}htmlspecialchars(){/stala}. Jeśli do szablonu
przekażemy zmienną:
1 |
$template->tekst = \'<h1>Lorem ipsum</h1>\'; |
to znacznik:
1 |
<div tal:content=\"tekst\">...</div> |
spowoduje wydrukowanie tekstu, w którym znaki {html}<{/html} oraz {html}>{/html} są zastąpione przez {html}<{/html} i {html}>{/html}:
1 2 3 |
<div> <h1>Lorem ipsum</h1> </div> |
Jeśli chcemy uniknąć konwersji kodu HTML, należy
skorzystać z modyfikatora structure:
1 |
<div tal:content=\"structure tekst\">...</div> |
Wówczas wygenerowany zostanie następujący
kod HTML:
1 2 3 |
<div> <h1>Lorem ipsum</h1> </div> |
Przekształcanie zmiennych
Zmienne drukowane w szablonie mogą – przed
wydrukowaniem – być poddane dowolnym przekształceniom.
Modyfikacje wykonujemy wywołując
funkcje PHP. Najpierw przekazujemy do szablonu
zmienną o nazwie tytul:
1 |
$template->tytul = \'Lorem ipsum...\'; |
W szablonie stosujemy modyfikator php w połączeniu
z modyfikatorem structure:
1 2 |
<p tal:content=\"structure php:nl2br(tytul)\">...</p> <p tal:content=\"structure php:nl2br(strtoupper (tytul))\">...</p> |
Tablice asocjacyjne
W przypadku użycia tablic asocjacyjnych:
1 2 |
$t = array(\'imie\' => \'Andrzej\',\'nazwisko\' => \'Nijaki\'); $template->osoba = $t; |
w szablonie stosujemy odwołania w postaci zmienna/
indeks, np.:
1 2 |
<p tal:content=\"osoba/imie\">abc</p> <p tal:content=\"osoba/nazwisko\">abc</p> |
Rezygnacja ze znacznika
Niekiedy może się zdarzyć, że element PHPTAL wymusza
umieszczenie w kodzie HTML dodatkowych
znaczników. Instrukcja:
1 |
<div tal:content=\"structure tekst\">...</div> |
spowoduje wyświetlenie zmiennej tekst wewnątrz
znaczników {html}
{/html}:
1 2 3 |
<div> ...treść zmiennej tekst... </div> |
W celu usunięcia elementu div z generowanego
kodu HTML należy użyć atrybutu tal:omit-tag:
1 |
<div tal:omit-tag=\"\" tal:content=\" structure tekst\">...</div> |
W takiej sytuacji generowany kod HTML nie będzie
zawierał znaczników {html}
{/html}.
Warunkowe przetwarzanie fragmentu szablonu
Rolę instrukcji if w szablonach PHPTAL pełni atrybut
{stala}tal:condition{/stala}. Jeśli zmienna liczba przekazana
do szablonu przyjmuje wartość logiczną true:
1 |
$template->liczba = 15; |
wówczas treść elementu div pojawi się w wygenerowanym
kodzie HTML:
1 2 3 |
<div tal:condition=\"liczba\"> ... </div> |
Atrybut {stala}tal:condition{/stala} może zawierać warunki
logiczne porównujące wartości zmiennych. W takim
przypadku operatory {html}<, <=, >{/html} oraz {html}>={/html} należy
zastąpić przez LT, LE, GT i GE odpowiednio, np.:
1 2 3 4 5 6 |
<div tal:condition=\"php: liczba GT 70\"> Lorem... </div> <div tal:condition=\"php: liczba LE 33\"> Pellentesque... </div> |
Iteracyjne przetwarzanie tablic
Pętla pojedyncza
Iteracyjne przetwarzanie tablic umożliwia atrybut tal:
repeat o składni przypominającej instrukcję foreach.
Do szablonu przekazujemy tablicę jednowymiarową.
Zmienna szablonu nazywa się owoce:
1 2 |
$t = array(\'malina\', \'wiśnia\'); $template->owoce = $t; |
W szablonie umieszczamy atrybut {stala}tal:repeat{/stala}
o wartości owoc owoce:
1 2 3 |
<ol> <li tal:repeat=\"owoc owoce\" tal:content=\"owoc\">...</li> </ol> |
Powoduje on przetworzenie wszystkich elementów
tablicy owoce. W poszczególnych obrotach
pętli do kolejnego elementu tablicy odwołujemy
się stosując nazwę owoc. Zapis:
1 |
tal:repeat=\"owoc owoce\" tal:content=\"owoc\" |
jest analogiczny do:
1 2 3 |
foreach ($owoce as $owoc) { echo $owoc; } |
Indeksy obrotów pętli
Dostęp do indeksów pętli zapewniają specjalne odwołania
postaci:
1 2 3 4 5 6 |
repeat/x/index repeat/x/number repeat/x/even repeat/x/odd repeat/x/start repeat/x/end |
W miejsce x należy umieścić nazwę elementu
pętli, na przykład owoc:
1 2 3 |
<tr tal:repeat=\"owoc owoce\"> <td tal:content=\"repeat/owoc/number\"></td> </tr> |
Zmienne te mogą być osadzane w napisach
przy użyciu modyfikatora string. Oto w jaki sposób
możemy po numerze kolejnego elementu (dostępnego
jako repeat/owoc/number) dodać kropkę:
1 2 3 4 |
<tr tal:repeat=\"owoc owoce\">
<th tal:content=\"string:${repeat/owoc/number}.\">...</th>
<td tal:content=\"owoc\">...</td>
</tr>
|
Pętla podwójna
Tablice dwuwymiarowe przetwarzamy w podwójnej
pętli {stala}tal:repeat{/stala}. Po przekazaniu do szablonu
zmiennej elementy:
1 2 3 4 5 |
$t = array( array(\'ala\', \'ola\', \'jola\', \'tola\'), array(\'marek\', \'jurek\'), ); $template->elementy = $t; |
stosujemy zagnieżdżoną pętlę tal:repeat:
1 2 3 4 5 6 7 |
<ol>
<li tal:repeat=\"wiersz elementy\" >
<ul>
<li tal:repeat=\"e wiersz\" tal:content=\"e\"></li>
</ul>
</li>
</ol>
|
Może Cię zainteresować:



