Forms in ajax components and non-ajax components with ajax_trap=True are submitted via ajax, and the form variables are serialized via the jQuery .serialize() method. As explained here (http://api.jquery.com/serialize/), the .serialize() method doesn't know what triggered the form submission, so it cannot include the values of any submit buttons. For now, here is one possible workaround using a hidden field: http://forum.jquery.com/topic/submit-event-serialize-and-submit-buttons-get-the-button-name. Perhaps we can come up with a more general solution. Anthony
On Wednesday, August 3, 2011 11:46:09 PM UTC-4, G wrote: > Hello, > I am trying to make a simple component which has a form that contains > just buttons. It seems to work OK when I use LOAD(... ajax=False) and > have only one component on my page. However, I'd like to have multiple > components on one page. When I tried that, still with ajax=False, > everything looks OK, but the form doesn't do anything (that is, the > action that's supposed to happen when a button is pushed never > happens). Similarly, if I set ajax=True, the same problem occurs (no > action). > I then tried setting ajax_trap = True after which when I click a > button in the component, the component disappears and the text > "invalid request" appears. I found this very difficult to debug, but > finally by putting a print statement in the rewrites.py file I found > that the path that was trying to be accessed looks as follows, from > which it's why it is an invalid request: > > /devel/default/(<gluon.html.XML object at 0x14721510>,) > > What is the correct way to have multiple components with simple > customized forms on a single page? > > The simple component I am using has the following function which uses > the generic.load: > > def inits(): > obs = _getObs() > form = FORM(TABLE(TR(TD(TAG.BUTTON("Reset > Receiver",_type="submit",_name="initRSS", _value="yes")), > TD(TAG.BUTTON("Reset DSP",_type="submit",_name="initDSP", > _value="yes")), > TD(TAG.BUTTON("Auto Level",_type="submit",_name="autoLevel", > _value="yes")), > TD(TAG.BUTTON("Auto Equalize",_type="submit",_name="autoEQ", > _value="yes"))))) > if form.accepts(request.vars,session): > if request.vars.initRSS == 'yes': > print "init RSS" > obs.simpleRSSSetup() > if request.vars.initDSP == 'yes': > print "init DSP" > obs.simpleDSPSetup() > if request.vars.autoLevel == 'yes': > print "autoLevel" > obs.autoLevel() > if request.vars.autoEQ == 'yes': > print "autoEQ" > obs.autoEQ() > return dict(form=form) > > I have a second similar component. I include them both in the larger > page as: > {{=LOAD('default','inits.load')}} > {{=LOAD('default','posControl.load')}} > > Thank you for any suggestions on how to make this work. > G