Pole typu <Reference>
slouží k vytvoření vazby na prvek kolekce. Používá se zpravidla tehdy, když potřebujeme vybrat jednu hodnotu z předem určeného seznamu možností. Například článek na blogu chceme přiřadit do jedné z definovaných rubrik. Odkazovaná kolekce v takovém případě obsahuje seznam rubrik.
<Reference name="someRef" sourceCol="someCol" />
Pole typu Reference
je v administračním rozhraní zobrazeno jako formulářový prvek select
– uživatel tedy může vybrat maximálně jednu možnost (pro výběr více možností slouží pole typu <ReferenceCollection>
). V .aspx se pole typu <Reference>
chová jako prvek kolekce, na který odkazuje.
Pomocí pole typu <Reference>
lze také filtrovat prvky kolekce při jejich výpisu do stránky pomocí controlu <je:repeater>
, viz atribut restrictField
controlu <je:repeater>
.
Atributy
allowEditFor nepovinný [seznam skupin uživatelů]
Skupiny uživatelů, kterým je pole přístupné k editaci. Pokud není atribut zadán, je pole přístupné k editace všem, kteří mají přístup do administrace. Více v článku Zabezpečení před neoprávněným přístupem do administrace.
denyEditFor nepovinný [seznam skupin uživatelů]
Skupiny uživatelů, kterým je pole znepřístupněné k editaci. Pokud není atribut zadán, je pole přístupné k editace všem, kteří mají přístup do administrace. Více v článku Zabezpečení před neoprávněným přístupem do administrace.
desc nepovinný [string]
Uživatelský popis pole, který se zobrazí v administračním rozhraní. Slouží k zapsání doplňujících údajů, jako například pokyny pro editora apod.
itemFormat nepovinný
Určuje, jakým způsobem jsou jednotlivé položky zdrojové kolekce zobrazeny v administračním rozhraní. Více o
itemFormat
viz Zobrazení prvků kolekcí v administračním rozhraní.name povinný [string]
Jméno pole. V rámci jednoho typu musí být jedinečné. Smí obsahovat pouze číslice a písmena bez diakritiky. Doporučuje se jména polí uvádět s počátečním malým písmenem (viz Konvence pojmenování).
required nepovinný [false, true]
Při nastavení na true se pole stane povinným a při editaci v administraci je nutné zvolit hodnotu. V opačném případě lze referenci ponechat prázdnou.
sourceCol povinný [kolekce]
Absolutní nebo relativní cesta ke kolekci, z jejíchž prvků bude vybírán odkazovaný prvek. Způsoby zadávání absolutních i relativních cest ilustrují příklady uvedené níže.
title nepovinný [string]
Uživatelský název pole, který se zobrazí v administračním rozhraní. Není-li
title
uvedeno, zobrazí sename
.
Referenční integrita
JellyPot u polí typu <Reference>
nezajišťuje referenční integritu. Libovolný prvek z odkazované kolekce lze smazat, i když je odkazován některým polem typu Reference
. V takovém případě se pole typu Reference
chová, jako by neobsahovalo odkaz na žádný prvek, a to i v případě, že je deklarováno jako povinné (required="true"
). V .aspx souborech není zpravidla nutné toto chování nijak ošetřovat: pokud odkazovaný prvek není určen nebo neexistuje, nic se zkrátka nevypíše. V případě potřeby můžeme k rozlišení neexistence odkazu na prvek použít control <je:if>
.
Příklady
Máme jednoduchý blog. Chceme, aby každý článek měl přiřazenu právě jednu rubriku. V Site.config tedy deklarujeme potřebné typy a proměnné:
<Vars> <Collection name="blogPostCol" itemType="BlogPostItem" /> <Collection name="blogPostCategoryCol" itemType="BlogPostCategoryItem" /> </Vars> <Types> <Type name="BlogPostItem"> <SimpleText name="title" /> <Text name="text" /> <Reference name="category" sourceCol="blogPostCategoryCol" /> </Type> <Type name="BlogPostCategoryItem" /> <SimpleText name="title" /> </Type> </Types>
Typ BlogPostItem
představuje článek blogu, typ BlogPostCategoryItem
pak jednotlivou rubriku.
Odkaz na zdrojovou kolekci rubrik blogPostCategoryCol
jsme v poli typu Reference
uvedli absolutně (tj. „bez tečky na začátku“) – jinak to ani nešlo, protože kolekce je samostatná proměnná deklarovaná v sekci <Vars>
.
Odkazy je ale možné uvádět i relativně (tj. „s tečkou na začátku“). Kdy by se to mohlo hodit? Třeba bychom chtěli zavést obalující typ Blog
, který by obsahoval kolekci článků a kolekci rubrik. Site.config by pak vypadal třeba takto:
... <Vars> <Var name="blog" type="Blog" /> </Vars> <Types> <Type name="Blog"> <Collection name="blogPostCol" itemType="BlogPostItem" /> <Collection name="blogPostCategoryCol" itemType="BlogPostCategoryItem" /> </Type> <Type name="BlogPostItem"> <SimpleText name="title" /> <Text name="text" /> <Reference name="category" sourceCol=".parent.blogPostCategoryCol" /> </Type> <Type name="BlogPostCategoryItem" /> <SimpleText name="title" /> </Type> </Types> ...
Tento přístup se nám může hodit u rozsáhlejších webů, kde nám pomůže udržet spolu související věci pěkně pohromadě.
Výpis jednoho článku v .aspx by pak v obou případech vypadal nějak takto:
... <je:item runat="server" field=".title" tag="h1" /> <je:item runat="server" field=".category.title" /> <je:item runat="server" field=".text" /> ...