[Zope] TALs difficulties
Johan Carlsson
johanc at easypublisher.com
Wed Sep 1 12:59:32 EDT 2004
Paul Winkler wrote:
> On Wed, Sep 01, 2004 at 04:38:30PM +0200, Johan Carlsson wrote:
>
>>Jim Penny wrote:
>>
>>
>>>On Wed, 01 Sep 2004 14:45:19 +0200
>>>Johan Carlsson <johanc at easypublisher.com> wrote:
>>>
>>>
>>>
>>>>Hi,
>>>>I need help :-)
>>>>
>>>>I'm trying to implement a new Widget for Archetypes.
>>>>So I have to write TAL (not my favorite hobby).
>>>>
>>>>
>>>>Here's what I've settled for so far:
>>>>vocab is the DisplayList derivative (item is a key).
>>>>
>>>><tal:loop repeat="item vocab">
>>>> <optgroup
>>>> tal:attributes="label python:vocab.getValue(item);"
>>>> tal:condition="python:vocab.isLabel(item)">
>>>> </optgroup>
>>>> <option selected=""
>>>> tal:condition="not:python:vocab.isLabel(item)"
>>>> tal:attributes="value item;
>>>> selected python:test(here.unicodeTestIn(item, value),
>>>>
>>>>'selected', None);"
>>>> tal:content="python: vocab.getValue(item)"/>
>>>></tal:loop>
>>>
>>>
>>>This is a simple neting mistake, try:
>>><tal:loop repeat="item vocab">
>>> <optgroup
>>> tal:attributes="label python:vocab.getValue(item);"
>>> tal:condition="python:vocab.isLabel(item)">
>>> <option selected=""
>>> tal:condition="not:python:vocab.isLabel(item)"
>>> tal:attributes="value item;
>>> selected python:test(here.unicodeTestIn(item, value),
>>>' selected', None);"
>>> tal:content="python: vocab.getValue(item)"/>
>>> </optgroup>
>>></tal:loop>
>>
>>No. That would only return the <optgroup> because <option> is
>>dependant on the optgroups condition (and it's condition is the
>>negation of that so it will never appear).
>>
>>
>>
>>>Though, as a matter of taste, I don't like this approach, I suspect that
>>>it will be hard to maintain, as it depends on whatever is generating
>>>vocab to deliver values in a sorted order. To me it would be much more
>>>natural to use a nested loop paramterized on the label value to generate
>>>the options.
>>
>>I agree. Also it's probably the only way to do it with TAL.
>>
>>Actually it's kind of good because this way TAL forces me to write
>>better logic.
>>
>>The problem is that with the Archetypes DisplayList this gets
>>really complicated to achieve. Not a TAL bad rather an Archetypes
>>inflexibilty.
>
>
> So, maybe write a Script that does some processing of
> the DisplayList and gives you something more reasonable.
> I gather that iterating over vocab and doing getValue() on each
> gives you something like:
>
> ['A', 'Ada', 'Ape', 'B', 'Banana', 'Buffy', ...]
>
> So, write a script that does something like (untested):
>
> items = {}
> raw = [vocab.getValue(item) for item in vocab]
> for s in raw:
> if vocab.isLabel(s):
> items[s].setdefault([])
> else:
> items[s[0]].append(s)
> result = [{'label': k, 'values': v) for k, v in items]
> return result
>
>
>
> Then you should have something like this:
>
> [{'label: 'A', 'values': ('Ada', 'Ape')},
> {'label: 'B', 'values': ('Banana', 'Buffy')},
> ... ]
>
>
> Plugging this in to your template should then be easy.
> Something like:
>
> <tal:loop repeat="group myScript">
> <optgroup
> tal:attributes="label group/label"
> <tal:loop repeat="item group/values">
> <option selected=""
> tal:attributes="value item;
> selected python:test(here.unicodeTestIn(item, value),
> ' selected', None);"
> tal:content="item" />
> </tal:loop>
> </optgroup>
> </tal:loop>
>
> ... except that I goofed up unicodeTestIn which apparently
> expects the original item from your vocab as an argument.
> Well, stuff that in your data structure somewhere too :-)
Yep, that's what I ended up to do.
I might need to create a new widget to get it "right".
Cheers,
Johan
More information about the Zope
mailing list