[Zope3-Users] Using a ZPTPage with a View Class

Dennis Allison allison at shasta.stanford.edu
Sun Oct 9 20:51:00 EDT 2005


On Sun, 9 Oct 2005, Wade Leftwich wrote:

> 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
> _______________________________________________
> Zope3-users mailing list
> Zope3-users at zope.org
> http://mail.zope.org/mailman/listinfo/zope3-users
> 

-- 



More information about the Zope3-users mailing list