[ZPT] Condition-Group Proposal
Evan Simpson
evan at 4-am.com
Sat Apr 12 21:57:41 EDT 2003
Florian Konnertz wrote:
> I wondered about this some weeks ago, also, here are my notes about it:
> http://openspirit.homelinux.net/noowiki/zope/Condition
(Moving to ZPT list, but this time actually posting there)
Thanks! Re-reading Guido's post gave me an idea:
<ul tal:condition-group="flavor" tal:repeat="variety icecreams">
<li tal:condition="flavor python:variety in ('Cherry', 'Strawberry')">
I like <span tal:replace="variety">this flavor</span> very much.
</li>
<li tal:condition="flavor python:variety in ('Vanilla', 'Chocolate')">
I like <span tal:replace="variety">this flavor</span>.
</li>
<li tal:condition="flavor python:variety in ('Coffee', 'Mint Chip')">
I don't like <span tal:replace="variety">this flavor</span>.
</li>
<li tal:condition="flavor default">
I haven't tried <span tal:replace="variety">this flavor</span>.
</li>
</ul>
So, tal:condition-group sets up a variable and a scope. Within that
scope, all tal:condition statements that precede the conditional
expression with the group name and whitespace are grouped -- once one of
them has evaluated true, all of the following ones will short-circuit
evaluate to false. The variable will be false until one of the grouped
conditions is true, and true thereafter. It can be used to negate the
group condition or combine it with other conditions.
There are two ways to say "else". One is to use a true-valued literal,
as in 'fred default'. The other is 'not:fred'. The difference is that
'fred default' *also* sets 'fred' true, while 'not:fred' does not. You
can also spell "notelse", that is, test whether any prior condition
succeeded, using plain 'fred'.
The question arises of how this would interact with a nested tal:repeat.
I suggest that if one wants to "reset" the group within the
tal:repeat, one must re-declare the group there. Example:
<tal:x condition-group="fred">
<tal:x condition="fred default">Always</tal:x>
<tal:loop repeat="n python:range(3)" condition-group="fred">
<tal:x condition="fred repeat/n/first">First</tal:x>
<tal:x condition="not:fred">Not First</tal:x>
<tal:x condition="fred repeat/n/last">Last</tal:x>
</tal:loop>
<tal:x condition="fred default">Never</tal:x>
<tal:x condition="fred">Always</tal:x>
</tal:x>
...would produce:
Always
First
Not First
Not First
Last
Always
Note the subtle difference between using 'not:fred' and 'fred default'
for "Not First". If I had used the latter, 'fred' would become true,
and 'fred repeat/n/last' would never succeed.
Cheers,
Evan @ 4-am
More information about the ZPT
mailing list