Spojování podmínek v Petalu

Po zápisku o HTML::Mason přidávám pár hintů k dalšímu šablonovacímu systému pro Perl, tentokrát pro Petal. Proti Masonu je Petal o dost jednodušší, ale na weby s několika stránkami bohatě stačí. Petal má navíc velkou výhodu v tom, že je kompletně postavený na XML, takže je možné jeho použití jednoduše kombinovat s dalšími XML nástroji. Některé věci v něm ale jsou zjednodušené možná až příliš – například syntaxe výrazů v podmínkách. To může znamenat problém, pokud je viditelnost některých prvků stránky řízena složitější logikou a využívá se více proměnných.

V podmínkové části šablon lze zadat jenom jednu proměnnou. Nejjednodušší způsob, jak tento problém obejít, je přidat pomocné proměnné obsahující požadované kombinace podmínek.

$tal->process(a => $a, b => $b, a_or_b => $a || $b);

To je ale nepříjemné řešení, protože zesložiťuje komunikaci mezi šablonou a “užitečným kódem” a může vyžadovat úpravy perlového kódu při změně designu stránky.

Jak tedy zapsat základní logické spojky? V dokumentace to přímo napsané není, ale nakonec to není tak složité:
Pozn.: v příkladech používám pro Petalovské atributy namespace tal, jako to je v příkladech v dokumentaci na CPANu.

Negace

Nejjednodušší varianta, před podmínku stačí dopsat false:

if (not $hashref->{"a"}) {
  #...
}

lze zapsat jako

<span tal:condition="false:a">...</span>

Konjunkce (logické and)

Logický and jde vytvořit jednoduše, jako vyhodnocení posloupnosti podmínek (tj. vnořením tagů s podmínkou do sebe). Problém je, že tak ve výsledném HTML kódu vzniknou nechtěné elementy. Tomu jde v Petalu zabránit přidáním atributu omit-tag s pravdivou hodnotou (například omit-tag="string:1") u pomocných tagů, přidaných jen kvůli podmínkám.

if ($hashref->{"a"} && $hashref->{"b"}) {
  #...
}

lze tedy zapsat jako

<span tal:omit-tag="string:1" tal:condition="a">
  <span tal:condition="b">
    ...
  </span>
</span>

Disjunkce (logické or)

S disjunkcí to je o něco složitější, trik s vnořování tagů tu zopakovat nejde. Na druhou stranu lze využít schopnost Petalu vkládat hodnoty proměnných přímo do textu pomocí dolarové notace – ${x} se při zpracování šablony nahradí hodnotou proměnné x. To lze využít ke skládání hodnot pro podmínky. Přidáním string: na začátek podmínkového atributu Petal přinutíme, aby výraz v podmínce zpracovával jako řetězec (a ne jako název proměnné). Pak do něj lze zadat více proměnných najednou (viz příklad). Pokud alespoń jedna z nich bude mít pravdivou hodnotu, pak bude mít pravdivou hodnotu celý řetězec a podmínak bude splněna.

if ($hashref->{"a"} || $hashref->{"b"}) {
  #...
}

lze zapsat jako

<span tal:condition="string:${a}${b}">
  ...
</span>

Složitější výrazy

Už budou trochu problém… každou logickou formuli sice lze přepsat na konjunkci disjunkcí (konjunktivní normální tvar) a na ten pak aplikovat výše uvedené postupy, ale o přehlednosti takové šablony bych si dovolil předem pochybovat. O skutečné potřebě používat takové podmínky také.

Bookmark and Share

Leave a Reply