Raphael Ritz schrieb:
Tonico Strasser wrote:


If yes, I mean something different. I think I would love a Python wrapper for Page Templates that can assemble *macros* from different templates provide them with names and render the main template only once. (Wait, that is already possible, isn't it?)

Maybe I didn't get your question but isn't that exactly what Archetypes
does to render widgets?

Didn't look into Archetypes, let's see.

Example (from: http://docs.neuroinf.de/programming-plone/ate#2-18)

<metal:data use-macro="python:obj.widget(field_name)" />

That looks interesting, the 'widget' returns a macro?

where 'widget' is defined in BaseObject

   security.declareProtected(CMFCorePermissions.View, 'widget')
   def widget(self, field_name, mode="view", field=None, **kwargs):
       if field is None:
           field = self.Schema()[field_name]
       widget = field.widget
       return renderer.render(field_name, mode, widget, self, field=field,

Hm, the term render implies something rendered, not a macro definition.

That way you can render a field's value for a given object wherever you like.

If I understand that correctly I get a unrendered macro?

For this example the macro(s) come(s) from the template configured on
the widget but it shouldn't be too hard to generalize that if needed.

But my gutt feeling says I missinterpret your question ...

That is related to what I want.

I've already built my own Z2 Python scripts to do the following:


# a template
main_template = context.main_template

# a page object that will render the main_template
page = context.Page(template=main_template)

# a macro provider
view = context.document_view

# a macro mapping which I can update with various macros

# assign random names to the namespace
page.foo = 'bar'

# render the page
return page.render()


This is my Page object:
##parameters=template, **kw
from Products.PythonScripts.standard import Object

page = Object()
page.request = container.REQUEST
page.response = page.request.RESPONSE
page.template = template
page.macros = template.macros.copy()
page.update_macros = page.macros.update

def render(*args, **options):
    options['args'] = args
    page.options = options
    page.here = context
    page.context = context
    return page.template.pt_render(extra_context=page)

page.render = render

return page


Very primitive, I know :)


Zope3-dev mailing list
Unsub: http://mail.zope.org/mailman/options/zope3-dev/archive%40mail-archive.com

Reply via email to