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é je false.
_
aktuální prvek cyklu
Příklad: Základní while
Šablona
{while [1, 2, 3, 4, 5]}
  {_}{if not _last}, {/if}
{/while}
Výstup
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.

Příklad: Využití while k výpisu tabulky
Šablona
{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.)

Příklad: Cyklus přes dětské assety
Šablona
{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.

Příklad: Cyklus přes výčtový datový zdroj
Šablona
{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:

Pro vložení příspěvku do diskuse se přihlašte.