Okay, I've found that if I use "self" in place of "self.aq_parent" when calling "getattr" it gets the attribute in the context of self and everything works great! -Brian On Fri, 13 Dec 2002, Brian R Brinegar wrote:
Howdy,
Overview:
I'm working on a helper product for Zope Presentation Templates. The goal of this product is to allow people to drop static content into a site developed with Zope Presentation Templates using WebDAV clients. (This is similar to the Kube Product but it's not folderish and supports WebDAV.)
At first I suggested creating some ZPT with an Id like "view". Have users drop in static content as File objects. Then link to the files like "file_id/view". The "view" ZPT would reference the document_src method of the file object to pull the static content into the page. I like this approach, and I think this is how Presentation Templates are meant to be used.
Problem:
Our users will not change links created by WYSIWYG tools to include the "/view" so we need a product that removes the need for this. I am calling the product HTMLBlock. Version one of the product is a simple data holder with a document_src method which returns the content. It does not override index_html, instead acquiring the index_html from the context. I create an index_html page template with all of my presentation and some code like:
<div tal:replace="here/document_src">Content Goes Here</div>
When an HTMLBlock is viewed it shows up with all of the dynamic presentation of the index_html ZPT with the HTMLBlocks static content dropped in. Great! Almost there! :-)
The problem is that people cannot create a default HTMLBlock with the Id index_html. It ends up trying to render itself much like a folder with the Id index_html. No Good. :-(
So I temporarily fixed this by changing the template to redirect to an object with the Id "index" if document_src doesn't exist. When someone views a folder the index_html template is accessed, document_src is not defined so it redirects to "index" which is an HTMLBlock which renders correctly. I don't like this. :*( Still No Good.
What I want is for the HTMLBlock product to have a property which specifies the Id of the template to use. Implement an index_html or __call__ method to locate the template and call it in the context of itself. I would like this to work generically so that the template could be DTML, Python, a ZPT, or anything else.
Casey Duncan has some uber useful code on ZopeLabs.com to call an object generically using the ZPublisher. I borrowed it and came up with the code below, but it doesn't work. It calls the template, but the template cannot access methods of this object.
Suggestions? Is there a better approach?
(Note: template_id is the Id of the template to render)
def __call__(self, client=None, REQUEST={}, RESONSE=None, **kw): """ Call the selected template in the context of myself. """
securityManager = getSecurityManager() securityManager.addContext(self)
# Check for the template if not hasattr(self.aq_parent, self.template_id): return str(self)
obj = getattr(self.aq_parent, self.template_id) if not securityManager.checkPermission('View', obj): return default
return mapply( object=obj, positional=REQUEST.args, keyword=REQUEST, debug=call_object, maybe=1, missing_name=missing_name, handle_class=dont_publish_class, context=self, bind=1)
The code below works, but requires a PageTemplate with the Id "index" to work
def __call__(self, client=None, REQUEST={}, RESONSE=None, **kw): return self.index()
Thanks, -Brian
_______________________________________________ Zope-Dev maillist - Zope-Dev@zope.org http://lists.zope.org/mailman/listinfo/zope-dev ** No cross posts or HTML encoding! ** (Related lists - http://lists.zope.org/mailman/listinfo/zope-announce http://lists.zope.org/mailman/listinfo/zope )