Hi Marc, I believe my fix does not break anything, but much more testing is certainly required to be sure.
If you find problems, please let me know. If there are no problems after testing, I believe this fix should be included in web2py ... Massimo?. https://groups.google.com/forum/?fromgroups#!topic/web2py/J7-SD0n8hQQ Regards, Carlos On Feb 18, 12:53 pm, Marc Smith <msmith...@gmail.com> wrote: > Wow! I just found this > post:http://groups.google.com/group/web2py/browse_thread/thread/27bf920f49... > 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... > > read more »