[Zope3-Users] Help us! Calling a Python Script from ZPT
Wade Leftwich
wade at leftwich.us
Sat Oct 29 20:50:07 EDT 2005
Stephan Richter wrote:
> On Saturday 29 October 2005 11:35, Paolo Cilmo wrote:
>
>>I need to develop a site
>>using ZMI (Zope2 typical using) and especially i want
>>to develop this applications:
>
>
> We do not support TTW development.
>
>
>>1- I've a package with a class and into the class a
>>method
>>2- with browser:addMenuItem in zcml i can insert a
>>package into zmi from "add menu"
>>3- I've a Page Template into ZMI
>>ASK: how i call from the Page Template the script,
>>passig parameters and to have a response from script?
>
>
> Why do you need to have this Page Template in ZMI? Why not on the file system?
>
I'm working on an application where Page Templates belong in the ZMI, at
least I think so. The content being displayed is a business directory,
with suppliers, products, and categories for those products. We will be
implementing 50 different directories, with the same basic content
structure but very different designs. Each of those directories will use
5 or 6 page templates, which go in the ZMI.
It seems like this is a common pattern for content management applications.
Repeating my own posting from 10/9, here's how I made an adapter
to use a file system view with a ZMI template:
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
########
# 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)
###
-- Wade Leftwich
Ithaca, NY
More information about the Zope3-users
mailing list