Akvizice dat ve stromu assetů
Asset může obsahovat data vázaná k němu různým způsobem: jako atributy, jako vlastnosti nebo jako dětské assety. V šabloně je možné přistupovat k datům assetu nebo k datům jeho rodičovských assetů.
Viděli jsme, že nejjednodušší způsob získání hodnoty obsažené pod nějakým klíčem v assetu (“podhodnoty” assetu) je použití tečky mezi referencí k assetu a požadovaným klíčem. Tak jsme přistupovali k hodnotám atributů assetu, k hodnotám jeho vlastností, ale také k jeho dětským assetům podle jména:
_template.print_css
_asset.title
_primary.index
Jazykově specifická akvizice
Pokud snaha o nalezení vlastnosti, atributu nebo dětského assetu se zadaným názvem nevede k cíli, použije se při dohledání hodnoty ještě alternativní název rozšířený o sufix tvořený podtržítkem a dvoupísmenným kódem aktuálního jazyka.
Skrytě se tato vlastnost uplatňuje u atributů assetů, pokud jsou v daném systému assety vícejazyčné: Asset má místo atributu s názvem title dva atributy: title_cz
a title_en
. Autor šablony ale používá například ve formátovači běžný zápis {_asset.title}
. Ve výpisu se použije jeden z atributů podle aktuálního jazyka.
Kromě toho je možné s využitím této vlastnosti akvizice definovat dvě verze hodnoty vlastnosti, pro každý jazyk jinou. Tato možnost by se ale už měla používat spíše omezeně, protože existují obecnější postupy použitelné při tvorbě vícejazyčných prezentací:
- Cíle odkazů assetu mohou být odlišené nastavenými podmínkami; možné podmínky mimo jiné zahrnují jazyk.
- Pro lokalizaci (překládání řetězců) slouží překladové mapy šablon a formátovačů nebo samostatné Složky slovníků ve spojení s funkcí xlat nebo příslušným operátorem.
Získání hodnoty od rodičovských assetů
Operátor tečka vede k získání podhodnoty u příslušného assetu. Pokud hodnota není nalezena, je výsledkem celé operace hodnota null
.
Akvizice se však na tom nemusí zastavit. Je možné hledat hodnotu u rodiče assetu, a pokud tam není tato hodnota nalezena, také u vzdálenějších předků assetu.
Pokud se hodnota hledá jen u samotného assetu, mluvíme o akvizici s nulovou hloubkou, nebo prostě o selekci. Obdobně v případě, že hledání pokračuje u rodičovského assetu, je to akvizice s hloubkou 1 atd. Pokud má hledání hodnoty pokračovat k libovolně vzdálenému předku assetu, mluvíme o akvizici s neomezenou hloubkou nebo prostě o akvizici (v užším smyslu slova).
Pro zápis akvizice s neomezenou hloubkou se používá místo tečky vykřičník.
{_asset!title}
{acquire(_asset, "title")}
Oba uvedené zápisy jsou ekvivalentní.
Použití 1: Dědění hodnoty
Zdaleka nejčastěji se používá akvizice pro případy, kdy chceme správci publikované struktury prezentace umožnit nastavovat nějakou vlastnost sekce tak, aby se její nastavení dědilo do všech podsekcí.
V takovém případě prostě přijmeme konvenci, že všechna čtení této hodnoty v šablonách budou spoléhat na akvizici s neomezenou hloubkou. (Toto je obecně obtížně udržitelný požadavek, v ideálním případě by se proto taková hodnota měla číst jen na jednom jediném místě v jedné jediné šabloně.)
...
<body class="{value(_primary!theme, "blue")}">
...
Každé schéma barev je obyčejně definované ve stylu prezentace tak, aby stačilo nastavit elementu body vhodnou třídu.
Správci publikované struktury prezentace umožníme tuto třídu nastavovat tak, aby mu stačilo přiřadit sekci vlastnost theme
.
V šabloně tuto vlastnost čteme způsobem, který ve výsledku znamená, že:
- Nastavení schématu barev se dědí (
_primary!theme)
. - Pokud je explicitně nastavené schéma barev sekci na nižší úrovni, dostane přednost před nastavením na vyšší úrovni. (To znamená, že specifické nastavení má – zcela podle očekávání – přednost před obecným.)
- Pokud sekce ani žádná z jejích nadsekcí nemá nastavené schéma barev, použije se schéma
blue
– toto je důsledek aplikace funkce value.
Při uvedené struktuře mají sekce Mikrovlnky, Mixéry, Pračky výchozí schéma barev (blue
). Sekce Žehličky má schéma green
a toto nastavení od ní dědí i sekce Bosch a Eta. Sekce Philips toto nastavení ruší a vrací se ke schématu blue
.
Použití 2: Hromadné nastavení hodnoty
Předpokládejme, že je obsah prezentace rozdělený do složek. Dále předpokládejme, že je potřeba všem assetům v určité složce nastavit shodnou hodnotu.
Pak se hodnota nastavuje jako vlastnost složky obsahující assety; při jejím čtení v šabloně se opět použije akvizice s neomezenou hloubkou.
<h1>{_asset.title}</h1>
<div>{_asset.body jnprefs=_asset}</div>
{with _asset!responsible}<p>Za správnost odpovídá: {_}</p>{/with}
Obsahovým složkám se nastavuje vlastnost responsible
, jejíž hodnotou je jméno zodpovědné osoby nebo oddělení.
Tuto hodnotu pak načítáme při výpisu jednotlivých článků ve složkách obsažených.
Pokud hodnotu najdeme, vypíšeme odstavec informující o zodpovědnosti, pokud hodnota nastavená není, nevypisuje se nic. Toto je efekt použití příkazu with.
Při uvedené struktuře budou mít články Katalog a Nákupní řád v patičce text „Za správnost odpovídá: Oddělení internetového obchodu“ atd.
Použití 3: Nastavení pevného bodu
Někdy potřebujeme, aby určitý podstrom sekcí nebo složek fungoval v prezentační logice jako autonomní jednotka. Obyčejně to znamená, že je v šabloně vždy třeba mít přístup ke kořenovému prvku tohoto podstromu.
Postupujeme tak, že nastavíme u kořenového prvku stromu vlastnost typu reference, jejímž cílem bude kořenový prvek sám. Při výpisu obyčejně máme k dispozici některý prvek tohoto podstromu (například víme, že hodnota _primary je jeho prvkem); ke kořenovému prvku můžeme opět přistupovat neomezenou akvizicí hodnoty zvolené hodnoty.
{with _primary!subtree_root_section}
<a href="{link(_)}" title="{_.title}">zpět do sekce</a>
{/with}
Chceme u vybraných sekcí vypisovat odkaz zpět tak, aby vedl na některou z nadsekcí aktuální sekce. Přitom nemá být žádné omezení na hloubku zanoření v takové sekci. Takové „hlavní“ sekce vyznačíme ve stromu sekcí vlastností subtree_root_section
, kde cílem reference je sekce sama.
Při formátování článků jako je Marketing Specialist se bude dohledávat nejbližší pevný bod nad aktuální sekcí; odkaz na tuto sekci se vypíše jako odkaz zpět do hlavní sekce.
Tento postup se může uplatnit zejména v různých speciálních šablonách sekcí, o kterých bude řeč později.
Upřesnění pravidel a zefektivnění akvizice
Popsané možnosti dvou operátorů často zdaleka nestačí pro dostatečně přesný popis toho, jak akvizice má probíhat. Velmi často například budeme chtít akvizici omezit jen na vlastnosti (a vyloučit z ní atributy a zejména dětské assety). Jindy můžeme požadovat akvizici s nenulovou, ale omezenou hloubkou (například jen na přímého rodiče). K tomu všemu je určena funkce acquire.
Ve stávající implementaci může v krajních případech akvizice (zejména u dohledávání dětských assetů podle jména) snižovat efektivitu vypisování stránky. Je dobré na to myslet předem a omezit akvizici vhodným způsobem. Pro ilustraci: v posledních třech příkladech na této stránce by bylo vhodné nahradit operátor ! zápisem:
acquire(
asset,
vlastnost, "p")