Index: openacs-4/packages/acs-tcl/tcl/form-processing-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-tcl/tcl/form-processing-procs.tcl,v diff -u -r1.30 -r1.31 --- openacs-4/packages/acs-tcl/tcl/form-processing-procs.tcl 17 May 2003 10:04:18 -0000 1.30 +++ openacs-4/packages/acs-tcl/tcl/form-processing-procs.tcl 22 Aug 2003 10:09:38 -0000 1.31 @@ -224,18 +224,27 @@
@@ -956,22 +965,61 @@ } } - if { [info exists on_submit] } { - ad_page_contract_eval uplevel #$level $on_submit - } - upvar #$level __new_p __new_p - if { [info exists new_data] && $__new_p } { - ad_page_contract_eval uplevel #$level $new_data - template::element::set_value $form_name __new_p 0 - } elseif { [info exists edit_data] && !$__new_p } { - ad_page_contract_eval uplevel #$level $edit_data - } + # Lars: We're wrapping this in a catch to allow people to throw a "break" inside + # the code block, causing submission to be canceled + # In order to make this work, I had to eliminate the ad_page_contract_eval's below + # and replace them with simple uplevel's. Otherwise, we'd get an error saying + # 'break used outside of a loop'. + set errno [catch { + if { [info exists on_submit] } { + uplevel #$level $on_submit + } - if { [info exists after_submit] } { - ad_page_contract_eval uplevel #$level $after_submit + upvar #$level __new_p __new_p + + if { [info exists new_data] && $__new_p } { + uplevel #$level $new_data + template::element::set_value $form_name __new_p 0 + } elseif { [info exists edit_data] && !$__new_p } { + uplevel #$level $edit_data + } + + if { [info exists after_submit] } { + uplevel #$level $after_submit + } + } error] + + # Handle or propagate the error. Can't use the usual + # "return -code $errno..." trick due to the db_with_handle + # wrapped around this loop, so propagate it explicitly. + switch $errno { + 0 { + # TCL_OK + } + 1 { + # TCL_ERROR + global errorInfo errorCode + error $error $errorInfo $errorCode + } + 2 { + # TCL_RETURN + error "Cannot return from inside an ad_form block" + } + 3 { + # TCL_BREAK + # nothing -- this is what we want to support + } + 4 { + # TCL_CONTINUE + continue + } + default { + error "Unknown return code: $errno" + } } + } template::element::set_value $form_name __refreshing_p 0