On Thu, Feb 17, 2011 at 1:05 PM, villas <[email protected]> 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 <[email protected]> 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 <[email protected]> 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
>>
>>