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.

Příklad: Speciální šablona - nedědění hodnoty
Přehlednější zápis
{block 
  special=iif(
    _main,
    value(_main.specialTemplate, _primary.specialTemplate),
    _primary.specialSectionTemplate
  )
}
  ...
{/block}
Efektivnější zápis
{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.

Příklad: Speciální šablona - dědění hodnoty jen pro sekci
Přehlednější zápis
{block 
  special=iif(
    _main,
    value(_main.specialTemplate, _primary!specialTemplate),
    _primary!specialSectionTemplate
  )
}
  ...
{/block}
Efektivnější zápis
{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ě.

Příklad: Speciální šablona - dědění hodnoty pro obsahový asset
Přehlednější zápis
{block 
  special=iif(
    _main,
    value(_main!specialTemplate, _primary!specialTemplate),
    _primary!specialSectionTemplate
  )
}
  ...
{/block}
Efektivnější zápis
{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žimu mode="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.

Příklad: Hlavní šablona povoluje rozšířit styl ve speciální šabloně
Původní fragment hlavní šablony
<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" />
Nový fragment hlavní šablony
{_template mode="styles"}
{special.styles mode="styles"}
Efektivnější zápis
{_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.

Příklad: Hlavní šablona povoluje nahradit výpis obsahu speciální šablonou
Modifikace kódu v hlavní šabloně
{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.

Stránky tutoriálu:
Pro vložení příspěvku do diskuse se přihlašte.