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

Reply via email to