Výpis obsahu formátovačem

Prezentační logika bude typicky řízená v některých ohledech strukturou prezentace, v jiných ohledech typem zobrazovaného obsahu, bez ohledu na zařazení tohoto obsahu do prezentační struktury. Druhý požadavek řeší logika, kterou poskytuje formátovač.

Obsahový asset

Obsahy jednotlivých stránek jsou v systému jNetPublish – podobně jako v každém jiném CMS – vyděleny zvlášť, jako samostatné assety. Nejtypičtějším obsahovým assetem je text, jehož vnitřní strukturu není z pohledu prezentační logiky potřeba příliš dále rozebírat - v terminologii systému jNetPublish: Článek.

Systém jNetPublish umí jednotlivé obsahové assety adresovat v URL. Při výpisu stránky na takové URL je pak v každé šabloně dostupná proměnná _main, jejíž hodnotou je právě takový obsahový asset.

Proč formátovač

Pokud by prezentace byla tvořená výlučně obsahem článků, pak by bylo možné jejich výpis řešit přímo v hlavní šabloně. Tento případ ale nastává poměrně zřídka a prakticky nikdy nejde o trvalý stav. Prakticky vždy jsou definované obsahové assety dalších typů; výpis by pak bylo potřeba v hlavní šabloně komplikovaně větvit podle typu obsahu.

Toto větvení by bylo časté, a proto je oddělené do logiky assetu speciálního typu – Formátovače. Formátovač tvoří řada pravidel. Každé pravidlo se skládá z několika podmínek – z nichž nejdůležitější je typ assetu a režim – a k nim příslušného fragmentu TFS šablony.

Formátovač se volá prostým příkazem k vypsání assetu - tedy uvedením výrazu, jehož hodnotou je asset. V hlavní šabloně můžeme zavolat formátovač uvedením příkazu {_main}.

Při volání formátovače je vhodné vždy explicitně uvádět režim jako hodnotu parametru mode uvedeného příkazu:

{_main mode=”název režimu”}

Tímto způsobem se předá řízení výpisu formátovači. Formátovač vybere pravidlo odpovídající typu formátovaného assetu a požadovanému režimu a vypíše příslušný fragment TFS šablony.

Při výpisu tohoto fragmentu je definovaná proměnná _asset, jejíž hodnotou je aktuálně vypisovaný asset. Používání této proměnné dovoluje abstrahovat od toho, jakým způsobem dosavadní prezentační logika dospěla k tomu, který asset má být vypsán.

Místa použití obsahového assetu

HTML kód stránky, která má být zveřejňována, obsahuje několik míst, která se budou měnit spolu s aktuálním obsahem; jde typicky o tyto části:

  • Metainformace o stránce: obsah elementu title a obsah některých elementů meta.
  • Hlavní obsahová část stránky – nejčastěji nějaký text.

Pro další uvažování o těchto částech stránky je dobré každému z těchto míst přiřadit nějaké označení, kterého se pak budeme držet v různých kontextech. Můžeme například zvolit označení takto:

meta
Metainformace o stránce.
detail
Hlavní obsahová část stránky.

Tato označení v tuto chvíli použijeme jako jména režimů formátovače.

Pravidla formátovače

Definujeme ve formátovači pravidla pro výpis článku v režimu meta a detail, například takto:

Formátovač: režim meta, článek
<title>{_asset.title}</title>
<meta name="description" content="{_asset.perex}" />

Všimněte si, že vypisujeme jednotlivé hodnoty obsažené v assetu. Těmto hodnotám budeme říkat atributy. Každý atribut má svůj systémový název, který je možné zjistit v přehledu typů assetů. Výraz pro získání hodnoty atributu se provádí zápisem, kdy se za výraz, jehož hodnotou je asset, připojí tečka a systémový název atributu. Pokud tento celý výraz nemá další kontext (například volání nějaké funkce), hodnota se hned vypíše.

Formátovač: režim detail, článek
<h1>{_asset.title}</h1>
<p><strong>{_asset.perex}</strong></p>
<div>{_asset.body jnprefs=_asset}</div>

Modifikace atributů při výpisu

Všimněte si, že výpis těla článku má dodatečný parametr. Tento parametr musí mít jako hodnotu asset; prozatím si vystačíme s pravidlem, že jeho hodnotou by měl být právě ten asset, který tělo článku obsahuje. Efekty použití tohoto parametru jsou:

  • Znaky <, & a > při výpisu nebudou nahrazeny referencemi k entitám, ale budou ponechány tak, jak jsou. To proto, že v případě těla článku se předpokládá, že obsahuje fragment HTML dokumentu.
  • Budou se zpracovávat symbolické reprezentace odkazů a další konstrukty, které mohou v těle článku být obsažené.

Při výpisu je k dispozici ještě parametr raw (používá se bez hodnoty), který povede k tomu, že znaky <, & a > se při výpisu nebudou nahrazovat, ale reprezentace odkazů apod. se nezpracují.

V tuto chvíli je na místě upozornit, že používání nebo nepoužívání parametrů raw a jnprefs není libovolné - předpokládá zavedení velmi důležité konvence, zda hodnotou toho kterého atributu je HTML, nebo čistý text. Musí platit:

  • Jeden a týž atribut se vždy vypisuje stejně - není například možné vypisovat titulek assetu v jedné šabloně s raw a v jiné bez raw.
  • S modifikátorem jnprefs se vypisuje jen takový atribut, který má v editačním rozhraní podporu pro překládání odkazů (a ideálně také umožňuje editaci vizuálním editorem). Ve výchozím stavu (bez programátorských úprav) toto platí jen pro tělo článku.
  • Modifikátor raw předpokládá, že obsahem takto vypisovaného atributu je HTML bez odkazů aj. symbolických referencí. Měl by se používat pro atributy bez vizuálního editoru jen za předpokladu, že všichni autoři obsahu jsou s tím srozuměni a jsou schopní takový obsah korektně vytvářet.

O tom, jaký typ obsahu se očekává pro jaký atribut by měl být informován správce obsahu – tato informace by měla být součástí jeho manuálu.

Podmíněný výpis

Jazyk TFS má příkaz if, který slouží pro podmíněný výpis části šablony. Příklad užití tohoto příkazu ve formátovači:

Použití if
<h1>{_asset.title}</h1>
<p><strong>{_asset.perex}</strong></p>

{if _asset.perex and _asset.body}
  <hr />
{/if}

<div>{_asset.body jnprefs=_asset}</div>

Pokud se ve výpisu testuje nějaká hodnota a v případě, že je definovaná, se vypíše v nějakém kontextu, je vhodnější použít příkaz with. Příkaz funguje stejně jako if až na to, že výsledek vyhodnocení podmínky se nastaví jako hodnota proměnné _ (podtržítko). Dá se tedy použít v těle příkazu, aniž by se musel znovu počítat.

Použití with
<h1>{_asset.title}</h1>
{with _asset.perex}<p><strong>{_}</strong></p>{/with}
{with _asset.body}<div>{_ jnprefs=_asset}</div>{/with}

Explicitně stanovená a výchozí hodnota

Pro případy, kdy je třeba vypsat nějakou hodnotu, a pokud není definovaná, vypsat nějakou výchozí hodnotu („default“) je vhodné používat funkci value. Tato funkce může mít libovolný počet argumentů. Postupně je vyhodnocuje a vrátí první definovanou hodnotu. Jako její argumenty tedy uvádíme nejprve nejspecifičtější hodnoty (které pravděpodobně nemusejí být nastavené) a postupně stále obecnější (které budou nastavené s větší pravděpodobností). Na posledním místě může být konstata – výchozí hodnota.

Použití funkce value
<h1>{_asset.title}</h1>
{with value(_asset.perex, _asset.oneliner, _asset.shortDeck)}
  <p><strong>{_}</strong></p>
{/with}
<div>{_asset.body jnprefs=_asset}</div>

Volání formátovače z šablony

Když se vrátíme k našemu příkladu, v hlavní šabloně teď můžeme doplnit volání formátovače pro hlavní obsahový asset.

Základ výpisu hlavní šablonou
<html>
  <head>
    {_main mode="meta"}
    ...
  </head>
  <body>
    ...
      {_main mode="detail"}
    ...
  </body>
</html>

Když obsahový asset chybí

Ne každá URL musí pro systém jNetPublish identifikovat stránku, pro jejíž výpis je definovaný nějaký obsahový asset. V případech, kdy tento asset definovaný není, by zatím naše šablona vracela prázdné stránky.

Tyto stránky pokládáme za výpis úvodního (nebo výchozího, přehledového) obsahu sekce. Proto v těchto případech zavoláme v hlavní šabloně výpis aktuální (primární) sekce formátovačem. Asset primární sekce je hodnotou proměnné _primary, která je definovaná při výpisu každé stránky. Opět při tom použijeme funkci value.

Hlavní šablona, doplnění sekce
<html>
  <head>
    {value(_main, _primary) mode="meta"}
    ...
  </head>
  <body>
    ...
      {value(_main, _primary) mode="detail"}
    ...
  </body>
</html>

Musíme doplnit pravidla formátovače pro výpis sekcí v režimech meta a detail.

Úplně nejjednodušší formulace těchto pravidel je založená na konvenci, podle které můžeme každé sekci přiřadit úvodní (výchozí, přehledový) obsahový asset; tento asset musí být dětským assetem sekce a jeho systémový název má být index.

Tato konvence má svou oporu ve výchozím nastavení editačního rozhraní: Článek s názvem index se pokládá za doplněk rodičovské sekce. Editační rozhraní vede správce obsahu k vytváření doplňků, jejichž existenci systém předpokládá.

Další motivací pro tuto konvenci je skutečnost, že pokud některý správce obsahu bude omylem adresovat článek index, bude výsledná URL pro systém jNetPublish shodná s URL adresující korektně příslušnou sekci, což je žádoucí stav. Stejně tak nebude potřeba článek index zpracovávat zvlášť ve fulltextu.

Ve formátovači pak můžeme definovat obecné pravidlo, ve kterém je explicitně uvedený typ assetu Sekce, ale není explicitně uvedený režim.

Formátovač: režim *, sekce
{_primary.index}

Pravidlo znamená, že se má vypsat dětský asset sekce s názvem index. Protože příkaz pro výpis assetu neobsahuje explicitní specifikaci režimu, vypíše se tento asset v tom režimu, který byl požadován v příkazu, který vedl na vypsání sekce.

Toto obecné pravidlo je pak možné doplňovat specifičtějšími (například s explicitně uvedeným režimem). Důležitá podmínka je, aby v pořadí pravidel specifičtější pravidlo předcházelo před obecnějšími.

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