[Zope3-Users] Using a ZPTPage with a View Class
Wade Leftwich
wade at leftwich.us
Sun Oct 9 20:36:12 EDT 2005
Hello,
I'm doing a project where different instances of the same content type
might need different templates. All the instances in a given folder will
share a template. The manager of the site should be able to change the
template through the ZMI. I want the TTW templates to have the same
namespace keys as a ViewPageTemplateFile, so they can be used
interchangeably by a View Class.
What I have done for a first cut is make an adapter for ZPTPage =>
ViewPageTemplateFile. (See below.) The two Template classes actually
implement the same interface, but the namespace available to TALES
within the template is quite different.
My general question is, is this a reasonable way to proceed? It works OK
with Benji York's Hello World example; in particular the 'view' and
'context' namespaces seem to be complete. But Hello World doesn't
exercise the code much. Is there another pattern I should be using
instead? Have I overlooked a perfectly good solution that's already out
there?
Wade Leftwich
Ithaca, NY
########
# View class that uses the adapter
class MessageView(object):
"""A webpage saying hello
"""
def message(self):
return '%s %s!' % (self.context.greeting, self.context.subject)
class KustomView(MessageView):
"""Pick up a template from parent container if available;
if not, use the filebased one.
"""
def __call__(self):
template = self.context.__parent__.get('kustom.pt')
if template is not None:
template = getAdapter(template, IPageTemplateSubclassing,
"zptViewAdapter")
else:
template = ViewPageTemplateFile('stock.pt')
return template(self)
##########
# The adapter
class ZPTViewAdapter(ZPTPage):
"""Adapt a ZPTPage instance to set up its namespace
like zope.app.pagetemplate.viewpagetemplatefile.ViewPageTemplateFile,
so it can be called by a View Class.
"""
implements(IPageTemplateSubclassing)
adapts(ZPTPage)
def __init__(self, ob):
self.ob = ob
def pt_getContext(self, instance, request, **kw):
"""instance is a View component"""
namespace = super(ZPTViewAdapter, self).pt_getContext(instance,
request, **kw)
namespace['nothing'] = None
namespace['template'] = self.ob
namespace['container'] = self.ob.__parent__
namespace['request'] = request
namespace['view'] = instance
namespace['context'] = context = instance.context
namespace['views'] = ViewMapper(context, request)
namespace['options'] = kw
print 'ZPTPage namespace', namespace.keys()
return namespace
def __call__(self, instance, *args, **keywords):
namespace = self.pt_getContext(
request=instance.request,
instance=instance, args=args, options=keywords)
debug_flags = instance.request.debug
s = self.ob.pt_render(
namespace,
showtal=getattr(debug_flags, 'showTAL', 0),
sourceAnnotations=getattr(debug_flags, 'sourceAnnotations', 0),
)
response = instance.request.response
if not response.getHeader("Content-Type"):
response.setHeader("Content-Type", self.ob.content_type)
return s
More information about the Zope3-users
mailing list