[Zope] Strange Behaviour in my dtml-method

Casey Duncan cduncan@kaivo.com
Tue, 31 Jul 2001 11:47:21 -0600


Karl Munroe wrote:
> 
> I am having some problems with a little bit of code I wrote that is of the
> following format :
> 
> 1  <dtml-call SomeExpensiveFunction>
> 2  <dtml-in someListIHave>
> 3     <dtml-if "_['sequence-item'] == ''">
> 4        <dtml-call "RESPONSE.redirect('page_to_see_error_message')">
> 5     </dtml-if>
> 6   </dtml-in>
> 7   <dtml-call AddSomethingToMyDatabase>
> 8   <dtml-call "RESPONSE.redirect('page_to_see_results')">
> 
> The above code processes some data that I input from a form. I left a field
> blank and I would be redirected at line 4 to see the error message.
> Unfortunately I got something else. Instead of stopping at line 4 the above
> code redirects me at line 8 executing line 7 in the process.
> 
> # When I redirect from a dtml method, is such a redirect functionally
> equivalent to a return statement in C that causes processing to stop???
> 
> #I interpret that behaviour to mean that the the above code executes until
> the loop is finished and then continues to execute. The result is that I am
> redirected twice, first to see the error message and finally to see the
> results. If this is the case, is there a tag to stop looping and "return".
> 
> Thanks in advance
> Karl
> 

A redirect does not stop the execution of the method. The redirect
actual happens *after* the method completes. RESPONSE.redirect just adds
the redirect header to the HTTP response, it does not affect the DTML
execution in any way.

To halt execution after a redirect, add a dtml-return as in:

<dtml-call expr="RESPONSE.redirect('fooURL')">
<dtml-return expr="1">

The return _will_ halt execution of the DTML at that point.
-- 
| Casey Duncan
| Kaivo, Inc.
| cduncan@kaivo.com
`------------------>