If you are loading separate pages from the same site you may as well redirect. Just use ajax to load small amounts of extra data within a page. Your design, your choice :)
Re: SMS. I tried bulksms.com and it seemed really efficient, but I suppose an SMS service is best chosen depending on what region you are targeting. On Feb 17, 8:38 pm, Marc Smith <msmith...@gmail.com> wrote: > 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 > >