<je:repeater>

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" nebo order="published desc" (předpokládá se, že pole titlepublished 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 atribut restrictContainer 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 atributu restrictContainer). 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 šablona rowSeparator (a emptyItem) 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, obsah header 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, obsah footer 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íše noContent, 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 definice item[2-10]n pro některý prvek mezi sebou (například 4. prvek pro item2nitem4n), 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é template moreSeparator (tedy je v controlu <je:repeater> zadán atribut moreCount a definován template moreSeparator). 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 nebo rowSeparator, je na jejich místě u této konkrétní položky vypsán pouze moreSeparator. Pokud <je:repeater> vypíše stejný počet položek, jako je určený atributem moreCount, template moreSeparator 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, kde n je přirozené číslo. Je-li vypsán obsah rowSeparator template, nevypíše se obsah separator 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]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 item3lastItem4), 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"
    >
        ...

Připomínky a postřehy

Máte-li nějakou připomínku, dobrý nápad nebo jste našli v dokumentaci chybu, rádi od vás uslyšíme.