At 01:20 PM 2/15/99 -0600, rkw@dataplex.net wrote:
this is my structure:
Folder 'HERE' has Folders within it. Assume that they have ids ID1, ID2, ID3, etc. Each of these Folders has a property 'common_name'
Thus, in HERE/ID1 can reference <!--#var common_name--> and get 'Name 1'.
In HERE, I execute a form. The checkboxes build a list ids ['ID1', 'ID2']. Processing the form, <!--#var ids--> gives me the list. <!--#in ids--><!--#var sequence-item--><!--#/in--> gives 'ID1' on the first iteration. But I want to get 'Name 1'
Indirection is bit confusing in DTML. Here are examples from a post I made a couple days ago which tries to explain the concept: Suppose that a DTML variable named Category is 'Expensive'. Then <!--#var Category--> is 'Expensive'. Then <!--#var expr="_[Category]"--> is <!--#var expr="_['Expensive']"--> which means <!--#var Expensive-->. Got it? Here's one final example in Python from DocumentTemplate import HTML t=HTML("""<!--#var expr="_['foo']"-->, <!--#var expr="_[foo]"-->""") print t(foo="bar", bar="spam") which prints "bar, spam". This is analogous to Python. foo.bar is the same things as getattr(foo,'bar') <!--#var bar--> is the same thing as <!--#var "_['bar']"--> In fact, you might think of the DTML underscore namespace mapping as similar to a Python __dict__ namespace mapping. So to get back to your question,
<!--#var ids--> gives me the list. <!--#in ids--><!--#var sequence-item--><!--#/in--> gives 'ID1' on the first iteration. But I want to get 'Name 1'
You have a list of object ids. You want to iterate through the objects and print each one's common_name, correct? Here's one way to do that: <!--#in ids--> <!--#var "_[_['sequence-item']].common_name"--> <!--#/in--> This assumes that common_name is a string attribute of each object. If common_name were a method, or a DTML method you might want to do something different, for example: <!--#in ids--> <!--#with "_[_['sequence-item']]"--> <!--#var common_name--> <!--#/with--> <!--#/in--> This would allow normal DTML var rendering behavior. So why the two levels of indirection? Let's see. Assume ids is ['ID1','ID2']. The first time through the loop <!--#var sequence-item--> == <!--#var "_['sequence-item']"--> == 'ID1' What you are looking for is the object named ID1, not the string 'ID1'. So you have to look in the DTML namespace for the object. <!--#var "_['ID1']"--> == <!--#var "_[_['sequence-item']]"--> It's a little ugly but it works. Make sense? -Amos