[Zope] Recursive <dtml-var> statements

Kyle D. Lanclos lanclos@cats.ucsc.edu
Fri, 05 May 2000 12:56:12 -0700


This is not the first time I've had to try and hack around Zope not letting
me recurse <dtml-var> statements, but this is the first time that I haven't
found a solution. My hair is turning greyer by the minute.

Here's an example of what I'm trying to do:

arguments:
target_field:string
old_value_list:list
old_value:string
new_value:string

And the function replace() just does string.join(string.split(input,
old_value), new_value).

<dtml-in old_value_list>
 update table_name set <dtml-var target_field>=
 '<dtml-var "replace(sequence-item, old_value, new_value)" sql_quote>'
 where <dtml-var target_field>='<dtml-var sequence-item sql_quote>'
 <dtml-var sql_delimiter>
</dtml-in>

This would, if it ever works, generate statements like the following:

update table_name set url='www.foo.org' where url='www.foo.com';
update table_name set url='www.bar.org' where url='www.bar.com';
update table_name set url='www.baz.org' where url='www.baz.org';

...if I was generating update statements to replace .com with .org for
certain values of title_field.

All of my external methods and what-have-you are defined and accessible. I
originally started out with the full string.join(string.split) hooplah
instead of the function replace(), but this is where things currently stand.

My problem? I can't access sequence-item within another dtml-var statement.
This would not be an issue if I didn't have to modify the contents of
old_value_list within the dtml-in statement. Accessing it directly via
<dtml-var sequence-item> works perfectly fine, of course, but I can't just
stick that within another dtml-var. If I could do this:

<dtml-var "replace(<dtml-var sequence-item>, old_value, new_value)">

...my life would be easy. I have tried representing sequence-item within
the dtml-var in (at least) the following additional ways:

_.REQUEST(['sequence-item'])
_['sequence-item']
_.getitem(sequence-item)

I originally had this whole mess shipped off to an external method, which
worked just fine until the input list generated a return string longer than
the max query length (16382ish), even though the return string was
separated into single update requests as I described above. The whole
reason I'm doing this within Zope is to get the <dtml-var sql_delimiter>
tag on my side.

Suggestions are very, very welcome. Please include a CC: to my e-mail
address with any replies, since I am not subscribed to the mailing list.

Thank you very much,

--Kyle
UCSC University Library