Výzva - šablonový systém

Pomalu se dostáváme do finální části, kdy již máme vše připraveno a stačí nám jednotlivé produkty (knihy) vypublikovat na web.

XSL jako šablona - zavrženo

Jak jsem se již zmínil v prvních krocích, kdy jsem vytvářel doménové objekty a ty naplnil vstupními daty, xsl pro prezentaci dat bylo zavrženo. Přitom by se dalo říct, že jako šablonový systém, kdy na vstupní straně je xml, je toto řešení přímo ideální a též jsem jej v první chvíli doporučoval.

Jenže jak se říká, zákazník je náš pán a já jsem si svoji práci nechtěl ulehčit tím, že bych xsl použil. Přitom jsem chtěl nabídnout takové možnosti, aby bylo jednoduché vkládat statické texty okolo dynamických polí a to vše s možností plně ovlivnit výstupní HTML.

Chvíli jsem nad tím přemýšlel a uvažoval jsem jak něco tak jednoduchého zabezpečit, když v tom mě to napadlo, jednu takovou věc již používám a její implementace nebude náročná. Stejně tak věřím, že by nebylo náročné pro zkušenějšího uživatele znalého HTML syntaxe naučit se i těch několik málo příkazů. Navíc se tím vyvaruji i dalšího strašáka a to je použití PHP, které bylo taktéž zavrženo.

NVelocity

Přesně tak, onou spásnou knihovnou se stala NVelocity a to po úpravách z projektu Castle. Domnívám se totiž, že je to velice jednoduše uchopitelný šablonovací systém, přesně splňující základní potřeby pro publikaci potřebných informací a v případě potřeby též snadno rozšiřitelný.

Jelikož mám tuto knihovnu použitou například na tomto webu, kde si pomocí ní generuji emailové notifikace, nebyl problém ji vzít a použít i v tomto systému.

Právě z tohoto důvodu jsem se také v prvních krocích ujal vytvářet doménový model, protože objekty a především jejich vlastnosti jsou základním předpokladem a pomocí nich se zobrazují získaná data.

Jak tedy potom vypadá vygenerování výstupu z takové šablony je vidět na ukázce níže:

IPathLocatorService pathLocatorService = new DesktopPathLocatorService();
ITemplateProcessor templateProcessor = new NVelocityTemplateProcessor(pathLocatorService);
Hashtable data = new Hashtable();
data["book"] = book;
post.description = templateProcessor.RenderView("description", data);

kdy právě instance třídy Book je předána jako parametr s názvem book do transformační metody a za pomocí definice šablony je vytvořen na výstupu HTML kód.

Šablona

Definování šablony je potom již otázkou vkusu a zručnosti. V mém případě tedy otázkou trošku delší, ale věřím, že pro schopného html kodéra by tato práce nebyla vůbec těžká. Já se rozhodl pro jednoduchý výpis informací a v případě generování description jsem použil následující:

<div class="book">
    <h4>Authors:</h4>
    <ul>
#foreach ($author in $book.Authors)
    <li>$author.FullName</li>
#end
    </ul>
    <dl class="metainfo">
        <dt>ISBN</dt>
        <dd>$book.ISBN</dd>
        <dt>Pages</dt>
        <dd>$book.NumberOfPages</dd>
        <dt>Publication date</dt>
        <dd>$book.PublicationDate.ToString("dd.MM.yyyy")</dd>
    </dl>
</div>

Samozřejmě není nutné, aby výstupem transformace byl HTML kód, ale v tomto případě je to očekávané.

Jak by to probíhalo

Zde již opět přichází na řadu součinnost s případným zadavatelem zakázky. Záleží na tom, zda by měl již připravené HTML šablony, do kterých by se umisťovali jednotlivé atributy nebo by si šablony chtěl tvořit sám. V případě prvním bych nejspíše zasedl a začal jednu šablonu za druhou přepisovat a doplňovat řídící značky. V případě druhém by potom došlo k vysvětlení významu jednotlivých řídících značek a popsání doménového modelu.

Časový odhad

Vzhledem k tomu, že jsem měl připraveno a zaobaleno volání NVelocity v samostatné assembly bylo napojení do systému velice rychlé. Určitě delší čas jsem strávil nad tím, jak vhodně vygenerovat výstup a jaké informace zobrazit a předat do kterého vstupního pole třídy Post - viz napojení na WordPress pomocí XML-RPC. Celkový čas pro tento krok tedy byl 40 minut. Zde musím upozornit, že v případě předání šablon pro Petru by především definice šablon a jejich úprava mohla zabrat nepoměrně delší dobu.

1 Comment

  • Michal said

    NVelocity jsem jako šablonový systém taky použil. Dokonce ve stejném kontextu jako ty (pro generování mailů). NVelocity má ale spoustu chyb a tak z Castle používám Brail jako šablonový systém.

    Jinak, obojí jsou pro nováčka tvůrce šablon určitě přehlednější, než XSL :-)

Add a Comment