On Thu, Feb 17, 2011 at 1:05 PM, villas <villa...@gmail.com> wrote:
> 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.

Sorry -- it started nice, but as I moved and tried different things,
it got a bit messy.


>
> 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)}}

Correct -- the first "page" (form one) it would always display is
mobile_verify/one (the start of the "wizard").


>
> 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.

Yes, their example is very nice -- using separate functions for the
steps does make it look a lot cleaner, however, they aren't using the
LOAD feature for the wizard (the browser goes to a new URL for each
step).

Maybe the LOAD / AJAX stuff just doesn't work with multiple steps /
forms like I'm trying to do?
Has anyone ever gotten it to work this way?

Its not the end of the world, I can have the wizard go to new pages
each time, but I just wanted to try something different. =)


--Marc
>
> -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