[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