Hi Jochen,
Hi list,
is there a way to build a table holding two columns of results???
My first try was like this:
1 <table border="1"> 2 <metal:block tal:repeat="result batch" > 3 <metal:block tal:define="resultObject result/getObject"> 4 <metal:block tal:condition="repeat/result/odd"> 5 <tr> 6 <td> 7 left object 8 </td> 9 </metal:block> 10 11 <metal:block tal:condition="repeat/result/even"> 12 <td> 13 right object 14 </td> 15 </tr> 16 </metal:block> 17 </metal:block> 18 </metal:block> 19 </table>
Bute TALES does not like the </tr> at line 15 because of illegal nesting.
I agree - it is illegal nesting ;-> I guess there is a good reason why it cannot be implemented easily: What do You do with the last cell, if there is an uneven number of elements in the batch ? Currently You try an approach wich will not close the last <tr>-tag. You could force it by hiding the bad nesting e.g. inside a script, something like: <metal:block tal:repeat="result batch"> <metal:block tal:define="resultObject result/getObject"> <metal:block tal:condition="repeat/result/odd" tal:replace="structure python:here.render_left(repeat['result'])" /> <metal:block tal:condition="repeat/result/even" tal:replace="structure python:here.render_right(repeat['result'])" > </metal:block> </metal:block> where "render_left" contains something like: return "<tr><td>left object</td>" and 'render_right" similar. However I argue instead to reorder the results into two-tuples. e.g. define a script "pairwise" accepting one parameter "a": if len(a)%2==1: # uneven list length: add a dummy a.append("empty value") return [ (a[i],a[i+1]) for i in range(0, len(a)-1,2) ] and then do: <metal:block tal:repeat="result python:here.pairwise(batch)"> <tr> <td tal:content="python:result[0]" /> <td tal:content="python:result[1]" /> </tr> </metal:block> I guess TAL will like that (modulo syntax errors) Cheers, Clemens