In case anyone else ever has this problem, I will post my own solution. 
Web2Py traps all form submissions in web2py.js. To override this behaviour 
we need to add the "no_trap" class to the form declaration:

single_payment_form = SQLFORM.factory(
    Field('tenant_name',    'string',        label="Tenant Name",    length=
255),
    Field('payment_amount', 'decimal(10,2)', label="Payment Amount", 
requires=IS_DECIMAL_IN_RANGE(0, None, "Enter a positive dollar amount"), 
widget=CurrencyWidget.With_Symbol('$')),
    Field('payment_method', 'string',        label="Payment Method", 
requires=IS_IN_SET(payment_methods, zero='Please add a Payment Method to 
make payments' if not payment_methods else None), length=20),
    table_name = "single_payment_form",
    _class="no_trap",
    submit_button = "Continue")

Then we need to reimplement that behaviour with a flag to indicate whether 
or not the confirmation has already happened. I used an already_confirmed 
data attribute on the form.


<script type="text/javascript">
function single_payment_form_trap() {
    var $component = $('#single_payment_form_component');
    var $form = $('#single_payment_form_component form');
    var action = $component.attr('data-w2p_remote');
    var target = 'single_payment_form_component';
    
    $form.attr('data-w2p_target', target);
    $form.attr('data-already_confirmed', 'false');
    
    var url = $form.attr('action');
    if ((url === '') || (url === '#') || $.web2py.isUndefined(url)) {
        /* form has no action. Use component url. */
        url = action;
    }
    
    $form.submit(function (e) {
        var already_confirmed = $form.attr('data-already_confirmed');
        
        if( already_confirmed == 'false' ) {
            $.web2py.disableElement($form.find($.web2py.
formInputClickSelector));
            $.web2py.hide_flash();
            
            $('#payment-confirmation-dialog').modal({
                show: true,
                backdrop: 'static',
                keyboard: false
            });
        } else {
            $.web2py.ajax_page('post', url, $form.serialize(), target, $form
);
        }
        e.preventDefault();
    });
    
    $form.on('click', $.web2py.formInputClickSelector, function (e) {
        e.preventDefault();
        var input_name = $(this).attr('name');
        if (!$.web2py.isUndefined(input_name)) {
            $('<input type="hidden" />').attr('name', input_name)
            .attr('value', $(this).val()).appendTo($form);
        }
        $form.trigger('submit');
    });
};
single_payment_form_trap();

function edit_payment() {
    var $form = $('#single_payment_form_component form');
    
    $('#payment-confirmation-dialog').modal('hide');
    
    $.web2py.enableFormElements($form);
}

function submit_payment() {
    var $form = $('#single_payment_form_component form');
    
    $('#payment-confirmation-dialog').modal('hide');
    $form.attr('data-already_confirmed', 'true');
    $form.submit();
}
</script>

In the single_payment_form_trap function we shown the payment confirmation 
modal if the already_confirmed data attribute is false - otherwise we 
submit the form normally - this is taken almost directly from web2py.js.

I wouldn't call this a graceful solution - but it will work until an update 
to web2py brakes this assumed component submission algorithm.

I hope that someone finds this useful or at least aids in someone's 
understanding of exactly what happens in Web2Py when you click Submit in a 
form that has been loaded in a component.

Thanks,
Eliot

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to