[Zope] Repetetive ZPT

Dieter Maurer dieter@handshake.de
Sun, 2 Feb 2003 19:22:26 +0100


martin f krafft wrote at 2003-2-1 21:03 +0100:
 > I have the following bit of TALES code in one of my pages. It doesn't
 > occur just once, it occurs multiple times, with the parameters at
 > AAAAAA, BBBBBBB, CCCCCCC, and DDDDDDD changing between each
 > occurrence:
 > 
 >         <tr tal:define="field form/AAAAAA;
 >                value request/form/field_BBBBBB|person/CCCCCCCCC|nothing">
 >           <td class="label" tal:content="field/title">Label</td>
 >           <td class="field">
 >             <input type="text"
 >               tal:replace="structure python:field.render(value)" />
 >             <span class="formerror" tal:on-error="string:"
 >                 tal:condition="showerrors"
 >                 tal:content="structure python:formErrors['DDDDDD']">
 >               Error
 >             </span>
 >           </td>
 >         </tr>
 > 
 > Because everything else is the same, I'd like to factor the code out.
 > I was thinking about macros, but using macros within tal statements or
 > tags produces compilation errors.
 > 
 > How else can I factor the above out and parametrise it?
You make the macro you like and have your parameters as "unbound" variables
in it. You then use:

   <metal:params tal:define="... Definitions for your unbound variables ...">
     <tr metal:use-macro="...full reference to your macro...">
     </tr>
   </metal:params>

The "metal:params" above is inessential; it is just a tag that is not
rendered (because it is in a "tal/metal" namespace).
Any other tag would do as well.
I use "metal:params" for documentation purposes, because I define
here parameters for macros...

Inside your macro definition, you might want to use variable
interpolation in "path" expressions. Its syntax is:
"<path>/?varname". This substitutes the content of "variable" for "?variable".


Dieter