Hi Martín,

Yes, that works well for trapping links inside the component, but what
about using forms? Have you ever used multiple forms instead of links
from one page to another like you are doing below?


Thanks,

Marc

On Fri, Feb 18, 2011 at 5:51 AM, Martín Mulone <mulone.mar...@gmail.com> wrote:
> Yes I do all the time, ajax is not an easy task. You have to remember, LOAD
> create an div id="a414s324s3214" (similar) and you have it in request.cid,
> if you want to update this component and you are in, you have to pass to the
> link the request.cid.
> view/index.html
>
> {{extend 'layout.html'}}
>
> {{=LOAD('default','wizard.load', vars={'page': 1}, ajax=True)}}
>
> view/wizard.load
>
> {{=A('Page 2',_href=URL('default', 'wizard.load', vars={'page': 2}),
> cid=request.cid)
>
> controller/default.py
>
> def wizard():
>
>    if request.vars.page==1:
>
>        content='blabla'
>
>    elif request.vars.page==2:
>
>        content='blabla page2'
>
>    return dict(content)
>
>
> 2011/2/17 Marc Smith <msmith...@gmail.com>
>>
>> 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
>> >>
>> >>
>
>
>
> --
> Pablo Martín Mulone (mar...@tecnodoc.com.ar)
> http://www.tecnodoc.com.ar/
> Paraná, Entre Ríos, Argentina (CP 3100).
> My blog: http://martin.tecnodoc.com.ar
> Expert4Solution Profile:
> http://www.experts4solutions.com/e4s/default/expert/6
>
>
>

Reply via email to