My first impression was that seem a lot of code in one function.
Maybe better to create some separate functions and redirect depending
on the form no. etc.

Your other strategy of loading the forms via ajax looks promising,
but it looks like it would always load 'one' in the example given:
{{=LOAD(c='default', f='mobile_verify', args='one', extension='load',
ajax=True)}}

I would recommend that you look at the admin app which comes with
web2py.  Look at the controller 'wizard.py' and check out the views
etc.  Spending a few minutes doing that may give you the inspiration
to take a slightly different approach.  At least in making your code a
little cleaner.

-D

On Feb 17, 3:14 am, Marc Smith <msmith...@gmail.com> wrote:
> So, I've been experimenting with this a bit, and if I change the
> form_name.accepts methods to using arguments like this:
> form_name.accepts(request.vars, formname='blah1')
>
> It acts a bit differently -- first form (one) is displayed and
> accepted, and then second form (two) is displayed and when I fill in
> the field and hit submit, it takes me back to the first form?
>
> Is this proper use of the LOAD component, or should I not use my forms
> with this function?
>
> --Marc
>
> On Tue, Feb 15, 2011 at 2:50 PM, Marc Smith <msmith...@gmail.com> wrote:
> > Hi,
>
> > I am having trouble using the LOAD component with forms to produce a
> > "wizard" style multiple form type setup (eg, enter information on one
> > "screen", then go to the next, etc.).
>
> > If I move my mobile_verify.load file to mobile_verify.html and visit
> >http://localhost/myapp/default/mobile_verify/one-- the form seems to
> > work fine. When I keep it as a .load and it loads up in my layout, the
> > first form works fine, I click submit and it goes to the next form,
> > but the second form seems to be "stuck". When I click submit on the
> > second form (mobile_verify/two), it brings me back to the same form.
> > It appears request.vars is empty and thats why the .accepts returns
> > false and keeps me on that form?
>
> > In my controller I have this:
> > --snip--
> > @auth.requires_login()
> > def mobile_verify():
> >    """
> >    Mobile phone number verification.
> >    """
> >    # Make the user's phone number look nice
> >    pretty_phone = '(' + auth.user.mobile[0:3] + ') '+ \
> >                 auth.user.mobile[3:6] + '-' + auth.user.mobile[6:10]
>
> >    if request.args(0) == 'one':
> >        # Form to pick verification method
> >        vrfy_method_form = FORM(FIELDSET(INPUT(_type='radio',
> > _name='verify_method',
> >                                               _value='SMS'),
> >                                         'Send me a text (SMS)
> > message'),
> >                                FIELDSET(INPUT(_type='radio',
> > _name='verify_method',
> >                                               _value='VOICE'),
> >                                         'Call (voice) my mobile
> > phone'),
> >                                CENTER(INPUT(_id='text_me_button',
> > _type='submit',
> >                                             _value='Text me!'),
> >                                       INPUT(_id='call_me_button',
> > _type='submit',
> >                                             _value='Call me!')))
>
> >        if vrfy_method_form.accepts(request.vars, session):
> >            #session.flash = 'vrfy_method_form accepted'
> >            session.verify_method = request.vars.verify_method
> >            redirect(URL('mobile_verify', args='two'))
>
> >        return dict(vrfy_method_form=vrfy_method_form,
> > page_title='blah',
> >                    pretty_phone=pretty_phone)
>
> >    elif request.args(0) == 'two':
> >        # Form to check verification code
> >        chk_code_form = FORM(CENTER(FIELDSET('Type the verification
> > code here:',
>
> > INPUT(_name='verify_code',
>
> > requires=IS_NOT_EMPTY())),
> >                                    FIELDSET(INPUT(_type='submit'))))
>
> >        if chk_code_form.accepts(request.vars, session):
> >            #session.flash = 'chk_code_form accepted'
> >            session.typed_code = str(request.vars.verify_code)
> >            redirect(URL('mobile_verify', args='three'))
>
> >        # Verification code
> >        code = random.randint(100000, 999999)
>
> >        return dict(pretty_phone=pretty_phone,
> > chk_code_form=chk_code_form,
> >                    code=code, page_title='blah')
>
> >    elif request.args(0) == 'three':
> >        return dict(page_title='blah', pretty_phone=pretty_phone)
> > --snip--
>
> > For my mobile_verify.load file:
> > --snip--
> > {{if request.args(0) == 'one':}}
> >        <h4>How should we verify your mobile phone number?</h4>
> >        <center>
> >                My mobile phone: <strong>{{=pretty_phone}}</strong>
> >                <br/>
> >                <a href="{{=URL('user', args='profile')}}">Wrong phone 
> > number?</a>
> >        </center>
> >        <br/>
> >        {{=vrfy_method_form}}
> >        <script>
> >                jQuery(document).ready(function() {
> >                        jQuery('#text_me_button').hide();
> >                        jQuery('#call_me_button').hide();
> >                        
> > jQuery('input[name="verify_method"]').change(function() {
> >                                if 
> > (jQuery('input[name="verify_method"]:checked').val() == 'SMS')
> > {
> >                                        jQuery('#call_me_button').hide();
> >                                        jQuery('#text_me_button').show();
> >                                } else {
> >                                        jQuery('#text_me_button').hide();
> >                                        jQuery('#call_me_button').show();
> >                                }
> >                        });
> >                });
> >        </script>
> > {{elif request.args(0) == 'two':}}
> >        {{if session.verify_method == 'SMS':}}
> >                {{#SendSMS(auth.user.mobile, code)}}
> >                An SMS text message has been sent to your mobile phone.
> >                {{=code}}
> >        {{else:}}
> >                {{#OriginateCall(auth.user.mobile, code)}}
> >                Your phone is ringing, please answer it.
> >                {{=code}}
> >        {{pass}}
> >        {{session.verify_code = str(code)}}
> >        {{=chk_code_form}}
> > {{elif request.args(0) == 'three':}}
> >        {{if session.typed_code == session.verify_code:}}
> >                <h4>Success!</h4>
> >                You should now add some contacts. Click <a 
> > href="{{=URL('auth_user',
> > args='manage_contacts')}}">here</a> to manage your contacts.
> >        {{else:}}
> >                <h4>Sorry, but the code you entered didn't work.</h4>
> >                Click <a href="{{=URL('auth_user', 
> > args='statistics')}}">here</a> to
> > try validating your phone again.
> >        {{pass}}
> > {{pass}}
> > --snip--
>
> > For the view that calls the LOAD function:
> > {{extend 'layout.html'}}
> > <div id="box3" class="box-style">
> >        <h2 class="title">{{=page_title}}</h2>
> >        <div class="content">
> >                {{if auth.user.phone_verified == False:}}
> >                        {{=LOAD(c='default', f='mobile_verify', args='one',
> > extension='load', ajax=True)}}
> >                {{else:}}
> >                        <p>blah</p>
> >                {{pass}}
> >        </div>
> > </div>
> > --snip--
>
> > Help! Any ideas are greatly appreciated.
>
> > Version 1.91.6 (2011-01-03 17:55:14)
>
> > --Marc
>
>

Reply via email to