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.


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 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()

   # 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(

The code below works, but requires a PageTemplate with the Id "index" to

def __call__(self, client=None, REQUEST={}, RESONSE=None, **kw):
   return self.index()


Zope-Dev maillist  -  [EMAIL PROTECTED]
**  No cross posts or HTML encoding!  **
(Related lists - )

Reply via email to