[Zope] Calling DTML Methods from JavaScript?

Dan Shafer dan@gui.com
Tue, 25 Dec 2001 01:17:15 -0800


I'm sure I'm just overlooking something obvious here, but after 
spending several hours at this today I'm throwing up my hands.

The goal here was (I thought) pretty simple:

1. User fills out a form.
2. If he checks a radio button and then doesn't provide text in a 
related field, I remind him of his inconsistency, leave him on the 
HTML form where he was, and select the field that needs completion. 
Outside Zope, this is a piece-o-cake. Done it hundreds of times.
3. If he behaves as expected, the MySQL database gets updated and the 
user gets a thank you page.

In the JavaScript I use on the client side (I can't see a way to keep 
the user on the form using dtml), I have a conditional. The if 
portion pops up a dialog, reminding the user of his or her oversight, 
then selects the improperly omitted field. The else clause is 
_supposed_ to call the dtml method that updates the MySQL database 
and thanks the user for the submission. That's where the problem 
arises.

In the <FORM> tag, I have the DTML method as the action. I also added 
a call to the JavaScript function using an onSubmit handler. The 
onSubmit handler gets called, the user gets reminded of the 
oversight, and the function returns false. This is _supposed_ (ECMA 
rules) to prevent the form from being submitted so the form action 
shouldn't take place. That's not what happens. Instead, the user gets 
reminded of the omission and then the thank you page shows up anyway. 
The MySQL database gets updated and it shouldn't.

I tried in the else clause just having this line:

else
<dtml-call addAndAcknowledge>

But when I do that, it _appears_ that Zope parses the script (which 
is in an overridden standard_html_header dtml method) because it 
gives me errors indicating a bad submission to the database on 
loading the page with the form.

I tried enclosing the dtml-call in curly braces (optional JavaScript 
syntax; I was getting desperate) but that had zero effect.

So the question I ended up with (and it may not be the right one; 
half of success is knowing what questions to ask and I'm not sure I 
have this one right) is, "How do you call a DTML method from a 
JavaScript?" I searched all the Tips and How-Tos, and did a search on 
Zope.org using "JavaScript" and then "DTML and JavaScript" and then 
"Zope and JavaScript" as terms. No joy but hours of pain (and a few 
good tidbits picked up in the process, so all was not lost.)

What am I missing?
-- 
Dan Shafer, Author-Consultant
http://www.danshafer.com
http://www.shafermedia.com