Control slouží k vypsání prvků kolekce do stránky.
<je:repeater runat="server" source="someCollection"> <item> <je:item runat="server" field=".someField" /> </item> </je:repeater>
<je:repeater>
lze propojit s controlem <je:pager>
, s jehož pomocí lze obsah kolekce vypsat stránkovaně.
Atributy
container nepovinný [ID containeru]]
ID containeru, který určuje kontejnerovou proměnnou controlu (viz Kontejnerování).
count nepovinný [0, int]
Kolik prvních položek kolekce se má vypsat. Je-li zadáno
count="0"
, pak se zobrazí všechny položky kolekce.id nepovinný [string]
Identifikátor, pomocí kterého se na
<je:repeater>
dá odkazovat z atributůcontainer
vložených controlů, případně z controlu<je:pager>
. Identifikátor musí být v rámci stránky (včetně použitých uživatelských controlů) unikátní. Doporučuje se, aby identifikátor začínal písmenem a obsahoval jen písmena bez diakritik a číslice.moreCount nepovinný [int]
Určuje počet položek, které se vypíšou před vložením template
MoreSeparator
.order nepovinný [string]
Určuje pořadí výpisu položek do stránky. Definuje se názvem pole, podle kterého se mají položky řadit, a směrem –
asc
pro vzestupné,desc
pro sestupné. Např.order="title asc"
neboorder="published desc"
(předpokládá se, že poletitle
apublished
jsou obsažena v typu kolekce). Lze zadat i více pravidel, např.order="published desc, title asc"
. V takovém případě se druhé pravidlo použije, je-li hodnota prvního pole totožná. Není-li atribut použit, položky jsou vypsány ve stejném pořadí, v jakém jsou zobrazeny v administraci.restrictContainer nepovinný [ID kontejneru]
ID kontejneru určujícího proměnnou, podle které jsou omezeny prvky vypisované kolekce. Proměnná se hledá v poli určeném atributem
restrictField
. Pokud atributrestrictContainer
není uveden, je proměnná určena bezprostředně nadřazeným kontejnerem (viz Kontejnerování). Lépe smysl tohoto atributu objasňuje níže uvedený příklad.restrictField nepovinný [jméno pole]
Atribut umožňuje omezit kolekci vypisovanou repeaterem pouze na prvky, které v referenčním poli (tj. v poli typu
<Reference>
nebo<ReferenceCollection>
) obsahují určitou hodnotu. Obsahem tohoto atributu je jméno referenčního pole, ve kterém se hodnota hledá. Hledaná hodnota je pak určena bezprostředně nadřazeným kontejnerem (případně kontejnerem, jehož ID je uvedeno v atributurestrictContainer
). Lépe smysl tohoto atributu objasňuje níže uvedený příklad.rowLength nepovinný [0, int]
Počet prvků kolekce, po nichž se vypíše obsah šablony
rowSeparator
– používá se, pokud je potřeba vypsat prvky kolekce do tabulky. Nulová hodnota atributu znamená, že se šablonarowSeparator
(aemptyItem
) vůbec nevypisuje.source povinný [jméno kolekce]
Určuje kolekci, jejíž prvky bude
<je:repeater>
procházet a vypisovat.
Templates
Všechny templates jsou volitelné. Pro renderování stránky jsou použity pouze uživatelem definované, nedefinované jsou považovány za prázdné.
Core templates
- header – obsah, který se vypíše před první položkou kolekce. Pokud
<je:repeater>
nevypíše žádné položky, obsahheader
se také nevypíše. Jako kontejnerová proměnná pro relativní odkazování proměnných je určen první prvek kolekce. - item – výpis jednoho prvku kolekce. Jako kontejnerová proměnná pro relativní odkazování proměnných je určen momentálně zpracovávaný prvek kolekce.
- footer – obsah, který se vypíše za poslední položkou kolekce. Pokud
<je:repeater>
nevypíše žádné položky, obsahfooter
se také nevypíše. Jako kontejnerová proměnná pro relativní odkazování proměnných je určen poslední prvek kolekce.
Extra templates
- noContent – obsah, který se vypíše, pokud
<je:repeater>
nevypíše žádné položky. Pokud se vypíšenoContent
, nevypíše se už obsah žádného jiného template. Jako kontejnerová proměnná pro relativní odkazování proměnných je určen nadřazený kontejner repeateru (tedy stejná situace, jako by template vůbec nebyl obsažen v repeatru – kontejner z tohoto důvodu nemusí vždy existovat). - item1, item2, ..., item10 – použije se pro první (
item1
), druhou (item2
), až desátou (item10
) vypsanou položku. Jako kontejnerová proměnná pro relativní odkazování proměnných je určen momentálně zpracovávaný prvek kolekce. - item2n, item3n, ..., item10n – template pro výpis každé druhé (
item2n
), třetí (item3n
) až desáté (item10n
) položky. Při kolizi s jinými šablonami na jednom prvku, je zvolena šablona podle pravidel uvedených níže. Kolidují-li definiceitem[2-10]n
pro některý prvek mezi sebou (například 4. prvek proitem2n
aitem4n
), použije se template s vyšším číslem. Jako kontejnerová proměnná pro relativní odkazování proměnných je určen momentálně zpracovávaný prvek kolekce. - lastItem1, lastItem2, …, lastItem10 – použije se pro poslední (
lastItem1
), předposlední (lastItem2
) až desátou položku od konce (lastItem10
). Při kolizi s jinými šablonami na jednom prvku, je zvolena šablona podle pravidel uvedených níže. Jako kontejnerová proměnná pro relativní odkazování proměnných je určen momentálně zpracovávaný prvek kolekce. - separator – obsah, který se vypíše mezi každé dvě vypsané položky. Jako kontejnerová proměnná pro relativní odkazování proměnných je určen naposledy zpracovávaný prvek kolekce (tedy předchozí).
- moreFooter – obsah, který se vypíše bezprostředně před template
footer
, a to pouze v případě, kdy se zároveň vypsal také templatemoreSeparator
(tedy je v controlu<je:repeater>
zadán atributmoreCount
a definován templatemoreSeparator
). Jako kontejnerová proměnná pro relativní odkazování proměnných je určen poslední prvek kolekce. - moreSeparator – obsah, který se vypíše po položce, jejíž pořadí je určeno atributem
moreCount
. Pokud<je:repeater>
má také šablony separator neborowSeparator
, je na jejich místě u této konkrétní položky vypsán pouzemoreSeparator
. Pokud<je:repeater>
vypíše stejný počet položek, jako je určený atributemmoreCount
, templatemoreSeparator
se nevypíše. Jako kontejnerová proměnná pro relativní odkazování proměnných je určen naposledy zpracovávaný prvek kolekce (tedy předchozí).
Tabulkové templates
Následující šablony se hodí pro výpis hodnot do tabulek – mají smysl, jen pokud je zároveň použit atribut rowLength
.
- rowSeparator –obsah, který se vypíše za poslední položku řádku, tj. za každých
rowLength · n
vypsaných položek, kden
je přirozené číslo. Je-li vypsán obsahrowSeparator
template, nevypíše se obsahseparator
template. Jako kontejnerová proměnná pro relativní odkazování proměnných je určen naposledy zpracovávaný prvek kolekce (tedy předchozí). - emptyItem – obsah prázdných buněk na konci posledního řádku tabulky. Není-li počet prvků kolekce dělitelný počtem řádků, může být poslední řádek tabulky doplněn prázdnými buňkami o obsahu definovaném v
emptyItem
template. Jako kontejnerová proměnná pro relativní odkazování proměnných je určen poslední prvek kolekce.
Pořadí použití šablon
V případě, že jsou definovány template item[1-10]
a lastItem[1-10]
a některý z prvků kolekce splňuje kritéria pro více template (například máme v kolekci celkem 6 prvků a je definováno item3
a lastItem4
), pak JellyPot vypíše obsah template s nižším indexem, v případě rovnosti indexů se vypíše obsah šablony item[1-10]
. Šablona typu item
nebo item[2-10]n
se použije až ve chvíli, kdy nelze použít žádnou z šablon item[1-10]
nebo lastItem[1-10]
.
Příklady
Příklad 1: takový jednoduchý
<je:repeater runat="server" source="someCollection"> <header> <h1>Položky</h1> <ul> </header> <item> <li><je:item runat="server" field=".text" /></li> </item> <footer> </ul> </footer> </je:repeater>
Vypíše:
<h1>Položky</h1> <ul> <li>Obsah pole text první položky</li> <li>Obsah pole text druhé položky</li> <li>Obsah pole text třetí položky</li> <li>Obsah pole text páté položky</li> <li>Obsah pole text šesté položky</li> <li>Obsah pole text sedmé položky</li> </ul>
Příklad 2: Možnost filtrování kolekce pomocí atributu restrictField
V tomto příkladu lze článkům blogu (tj. prvkům kolekce article
) přiřadit pomocí pole typu <Reference>
kategorii, do které článek patří (tj. prvek kolekce articleCategory
). V Site.config je výše uvedené zapsáno takto:
<Vars> <Collection name="article" itemType="ArticleItem" /> <Collection name="articleCategory" itemType="ArticleCategoryItem" /> ... </Vars> <Types> <Type name="ArticleItem"> <SimpleText name="title" /> <Text name="text" /> ... <Reference name="category" sourceCol="articleCategory" /> </Type> <Type name="ArticleCategoryItem"> <SimpleText name="title" /> </Type> ... </Types>
Dále máme stránku, která obsahuje charakteristiku jedné kategorie (např. název kategorie, její popis a podobně). Tato stránka může být odkazována třeba ze seznamu všech kategorií. K charakteristice kategorie chceme na stránce připojit i seznam všech článků, které do dané kategorie patří. Články vypíšeme pomocí controlu <je:repeater>
. Ten by za normálních okolností vypsal všechny články. Do atributu restrictField
proto zapíšeme jméno referenčního pole odkazujícího na kategorii, tj. category
, čímž repeateru sdělíme, aby výpis omezil pouze na ty články, které patří do stejné kategorie, jako je kategorie určená hlavním kontejnerem.
<je:container runat="server" expect="articleCategory"> <h1>Články z rubriky <cms:item runat="server" field=".title" /></h1> <je:repeater runat="server" source="article" restrictField="category"> <item> <je:item runat="server" field=".title" tag="h2" /> <je:item runat="server" field=".text" /> </item> </je:repeater> </je:container>
Příklad by vypadal stejně, pokud by pole category
bylo typu <ReferenceCollection>
. Rozdíl by byl jen v tom, že článek by se mohl objevit ve více kategoriích.
Pokud by na stránce bylo více kontejnerů (ve výše uvedeném příkladu je na stránce pouze jeden), lze kontejner určující proměnnou specifikovat atributem restrictContainer
:
<je:container runat="server" id="cCategory" expect="articleCategory"> ... <je:repeater runat="server" source="article" restrictField="category" restrictCotainer="cCategory" > ...