Speciální šablony sekcí
Možností přiřazovat speciální šablony vybraným sekcím je velké množství. Je ale užitečné držet se určitých konvencí, což mimo jiné přináší lepší podporu editačního rozhraní pro správce publikované struktury obsahu.
Způsob přiřazení speciální šablony
Podporu v uživatelském rozhraní má používání vlastností specialTemplate
a specialSectionTemplate
. Význam je daný následující konvencí:
specialTemplate
- Tato hodnota se použije v případě, že je definovaný _main asset.
specialSectionTemplate
- Tato hodnota se použije v případě, že není definovaný _main asset.
Hodnoty těchto dvou vlastností se tedy nikdy nemohou uplatnit současně. Není tedy třeba řešit jejich vzájemnou prioritu. Také není vhodné používat jednu z nich jako zástupnou hodnotu, pokud druhá chybí.
Vlastnost specialSectionTemplate
se nastavuje sekci. Konvence nestanovuje, zda se tato hodnota má uplatnit i pro podsekce sekce, u které je nastavená. Toto je žádoucí rozhodnout podle povahy prezentace, jejíž logika se takto definuje. Při získávání této hodnoty se pak podle toho použije akvizice s nulovou, nebo naopak neomezenou hloubkou.
Vlastnost specialTemplate
se může nastavit sekci (která pak bude hodnotou _primary), nebo také obsahovému assetu (potenciálnímu _main assetu). Konkrétní uplatnění obou možností ani způsob akvizice v obou případech opět konvence nijak nestanovuje.
Výběr z mnoha různých možností ilustrují následující příklady. Povšimněte si, že výsledek se pomocí příkazu block nastaví jako hodnota globální proměnné tak, aby s ní bylo možné dále všude pracovat. Toto nastavení je vhodné provést v hlavní šabloně prezentace.
{block
special=iif(
_main,
value(_main.specialTemplate, _primary.specialTemplate),
_primary.specialSectionTemplate
)
}
...
{/block}
{block
special=iif(
_main,
value(
acquire(_main, "specialTemplate", "p", "", 0),
acquire(_primary, "specialTemplate", "p", "", 0)
),
acquire(_primary, "specialSectionTemplate", "p", "", 0)
)
}
...
{/block}
Speciální šablona se nedědí; tak je tomu typicky tehdy, když chceme tento mechanismus využívat zejména pro různé rozcestníkové stránky, jejichž zobrazení je netypické, kdežto jejich podsekce se zobrazují obvyklým způsobem.
{block
special=iif(
_main,
value(_main.specialTemplate, _primary!specialTemplate),
_primary!specialSectionTemplate
)
}
...
{/block}
{block
special=iif(
_main,
value(
acquire(_main, "specialTemplate", "p", "", 0),
acquire(_primary, "specialTemplate", "p")
),
acquire(_primary, "specialSectionTemplate", "p")
)
}
...
{/block}
Toto je pravděpodobně nejtypičtější způsob použití: speciální šablony nastavené sekci se použijí i v podsekcích. Možnost přenastavit šablonu obsahovému assetu se používá spíše okrajově.
{block
special=iif(
_main,
value(_main!specialTemplate, _primary!specialTemplate),
_primary!specialSectionTemplate
)
}
...
{/block}
{block
special=iif(
_main,
value(
acquire(_main, "specialTemplate", "p"),
acquire(_primary, "specialTemplate", "p")
),
acquire(_primary, "specialSectionTemplate", "p")
)
}
...
{/block}
Příklad ilustruje situace, kdy je třeba dědit hodnotu speciální šablony i pro obsahový asset.
Typicky je tomu v případě, že jsou obsahové assety umístěné odděleně (ve složce content
; kdyby byly v publish
, je kód možné zjednodušit) a jejich úložiště je dále strukturované. Pak je možné jednotlivým skupinám obsahových assetů přiřazovat odlišné šablony pro zpracování.
V uvedeném příkladu se články ve složce o_spolecnosti
vypisují výchozím způsobem, kdežto jak články ve složce eshop
, tak články ve složce hr_portal
mají přiřazenou speciální šablonu.
Možnosti využití
Využít speciální šablonu je možné (ale nikoli nutné) všude tam, kde se volá formátování obsahového assetu. Speciální šablonu je totiž možné – podobně jako obsahový asset – pokládat za zdroj obsahu, ze kterého se skládá stránka. Zatímco v obsahovém assetu je ovšem tento obsah přítomný staticky, speciální šablona ho generuje dynamicky.
Vedle toho se může speciální šablona použít i na jiných místech, kde bude v podobném vztahu k výstupu generovanému hlavní šablonou.
Při vypisování každého z takových fragmentů se může speciální šablona zohlednit několika alternativními způsoby. Vždy je třeba rozhodnout:
- zda vůbec speciální šablona pro daný režim definuje nějaký výstup;
- zda má tento výstup úplně nahradit, nebo jen doplnit běžný výstup (tedy formátování _main nebo _primary v tomto režimu, případně výpis hlavní šablony v tomto režimu).
Očekávání ohledně výstupu speciální šablony
V šabloně, která volá speciální šablonu, můžeme zaujmout trojí postoj:
- Předpokládáme, že pokud je šablona definovaná, pak vždy výstup pro daný režim definuje.
- Každá jednotlivá speciální šablona si sama určí, zda výstup pro tento režim definuje.
- Výstup speciální šablony pro tento režim budeme ignorovat.
V prvním případě jednoduše zavoláme výpis speciální šablony v daném režimu.
{special mode="
název_režimu"}
Ve druhém případě musí mít autor každé speciální šablony možnost dát najevo příslušnou volbu. Vhodná konvence je předpokládat, že speciální šablona, která definuje výpis, má vlastnost nazvanou shodně s názvem režimu; cílem takové reference bude asset, který se má v tomto režimu vypsat; typicky speciální šablona sama.
{special.
název_režimumode="
název_režimu"}
Případný efektivnější (ale méně přehledný) zápis:
{acquire(special, "
název_režimu", "p", "", 0) mode="
název_režimu"}
Nahrazení nebo doplnění výchozího výstupu
Doplnění výchozího výstupu se dá předpokládat zejména u výpisu stylů nebo skriptů. Základní výpis stylů definuje hlavní šablona.
<link href="{target(_template, "print_css")}"
type="text/css" media="print" rel="stylesheet" />
<link href="{target(_template, "screen_css")}"
type="text/css" media="screen" rel="stylesheet" />
{_template mode="styles"}
{special.styles mode="styles"}
{_template mode="styles"}
{acquire(special, "styles", "p", "", 0) mode="styles"}
Původně obsahuje hlavní šablona fragment generující odkazy na styly přímo v základním režimu. Tento fragment je vhodné vydělit samostatně a vytvořit pro něj samostatné pravidlo: režim styles
.
Na jeho místě v základním režimu bude kód, který řeší jak vložení společných stylů, tak vložení stylů, které může vyžadovat speciální šablona. Povšimněte si, že v tomto případě necháváme na autorovi speciální šablony, zda tuto možnost využije.
Nahrazení výchozího výstupu se dá předpokládat u veškerých obsahových částí stránky. Zde se použije TFS funkce value.
{value(special, _main, _primary) mode="detail"}
Pro výpis obsahu už používáme funkci value. Stačí tedy přidat jako první alternativu samotnou speciální šablonu.
Použití speciální šablony jako modulu
Někdy může být vhodné použít speciální šablonu jako modul; hlavním omezením pro toto využití je, že nastavení tohoto modulu není možné jednoduše dědit pro podsekce.
Protože nastavování modulů je poměrně komplikovaná věc, tento výklad odložíme do příslušné kapitoly.
Nastavení pro uživatelské rozhraní
Aby mohl správce publikované struktury prezentace vybírat z definovaných speciálních šablon, je třeba podniknout určitá další nastavení; tato nastavení jsou v kompetenci programátora.