beno - wrote at 2006-7-29 10:09 -0700:
... <tr tal:repeat="item batch"> <tal:block define="global number repeat/item/number"> <td tal:content="number">1</td> <td tal:content="item/title">title</td> <td><tal:content metal:use-macro="here/?number/macros/author">author</tal:content></td> <td><tal:content metal:use-macro="here/?number/macros/content">content</tal:content></td> <td tal:content="item/bobobase_modification_time"> modification date</td> </tal:block> </tr> ... Sorry, a site error occurred.Traceback (innermost last): ... Line 22, Column 8 Expression: standard:'here/?number/macros/author' ... Module Products.PageTemplates.Expressions, line 107, in _eval TypeError: iteration over non-sequence (Also, an error occurred while attempting to render the standard error message.)
This one is a bit more difficult: you need to look at the source code to find out what goes wrong. The traceback again tells you that the problem is with "here/?number/macros/author". Moreover, it tells you that the exception is raised in line 107 of "Module Products.PageTemplates.Expressions". The code, you see there is "path[i:i+1] = list(val)". I see from this code (it is okay when you do not yet see it), that "list(val)" is the problem. You must now look a bit around and take names seriously. The code aroung is: if self._dp: path = list(path) # Copy! for i, varname in self._dp: val = vars[varname] if isinstance(val, StringType): path[i] = val else: # If the value isn't a string, assume it's a sequence # of path names. path[i:i+1] = list(val) This loop is responsible to replace the "?varname" occurrencies in your path by the value of the variable "varname". As you see, the value may either be a string or a sequence of paths. In your case, it is an integer and "list(<some_integer>)" results in the "TypeError" you observe. Add "number python:`number`" after your definition of "number", i.e. <tal:block define="number repeat/item/number; number python:`number`"> I removed the "global" (as you no longer need it due to the introduction of "tal:block"). The "`...`" is a Python operator equivalent to a call to "repr(...)" which converts into a string. -- Dieter