[Zope] processing dtml in external method

Kapil Thangavelu kthangavelu@earthlink.net
Tue, 22 Aug 2000 17:19:22 -0700


Scott Shepherd wrote:
> 
> Friends,
> 
> I have an external method that returns a string containing dtml, but
> I want it to evaluate the dtml and return the result. How do I do
> that?
> 
> I noticed in, say,
> /usr/share/zope/lib/python/Products/ExternalMethod/ExternalMethod.py,
> that dtml-containing *files* are used as object methods like this:
> 
>         from Globals import HTMLFile
>         manage_main = HTMLFile( 'methodEdit', globals() )
> 
> so I figured I could do a similar thing with a dtml-containing string
> and an external method:
> 
>         from Globals import HTML
>         dtml_string = '<dtml-let x="it works"><dtml-var x></dtml-let>'
>         external_method = HTML( dtml_string, globals() )
> 
> This in fact works, but if I try to reference anything in the current
> object, like
> 
>         dtml_string = '<dtml-var id>'
> 
> I get KeyError: id.
> 
> Apparently I'm getting dtml evaluation but not in the context of the
> current object. What am I doing wrong, and (for extra credit) why
> doesn't ExternalMethod.py have this problem using HTMLFile?
> 
> TIA,
> Scott
> 
> PS: I know I can get the id with
> 
>         def external_method( self, REQUEST = None ):
>                 return self.id
> 
> but the real dtml_string I need to evaluate is much more complicated
> than '<dtml-var id>'...
> 

i'm a bit sleepy so this will be short. i've used the DocumentTemplate
stuff outside of zope and its pretty well done. if you want examples of
how to do it check out the tests in the Document Template directory. to
your questions.

you can pass in explicit named variables in a second arg/call to the
template system. like

HTML("python string")(ob=self.myobject, mylist=self.objectItems())

and access the stuff within dtml.

<dtml-var "ob.id">

<dtml-in mylist>
<dtml-let x=sequence-item>
<dtml-var "x.myproperty">
</dtml-let>
</dtml-in>

as for the external method stuff, this is a guess. external methods are
just that. external methods. the global stuff isn't defined, they live
in a different internal namespace than a python product or your zope
objects, you can access zope objects through self which is the only hook
general hook back into zope and pass objects explicitly to the doc
template.

etc.

Kapil