Wow! I just found this post:
http://groups.google.com/group/web2py/browse_thread/thread/27bf920f49fc8504/510cd7d66f9a4ccb
I tried this and it fixes my problem!

Carlos: Is this fine to keep the response stuff in there? And to keep
the web2py_ajax.html modifications? It won't affect other forms or
anything else?


Thanks!


--Marc

On Fri, Feb 18, 2011 at 12:48 PM, Martín Mulone <mulone.mar...@gmail.com> wrote:
>> This seems to create a second LOAD component inside the first DIV, so
>> not quite what I'm looking for.
>
> You are right my bad, let me think about it.
> 2011/2/18 Marc Smith <msmith...@gmail.com>
>>
>> On Fri, Feb 18, 2011 at 9:46 AM, Martín Mulone <mulone.mar...@gmail.com>
>> wrote:
>> > Ok, I think now I understood. Is a good question.
>> > Try something like this, never do a redirect() after accepts because
>> > web2py
>> > do full redirect. I don't know is something like this work:
>>
>> The redirect inside of the LOAD component does seem to work fine --
>> when I click the submit button on the first page/form, it goes to the
>> next page/form inside of the DIV component (the whole page / URL is
>> NOT changed). The problem seems to do with using a second form inside
>> of the same DIV component -- the form doesn't submit properly or
>> something wrong with the second redirect.
>>
>> I also noticed when I progress from the first form to the second, the
>> AJAX "flash" message appears, and then I click that box, it goes away
>> (the flash message), and then right after the same message is
>> displayed again, but instead of the fade in (like flash message uses),
>> it slides down like the error messages do. Crazy eh?
>>
>> I don't know enough about JavaScript / AJAX, but I'm pretty confident
>> the problem lies there -- probably with the web2py_trap_form function.
>>
>> I tested another theory, if in the LOAD function I specify the second
>> form/page as the start point, that form works fine (page two ->
>> three). So it seems its only an issue when having already had one form
>> completed and then trying to submit the next.
>>
>> Again, this form wizard thing works fine when not using the LOAD
>> component.
>>
>>
>> > form = SQLFORM(db.mywiz)
>> > if form.accepts(request.vars, session):
>> >    response.flash = 'form submitted'
>> >    form = LOAD('default','wizard.load', vars={'page': 2}, ajax=True)
>> > return dict(form=form)
>>
>> This seems to create a second LOAD component inside the first DIV, so
>> not quite what I'm looking for.
>>
>>
>> --Marc
>> >
>> >
>> >
>> > 2011/2/18 Marc Smith <msmith...@gmail.com>
>> >>
>> >> 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
>> >> >
>> >> >
>> >> >
>> >
>> >
>> >
>> > --
>> > 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
>> >
>> >
>> >
>
>
>
> --
> 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