[Zope] HTMLFile from within a method?

Rob Miller rob.AT.kalistra.DOT.com@zope.org
Thu, 13 Jul 2000 16:22:27 -0700


Greetings.  I'm a fairly experienced Python programmer, but am new to Zope. 
I'm working on a Python product, and through this process I'm learning my way
around the Zope innards.  I'm running Zope 2.2.0b3 on an RH6.1 box.

By declaring a class member that is an instance of the HTMLFile class, I
can publish dtml files.  This is right out of the "Boring Product" How-To; it
looks like this:

----------------------
class Product(Implicit, Persistent, RoleManager, Folder):

    index_html = HTMLFile('index', globals())
----------------------

Then when I browse to an installed instance of my Product, I'll see the
appropriate output generated by my 'index.dtml' file, which is in the same
directory as my Product's python modules.

What I'm having trouble doing is something similar but from within one of my
Product class's methods.  I've tried this:

----------------------
class Product(Implicit, Persistent, RoleManager, Folder):

    def form_handler(self, REQUEST=None):
        return HTMLFile('form_results', globals())
----------------------

This causes the output to be munged, like so:

<dtml-var standard_html_header>
<dtml-in "REQUEST.keys()">
... and so on ...

I've also tried:

----------------------
class Product(Implicit, Persistent, RoleManager, Folder):

    form_results = HTMLFile('form_results', globals())

    def form_handler(self, REQUEST=None):
        return self.form_results()
----------------------

This causes zope to attempt to publish the object, but the object (my DTML
method, stored in "form_results.dtml") doesn't seem to have access to the
Product's namespace.  That is, I get an error like:

Error Type: KeyError
Error Value: standard_html_header

...even though there's definitely a standard_html_header defined.

Finally, I've tried this:

----------------------
class Product(Implicit, Persistent, RoleManager, Folder):

    def form_handler(self, REQUEST=None):
        dtml = open('lib/python/Products/Product/form_results.dtml', 'r')
        s = dtml.read()
        dtml.close()
        return s
-----------------------

This causes the right data to be passed out, but it's not treated
as dtml.  A garbled version of my output appears in the browser window, and if
I view source I see:

<html><head></head>
<dtml-var standard_html_header>
<dtml-in "REQUEST.keys()">
... and so on ...

I know there are other ways to accomplish what I'm trying to accomplish, but I
really want to understand what's going on here.  Can anyone enlighten me as to
why I'm seeing the results I'm seeing?  Does anyone have suggestions for an
appropriately Zen approach to publishing dtml files from within a Product's
methods?

Thanks for your time,

rob