PageIdentification

Identifikátor stránky.

Identifikátor stránky je typ objektu, který (zjednodušeně řečeno) pro publikační rozhraní systému jNetPublish reprezentuje určitou URL adresu.

Interní struktura identifikátoru může zahrnovat mimo jiné několik assetů ve specifických rolích (například prezentace, primární sekce, obsahový asset), specifikaci požadovaného jazyka a formátu odpovědi a další informace.

Vnější reprezentací identifikátoru je URL, případně s parametry. V principu různá URL mohou reprezentovat týž identifikátor, ale ke každému URL patří nejvýše jeden identifikátor.

Každý aktuálně zpracovávaný požadavek v publikačním rozhraní obsahuje svůj identifikátor stránky. Kromě toho se identifikátor používá i pro odkazy obsažené v generované stránce.

Identifikátor aktuálně zpracovávaného požadavku rozhoduje o vykonávaném pageletu a nepřímo o volbě vypisované šablony; kromě toho se z něj do prostředí šablon přebírají hodnoty několika globálních proměnných: _site, _primary, _main, _format, _language. Od verze 3.4.2 je dostupný samotný identifikátor jako proměnná _pageId. Od verze 3.5 je dostupný identifikátor rozšířený o request parametry jako proměnná _pageIdWParams.

Identifikátory stránek, na které vedou odkazy v generované stránce, se vytvářejí jednak pomocí speciálních funkcí TFS (například link, xlink, target), jednak vznikají při překladu referencí na připojené odkazy assetů obsažených v těle vypisovaných článků. (Viz dokumentaci k parametru jnprefs.)

Základní klasifikace

Z pohledu autora šablony nebo autora obsahu je možné vystačit s klasifikací na tři typy identifikátorů:

Jednotlivé položky mají další podtypy, ale například vlastnosti identifikátorů, které lze číst v šabloně, jsou v rámci každé z těchto tří tříd shodné.

Poznámka: Při správě ortogonálních odkazů je také k dispozici volba nepřímý odkaz. Z pohledu autora šablon to ale není samostatný typ odkazu: ve výsledku by se měl každý nepřímý odkaz vyhodnotit jako jeden z předchozích typů a jako takový se objeví v TFS.

Výpis hodnoty

Při výpisu hodnoty probíhá převod na URL.

Příklad: Výpis odkazu na aktuální sekci a článek
Vstup
{let tgt := link(_primary, _main)}
<a href="{tgt}">{value(_main.title, _primary.title)}</a>
{/* ekvivalentně */}
<a href="{link(_primary, _main)}">{value(_main.title,
  _primary.title)}</a>

Parametry výpisu

Parametry příkazu pro výpis hodnoty se použijí jako dodatečné parametry URL.

Příklad: Doplnění parametrů
Vstup
<a href="{link(_primary, _main) a="b" c="d"}">
  {value(_main.title, _primary.title)}
</a>
Výstup
<a href="/jnp/cz/index.html?a=b&amp;c=d">
  Novinky
</a>

Výjimkou jsou parametry, jejichž název začíná řetězcem link: – některé mají dále definovaný speciální význam, ostatní jsou rezervované pro případné budoucí použití a při výpisu se úplně ignorují.

Přepsání parametrů výpisu

Pokud identifikátor stránky už obsahuje parametry (např. dětský odkaz), lze je přepsat parametry příkazu pro výpis hodnoty.

Příklad: Přepsání parametrů - funkce target()
Vstup
<a href="{target(_primary, "odkaz") a="x"}">
  {_primary.title}
</a>
Výstup
<a href="/jnp/cz/novinky/index.html?a=x&amp;c=d">
  Novinky
</a>

Dětský odkaz odkaz obsahuje parametry: a=b&c=d

Příklad: Přepsání parametrů - funkce linkTail()
Vstup
<a href="{linkTail(_pageId, _request.queryString) q="ADSL" page=2}">
  Hledat
</a>
Výstup
<a href="/jnp/cz/vyhledavani/index.html?q=ADSL&amp;page=2&amp;category=all">
  Hledat
</a>

_request.queryString obsahuje parametry: q=internet&page=1&category=all

Potlačení escapování

Při výpisu se defaultně provádí nahrazení znaků '<', '>', '&', '"' referencemi k entitám podobně jako při výpisu řetězců. Potlačení tohoto nahrazování je možné dosáhnout použitím parametru link:raw (buď bez hodnoty, nebo s hodnotou, která se vyhodnotí jako true).

Příklad: Výpis odkazu s potlačeným escapováním
Vstup
<script type="text/javascript"><![CDATA[
var linkTarget = '<? target(btn) link:raw ?>';
]]></script>

Výpis do WML

Existuje speciální verze parametru pro výpis identifikátoru stránky do WML: link:wml.

Přidání kotvy

V okamžiku výpisu je možné přidat k odkazu kotvu jako hodnotu parametru link:anchor.

Řetězec s parametry

Pokud je uvedený parametr výpisu link:parameters, předpokládá se, že je to řetězec, který se použije pro nastavení parametrů odkazu.

Verzování URL

V okamžiku výpisu lze výslednou URL verzovat: zajistit, aby se URL automaticky změnila pokaždé, když se změní obsah odkazovaného dokumentu.

Tímto způsobem lze značně vylepšit režim cachování odkazovaného dokumentu v prohlížeči: prohlížeč odkazovaný dokument načítá znovu ze serveru jen a právě tehdy, když se dokument změní. (V souvislosti s verzováním URL je pochopitelně třeba nastavit hlavičku Expires na dostatečně vzdálenou dobu.)

Různé verze URL, které se takto vytvářejí, se liší pouze přidaným parametrem URL, jehož hodnota je nějak svázaná s aktuálně platnou verzí dokumentu. Název parametru by měl být pochopitelně zvolený tak, aby neměl žádný vliv na výpis.

Autor šablony také má možnost ovlivnit volbu typu změny, která povede ke změně hodnoty parametru (a tedy URL). Aktuálně jsou tyto možnosti:

  • URL se mění v okamžiku, kdy se změnil jeden konkrétní asset.
  • URL se mění v okamžiku, kdy se změnil libovolný asset v celé databázi.

Lze použít tyto modifikátory výpisu:

link:version

Do vygenerovaného odkazu přidá speciální parametr vyjadřující verzi dat. Pokud není současně použit parametr link:version_asset nebo je jeho hodnota null, je to aktuální verze databáze, např. po publikaci – viz dále.

Pokud link:version nemá hodnotu, verze se přidá vždy. Pokud link:version má hodnotu, verze se přidá, pokud hodnota je true.

V případě, že je přítomný alespoň jeden z dalších modifikátorů a má hodnotu, není použití link:version nutné.

link:version_asset
Asset, na jehož změny je vázána změna URL. Hodnota parametru URL se tedy změní při každé změně tohoto assetu. Pokud je zadaný asset výčtový datový zdroj, pak se čas určuje jako maximum z času poslední změny jeho samotného a položek obsažených ve výčtu (platí od verze 3.6.12). Defaultně (asset není zadán, nebo je null) se použije poslední změna jakéhokoli assetu v aktuálním projektu.
link:version_param
String s názvem parametru URL, který se má přidat. Defaultní hodnota je "_linkv"; použije se, pokud je hodnota modifikátoru link:version_param prázdná nebo null.
Příklad: URL odkazu na CSS se mění se změnou libovolného assetu
Vstup
<link rel="stylesheet" type="text/css" media="screen"
  href="{target(_template, "screen") link:version}" />
Výstup
<link rel="stylesheet" type="text/css" media="screen"
  href="/static/3481-1-PUB/none/screen.css?_linkv=123456789" />

Předpokládáme, že aktuální šablona má nastavený odkaz s názvem "screen" a je to odkaz na styl generovaný šablonou. Protože ve stylu jsou odkazované obrázky, jejichž URL se může také měnit, není možné změnu verze svázat jen s jedním konkrétním assetem.

Svázání změn s jedním konkrétním assetem vede obecně k menšímu počtu verzí a tedy ke snížení zátěže serveru. Může tu ale být riziko, že se odkazovaný dokument změní, aniž by se změnil zvolený asset.

Příklad: URL odkazu na CSS se mění se změnou šablony CSS
Vstup
<link rel="stylesheet" type="text/css" media="screen"
  href="{link(_template.secCss, _template.cssTpl, "css", "none")
  link:version_asset=_template.cssTpl}" />

V tomto případě se verzování váže na změny assetu připojeného k šabloně referencí s názvem "cssTpl". Pokud styl nepoužívá reference na žádné další assety, je toto zcela bezpečný postup. V opačném případě je třeba pokládat ho za aproximaci ideálního chování.

Absolutní a relativní URL

Převod na URL v okamžiku výpisu (a také převod pomocí funkce asString) vede na vytvoření relativního nebo absolutního URL. Volba typu URL se děje podle takových pravidel, aby bylo vždy jisté, že výsledný odkaz bude ve svém kontextu interpretovaný korektně; obecně proto není nikdy garantováno, že generované URL bude relativní. Lze však dosáhnout garantovaného generování absolutního URL pomocí volby options.

Příklad: Výpis absolutního odkazu
Vstup
{options forceAbsoluteAddresses=1}
<link rel="self" href="{link(_primary, _main)}" />
{/options}
Příklad: Předání absolutního URL v parametru
Vstup
{options forceAbsoluteAddresses=1}
{let thisPage := asString(_pageId)}
{/options}

Pro vstup do této sekce je vyžadováno
<a href="{target(login) returnTo=thisPage}">přihlášení</a>.

Příklad spoléhá na proměnnou _pageId, která není dostupná před verzí 3.4.2. Ve starších verzích je tedy nutné použít nějakou aproximaci, například link(_primary, _main).

Konkrétní tvar URL je popsaný u jednotlivých podtypů.

Selekce podhodnoty

V šabloně je vždy dostupná vlastnost addressKind, jejíž hodnota určuje typ identifikátoru. Hodnotou této vlastnosti je číslo; všechny možnosti definuje rozhraní com.etnetera.jnp.publish.PageIdentification (od verze Vetis, dříve com.etnetera.publish.PageIdentification), proto doporučený postup testování předpokládá import této třídy do šablony. Pak jsou k dispozici symbolická označení jednotlivých typů:

TypHodnotaVýznam
AK_NORMAL 1 běžný interní odkaz systému jNetPublish
AK_PREVIEW 2 odkaz pro náhled a insite editaci
AK_STATIC 3 odkaz na statickou stránku
AK_INCOMPLETE 4 nekompletní odkaz - interní odkaz, kterému chybí některá povinná informace.
AK_REDIRECT 5 v nových verzích systému jNetPublish se již nepoužívá
AK_UNSTABLE 6 nestabilní odkaz na soubor.
AK_FILE 7 stabilní odkaz na soubor.
AK_EXTERNAL 8 externí odkaz

Hodnota AK_INCOMPLETE by se neměla v prostředí šablony vyskytnout: Interně se používá v systému jNetPublish po dobu, kdy nejsou známy všechny povinné složky.

V naší méně podrobné klasifikaci jsou:

  • AK_NORMAL, AK_PREVIEW a AK_STATIC interní odkazy,
  • AK_UNSTABLE a AK_FILE odkazy na soubor,
  • AK_EXTERNAL externí odkaz.

Testování vlastnosti addressKind se hodí zejména v případech, kdy vypisujeme odkaz, jehož typ vybírá klient.

Příklad: Odlišení odkazů na soubory ve výpisu
Vstup
{import com.etnetera.jnp.publish.PageIdentification}

{let tgt := target(_asset, "target")}
<a href="{tgt}">
  {if or(tgt.addressKind == PageIdentification.AK_UNSTABLE,
		 tgt.addressKind == PageIdentification.AK_FILE)}
	stáhnout
  {else}
	více
  {/if}
</a>

Samotný příkaz import má odlišnou syntax v různých verzích; toto je zápis pro verzi 3.4 a novější.

Nutnost importu je možné obejít pomocí přístupu ke statickým hodnotám třídy objektu.

Další existující podhodnoty závisejí na podtypu identifikátoru. Jsou proto zdokumentovány na příslušných místech:

Mapování

Probíhá stejně jako selekce podhodnoty.

Sekvenční zpracování

Chová se jako prázdná sekvence.

Převod na logickou hodnotu

V podmínce se jakýkoli identifikátor stránky vyhodnotí jako true.

Lze tak tedy například testovat, zda asset má ortogonální odkaz daného jména pro aktuální jazyk, segment a prezentaci.

Příklad: Test výskytu dětského odkazu
Vstup
{let tgt := target(_asset, "more")}
{if tgt}
  <a href="{tgt}">další informace</a>
{/if}

Pozor: Když odkaz existuje, ale není možné ho korektně doplnit (například má primární sekci, která nepatří k zadané prezentaci), vrátí funkce target do šablony chybový objekt, jehož konverze na boolean zatím není ošetřena.

Pro vložení příspěvku do diskuse se přihlašte.