Perl (95) - Catalyst - šablony

Perl Blíže se seznámíme s několika různými syntaxemi, které lze používat v šablonách.

28.12.2009 01:00 | Jiří Václavík | přečteno 11455×

Podívejme se ještě jednou na soubor root/hello.tt, který jsme vytvořili v minulém dílu. Nazvali jsme ho šablonou, ale zatím obsahoval jen čistý HTML kód.

Ve skutečnosti může šablona vypadat takřka jakkoliv, protože si sami můžeme zvolit pravidla pro to, jak bude fungovat. O těchto pravidlech rozhoduje pomocný modul, kterým se daný View řídí.

My jsme použili v aplikaci Hello pomocný modul Template Toolkit (přesněji šlo o Catalyst::View::TT) a proto se primárně podíváme na tuto syntaxi. V tomto konkrétním případě platí, že šablona obsahuje speciální bloky kódu, které se před odesláním klientovi vyhodnotí a vygenerují místo sebe nějaký další HTML kód. Bloky jsou ohraničené závorkami [% ... %].

Zůstaňme ještě chvíli u Template Toolkit a představme si nejdůležitější syntaxi uvnitř speciálních bloků.

Vložení kódu

Nejjednodušší je vložení nějakých dat zvenku dovnitř šablony. K tomu používáme zápis buď [% text %] nebo [% text | html %]. Lze si to představovat tak, že text je proměnná, za kterou se dosadí její aktuální obsah. Zadáme-li modifikátor html sloužící pro filtrování výstupu, budou HTML znaky se speciálním významem překonvertovány na jejich zástupce uvozené ampérsandem.

Naši šablonu můžeme upravit například takto.

<html>

<head><title>Toto je první stránka v Catalystu</title></head>

<body>
<h1>Ahoj světe!</h1>
<p>Tady je něco napsáno: [% neco | html %]</p>
</body>

</html>

Tato data dodáme do výsledné podoby stránky v naší metodě hello. Využijeme opět objekt $c a pomocí stash přiřadíme našemu neco hodnotu. Procedura hello v našem Controlleru se změní do následující podoby.

sub hello : Global {
    my ($self, $c) = @_;
    $c->stash->{template} = "hello.tt";
    $c->stash->{neco} = "toto jsou data získaná někde venku";
}

Nyní ve výsledné stránce uvidíme tento nový text.

Stránka vytvořená pomocí šablony

Další konstrukce v šabloně

Podívejme se ještě na složitější konstrukce, které můžeme použít uvnitř bloku [% ... %]. Lze používat nejběžnější řídící struktury jako IF, WHILE, FOREACH a podobně. Zde můžeme vidět příklad struktury IF, která ošetřuje, zda je neco definováno.

[% IF neco %]
   <p>[% neco %]</p>
[% END %]

Dále bývá velmi užitečné použití FOREACH. Syntaxe je zde intuitivní. Konstrukce tohoto typu se používají při spolupráci s databází. S dolováním dat z databáze pomocí Catalystu se ještě později setkáme.

[% FOREACH polozka IN zbozi -%]
  <tr>
    <td>[% polozka.id %]</td>
    <td>[% polozka.nazev %]</td>
    <td>[% polozka.cena %]</td>
  </tr>
[% END -%]

Komentář, který nebude vidět ve výsledném zdrojovém kódu pro HTML stránku můžeme napsat pomocí mřížky.

[% #toto je komentář %]

Pomocí META lze nastavit například titulek

[% META title = "titulek" -%]

Chceme-li vložit do šablony jinou šablonu, použijeme příkaz INCLUDE. Příkladem může být vkládání HTML hlavičky.

[% INCLUDE hlavicka titulek="Moje WWW" %]

V souboru hlavicka.tt pak může být tento obsah.

<html>
<head><title>[% titulek %]</title></head>
<body>

Zpracování argumentů

Upravíme-li podprogram hello vhodným způsobem, budeme moci pracovat s argumenty. Ale co to vlastně argumentu v Catalyst aplikaci jsou?

Argumenty jsou součástí URL adresy a zadávají se tak, že vypadají jako jména adresářů. Jsou oddělené lomítky a uživatel vůbec nepozná, že jde o argumenty. Voláme-li například URL http://localhost:3000/hello/arg1/arg2/arg3, ve skutečnosti se provádí naše procedura hello a té jsou předány navíc tři argumenty arg1, arg2, arg3. Catalyst je v tomto směru inteligentní, takže si poradí s různými cestami a atributy. Samozřejmě je třeba si dát o to větší pozor na kolize.

Modifikujme náš podprogram hello tak, abychom předali do šablony argumenty.

sub hello : Global {
    my ($self, $c, @args) = @_;
    $c->stash->{template} = "hello.tt";
    $c->stash->{neco}     = "@args";
}

Připomeňme, že proměnná typu pole se do řetězce implicitně konvertuje tak, že se rozdělí na prvky oddělené mezerami. Šabloně tedy posíláme řetězec "arg1 arg2 arg3".

TTSite

View typu TTSite vytváří přednastavenou šablonu webu, obsahující hlavičky, patičky, CSS styly apod., kterou lze později různými způsoby konfigurovat. View TTSite vytvoříme standardně následujícím příkazem.

$ catalyst.pl Site
$ cd Site
$ perl script/site_create.pl view TT TTSite

Struktura adresáře root se nyní při použití TTSite lehce liší. root obsahuje tři podadresáře.

Jako ukázku TTSite vytvoříme opět jen úvodní stránku. Nejprve tedy založíme šablonu v souboru root/src/index.tt2.

[% META title = "Toto je vytvoreno pomoci TTSite" %]
<h1>Nadpis</h1>
<p>text</p>

Nyní ještě zeditujeme soubor lib/Site/View/TT.pm. Nakonfigurujeme příponu šablon na .tt2 tak, že k argumentům metody config přidáme řádek TEMPLATE_EXTENSION=>".tt2".

Dále vložíme metodu sub index : Private {} do Controlleru lib/Site/Controller/Root.pm. To je vše, co je potřeba k vytvoření jednoduché stránky. Spustíme-li server, uvidíme v prohlížeči následující stránku.

Ukázka View typu Catalyst::View::TTSite

Kdybychom chtěli vzhled aplikace upravit, můžeme zabrousit do adresáře root/lib a zde lze udělat různé úpravy v nastavení. Taktéž lze editovat kaskádové styly v CSS šabloně root/src/ttsite.css.

View a Mason

Poznamenejme, že lze vytvořit také masonovský View. Masonu jsme se již obsáhle věnovali a proto si jen náznakem ukažme, jak postupovat.

Na úvod opět vytvoříme komponentu, ta bude tentokrát typu Mason.

$ perl script/projekt_create.pl view Mason Mason

Pak lze v šablonách využívat masonovské syntaxe. Argumenty odeslané do šablony pomocí $c->stash získáme pomocí bloku <%args>.

Zde je příklad jednoduché masonovské šablony, která zobrazuje přijatý argument.

<%args>
$argument
</%args>
Od Controlleru jsme ziskali toto: <% $argument %>

Více o použití Masonu v Catalystu lze nalézt v dokumentaci.

View a další možnosti

Existuje řada dalších pomocníků usnadňujících vytváření View od vytváření PNG obrázků, generování PDF, uživatelská rozhraní, PHP kódu až po posílání emailů. K nalezení jsou v archivu CPAN a stojí za to si alespoň pro představu projít seznam modulů, protože lze narazit na opravdu zajímavé projekty.

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=1664