Podpora modularizace obsahu (1)
Obsahem jsou nejčastěji články a předpokládá se, že správce obsahu je bude vytvářet a editovat především pomocí vizuálního editoru. Při tom může používat výstup formátování libovolných assetů. Toto formátování musí definovat správce prezentační logiky.
Správce obsahu může do těla článku zahrnout fragment, který se má dynamicky vygenerovat z jiného assetu. Při takovém výpisu se mohou použít libovolná data obsažená v assetu (nebo v assetech na něj navázaných, například data jeho rodičovského assetu).
Správce prezentační logiky může pro takové výpisy definovat jeden nebo několik různých způsobů formátování.
Definice možných režimů formátování
Definice možných režimů formátování je daná konfigurací nastavovanou pro články obsahující formátované assety.
Při vytváření této konfugurace je potřeba postupovat uvážlivě zejména v případech, kdy je reálná možnost, že se obsah bude sdílet mezi více prezentacemi. Povolit režim výpisu v těle článku pro určitý asset fakticky znamená, že každá prezentace, která tento asset bude používat, musí definovat tento režim ve svém formátovači – viz dále.
Nastavení formátovače
Pro formátování se nemusí nutně použít týž formátovač, jako pro ostatní výpisy assetů; a dokonce je lepší praxe používat samostatný formátovač, který případně může hlavní formátovač zavolat. Formátovač pro tělo článku se přiřazuje kořenové sekci prezentace jako hodnota vlastnosti articleFormatter
.
<jnp>
<wysiwyg>
<formatted-asset-modes>
<type id="com.etnetera.jnp.data.AclAwareAssetData">
<mode>link</mode>
</type>
</formatted-asset-modes>
</wysiwyg>
</jnp>
{_asset
mode=_mode
asset:formatter=_template.main_formatter}
{with ((_asset.data.length + 1023) div 1024)}
<span class="link-size"
title="Velikost souboru: {_} KB">
({_} KB)
</span>
{/with}
{with split(_asset.data.filename, ".")}
{if _.length}
{with toLowerCase(list(_, _.length - 1))}
{if (ico := _template.file_types[_])}
{<img src=ico
class="link-icon"
alt=_template.file_types["{_}_name"]
title=_template.file_types["{_}_name"]
/>}
{else}
{<img src=_template.file_types.file
class="link-icon"
alt=_template.file_types.file_name
title=_template.file_types.file_name
/>}
{/if}
{/with}
{/if}
{/with}
Řešený problém
Chceme ke každému odkazu na soubor vygenerovat automaticky ikonu a informaci o velikosti souboru.
Požadujeme, aby formátování bylo stejné jak v seznamech, které jsou generované automaticky (např. sekce se všemi soubory ke stažení), tak v případech, kdy odkaz na soubor vkládá autor obsahu do článku.
Postup
Zobrazení ikony v automaticky generovaných seznamech je poměrně snadná věc. Zvolíme nějaký název režimu (v tomto příkladu je to "link") a v hlavním formátovači prezentace se definuje pravidlo pro asset typu Soubor, ve kterém se vypisují údaje o blobu obsaženém v souboru.
Výpis ikony souboru může vypadat například takto:
Předpokládá se tu existence složky, která obsahuje ikony. Vazba na ikony není podle jména dětského assetu, ale podle jména vlastnosti této složky (je efektivnější, a navíc umožňuje použít jednu ikonu pro více přípon souborů). Zároveň má složka vlastnosti s pojmenováním jednotlivých typů; názvy vlastností mají suffix "_name".
Výpis informace o velikosti souboru by měl používat nějakou rozumnou jednotku; zde pro jednoduchost předpokládáme, že vždycky bude stačit zobrazovat velikost v KB:
Tento režim výpisu je pak třeba volat ve všech šablonách vypisujících odkazy na nějaké soubory.
Zpřístupnit tento režim výpisu pro použití v obsahu článků editovaném vizuálním editorem je pak jen otázka další konfigurace. Použije se možnosti vkládat do článků reference na formátované assety. Je potřeba:
- definovat, které typy assetů se mohou používat v takových referencích a jaké jsou povolené režimy výpisu;
- definovat formátovač, který se použije při výpisu pro nahrazení takových referencí.
První krok se týká obsahu, druhý jeho prezentace.
Pro obsah se musí do konfigurace složky, která takový obsah obsahuje, doplnit pravidlo povolující režim "link" pro assety příslušného typu:
Takový krok je potřeba podniknout s rozmyslem: vzniká jím kontrakt pro prezentační logiku všech prezentací, ve kterých se tento obsah může používat. Správce prezentační logiky každé takové prezentace musí definovat, který formátovač se použije pro takový výpis, a musí zaručit, že bude obsahovat pravidlo pro režim "link" každé takové položky.
Tento formátovač se nastavuje referencí articleFormatter
; nejlépe pro kořenovou sekci příslušné prezentace. V našem případě bychom mohli prostě použít hlavní formátovač. S ohledem na budoucí rozšiřování je ale vhodné tuto část prezentační logiky oddělit do samostatného assetu:
Z tohoto nového formátovače se bude hlavní formátovač volat:
Omezení
- Informace o typu se odvozuje z přípony souboru. Je to jednodušší, než používat typ blobu.
- Pokud se odkaz na soubor vkládá do těla článku, není možné nahradit titulek assetu se souborem vlastním názvem, který by se lišil článek od článku. Toto by bylo možné obejít použitím modulu, kdy by ale výsledný postup byl pro autora obsahu o něco málo komplikovanější.
Poznámky k různým verzím systému jNetPublish
Některé postupy použité v tomto příkladu jsou dostupné až od verze 3.5. V předchozích verzích je možné použít modul s assetem souboru jako parametrem.
Poznámky k verzi ke stažení
Tato verze se v několika bodech liší od předchozího popisu:
- V pravidlech formátovače nejsou zalomené řádky a jsou odstraněné přebytečné mezery. To proto, aby ve výstupu nevznikaly mezery tam, kde je autor obsahu mít nechtěl.
- Hlavní formátovač má další pravidla: pro typ Upoutávka (poradí si s běžným odkazem i s odkazem na soubor) a obecné pravidlo, kde lze předpokládat, že cílem je HTML dokument, o jehož velikosti není nic známo.