[Zope-dev] Newbie: manage_add DTML access to product variables

R. David Murray bitz@bitdance.com
Fri, 8 Feb 2002 14:43:07 -0500 (EST)


On Tue, 5 Feb 2002, John Hall wrote:
> 1.  How do I format an object to use in a <dtml-in> loop?  (I'm thinking
>     it needs to be a list of dict's).

dtml-in will accept four differen formats:  a list of objects with
attributes, a list of values, a list of dicts, or a list of pairs.

A list of objects is the most common case, and you get access to the
attributes by name inside the loop.  A list of values can only
be accessed using <dtml-var sequence-item>, which gives you access
to each item in the list in turn.  For a list of dicts you want
to specify the 'mapping' keyword on dtml-in, in which case the
keys of each dict can be used in dtml-var statements.  I'm not
100% sure what the list of pairs does, but I think one of the
two items in the pair goes into sequence-key and the other into
sequence-item.

> 2.  How do I access a function or variable in a Product's python code
>     directly from DTML (or how do I add a callable method in Zope's DTML
>     namespace from a Product's python code?)  I think my major problem
>     here is lack of understanding of how Products are accesible within
>     the DTML namespace.

If you make the right security declarations you can probably access
a class variable from dtml.  What might be easier, though, is to
use the binding feature of DTMLFile to make the list available
when the method is called, via pre-declaration in your Product:


  [code that defines your class, including the class variable listOfMethods]

  yourAddMethod = DTMLFile('dtml/addForm',globals(),
	listOfMethod = yourclass.listOfMethods)

I'm not 100% sure this is going to solve your problem, but I've some
some stuff along these lines successfully, so it might.

--RDM