[PEAK] Templates with layout

Radek Kanovsky rk at dat.cz
Mon Jun 6 10:45:43 EDT 2005


Lets have some simple PWT template "repr.pwt":

        <html this:is="page">
            <div content:replace="."/>
        </html>

It correctly shows repr() of the underlying object. Everything is OK untill 
we try to use some layout:

    repr.pwt:

        <html with:page-layout="@@layout">
            <div this:is='body' content:replace="."/>
        </html>

    layout.pwt:

        <html this:is="page">
            <div this:replace="/params/body"/>
        </html>
        
Then we end in infinite recursion, because current object in repr.pwt
is not underlying object but parsed layout.pwt template. Workaround
is to use ``content:replace=".."'' in repr.pwt but I am almost sure
that this is not intended behaviour. Following patch solve the problem
but may have some undesired side effects that I am not aware of now.

Index: templates.py
===================================================================
--- templates.py	(revision 53)
+++ templates.py	(working copy)
@@ -626,7 +626,9 @@
             elif path=='/default':
                 return super(TemplateDocument,self)
             else:
-                return Replace(self, dataSpec=path, params=self.params.copy())
+                wrap = LayoutParamWrapper
+                params = dict([(p,wrap(v)) for p,v in self.params.iteritems()])
+                return Replace(self, dataSpec=path, params=params)
 
         if attrName in self.params:
             return IDOMletRenderable(self.params[attrName])
@@ -638,9 +640,15 @@
     fragment = page = binding.Make(layoutDOMlet)
 
 
+class LayoutParamWrapper(object):
+
+    protocols.advise(instancesProvide=[IDOMletRenderable])
+
+    def __init__(self, elem):
+        self.elem = elem
+
+    def renderFor(self, ctx, state):
+        return self.elem.renderFor(ctx.previous, state)
 

RadekK



More information about the PEAK mailing list