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é.