while
Iteruje postupně nad všemy prvky konformní hodnoty specifikované výrazem.
while
sequence [use
alias ] param-assignment [whilefirst
statement-first/whilefirst
] statement-body [whilelast
statement-last/whilelast
] [else
statement-else ]/while
- sequence
- Výraz, který se vyhodnotí a podle typu výsledné hodnoty se nad jeho prvky iteruje.
- alias
- Volitelně: proměnná, ve které bude dostupná aktuální hodnota iterace. Default je
_
. - param-assignment
- Předávané parametry. Mají smysl zejména u datových zdrojů. Pozor, v případě dotazových datových zdrojů může použití nadbytečných parametrů vést k chybě.
- statement-first
- Seznam příkazů provedených před prvním průchodem cyklem.
- statement-body
- Seznam příkazů prováděných při každém průchodu cyklem.
- statement-last
- Seznam příkazů provedených po posledním průchodu cyklem.
- statement-else
- Seznam příkazů provedených v případě, že sequence neobsahuje žádné prvky.
Uvnitř statement-body jsou dostupné následující proměnné:
_first
- Je
true
pokud jde o první průběh cyklem. _last
- Je
true
pokud jde o poslední průběh cyklem. _ord
- Počet, kolikrát již cyklus proběhl, tzn. 0-based index aktuálního prvku.
_odd
- Je
true
pokud jde o lichý průběh cyklem. Počítá se ale z hodnoty_ord
, tzn. poprvé jefalse
. _
- aktuální prvek cyklu
{while [1, 2, 3, 4, 5]}
{_}{if not _last}, {/if}
{/while}
1, 2, 3, 4, 5
Iterace přes pole prvků. Každý se vypíše, a pokud není poslední, je za ním ještě čárka.
Pozor: tyto hodnoty jsou dostupné pouze ve statement-body, nikoli ve volitelných podsekcích. Zejména je důležité, že hodnota proměnné _
není ve statement-first a statement-last definovaná a může nabývat nespecifikovaných hodnot – např. se může zdědit z nadřazeného cyklu.
Volitelné podsekce příkazu lze využít například k výpisu tabulkových dat.
{while _template.sqlSource}
{whilefirst}
<table>
<thead>
<tr>
<th>A</th>
<th>B</th>
</tr>
</thead>
<tbody>
{/whilefirst}
<tr class="{if _odd}odd{else}even{/if}">
<td>{_.columnA}</td>
<td>{_.columnB}</td>
</tr>
{whilelast}
</tbody>
</table>
{/whilelast}
{else}
<p>Data nejsou k dispozici.</p>
{/while}
Předpokládáme, že sqlSource
je reference na nějaký SQL zdroj, zpřístupňující řádky tabulky se slouci columnA
a columnB
.
Specifika systému jNetPublish
Iterace přes dětské assety
Při iteraci, kde hodnotou sequence je asset, se implicitně prochází přes všechny jeho dětské assety. (Hlavní výjimkou jsou datové zdroje – viz dále.)
{while _primary.defaultDataFolder}
{whilefirst}<ul>{/whilefirst}
<li><a href="{link(_)}">{_.title}</a></li>
{whilelast}<ul>{/whilelast}
{/while}
Iteruje se přes dětské assety datové složky primární sekce.
Lepší kontroly nad iterací přes dětské assety mohou poskytnout jednak funkce sortedChildren a sortedFilteredChildren, jednak využití dotazového datového zdroje.
Iterace přes datové zdroje
Datové zdroje obecně při iteraci používají vlastní logiku pro iteraci. Existuje několik předdefinovaných typů, a také generické typy umožňující použít vlastní řídící třídu definující způsob, jakým se získá seznam, přes který se bude iterovat.
V závislosti na typu datového zdroje jsou dané různé možnosti parametrizace iterace.
Neassetové datové zdroje
Dokumentace chování je uvedena v popisu assetů:
Assetové datové zdroje
Tyto assety mají několik společných rysů. Při iteraci přes ně je v každém průchodu cyklem hodnotou proměnné _
assetová obálka – speciální objekt s podhodnotami:
asset
- Aktuální asset
parent
- Assetová obálka nadřazeného assetu (pro hierarchické struktury, jinak null)
children
- Seznam assetových obálek vnořených assetů (pro hierarchické struktury, jinak null)
Selekce podhodnoty s jakýmkoli jiným názvem se vyhodnocuje, jako by se brala přímo z assetu; _.title
je tedy totéž jako _.asset.title
.
{while _primary.menu}
{whilefirst}<ul>{/whilefirst}
<li><a href="{link(_.asset)}">{_.title}</a></li>
{whilelast}<ul>{/whilelast}
{/while}
Předpokladem je, že primární sekce obsahuje dětský asset s názvem "menu", kterým je výčtový datový zdroj (ale stačí předpokládat, že to je jakýkoli zdroj assetů).
V každém průchodu cyklem se musí při vytváření odkazu z assetové obálky vybrat asset, který je vstupem pro funkci link. Titulek se získává z assetové obálky, která jeho selekci deleguje na samotný asset.
Jednotlivé typy assetových datových zdrojů mají další vlastnosti – viz příslušnou dokumentaci: