While creating an ExtJS form with several radio buttons today I ran into a bug which caused none of them to work as expected, even though there were no errors/exceptions. To cut a long story short, it was because I was setting the name to "schedule[include_type]" - like this:
{
xtype: 'radio',
name: 'schedule[include_type]',
inputValue: 'page',
boxLabel: 'Show page:'
}
{
xtype: 'radio',
name: 'schedule[include_type]',
inputValue: 'page',
boxLabel: 'Show page:'
}
This radio button is one of 4, which allows the user which type of file they want to include on a particular model (a Schedule in this case) - be it Page, Video, Category or one other. The thing is - none of them work with the square brackets in the name. If you remove the brackets, they all work correctly, but the server-side is relying on those brackets to be present to group the data correctly.
In the end I bit the bullet and updated my submit method to add a new parameter directly - here's a full example:
form = new Ext.form.FormPanel({
items: [
{
xtype: 'radio',
name: 'include_type',
inputValue: 'page',
boxLabel: 'Show page:'
},
{
xtype: 'radio',
name: 'include_type',
inputValue: 'category',
boxLabel: 'Show category:'
},
... plus some extra items
],
buttons: [
{
text: 'Save',
handler: function() {
//find the currently selected include_type from the form
var include_type = this.form.getValues()['include_type'];
//note the params option - this needs to be added manually otherwhise
//schedule[include_type] won't appear
form.form.submit({
waitMsg: 'Saving Data...',
params: "schedule[include_type]=" + include_type,
url: some url...
});
}
}
]
})
form = new Ext.form.FormPanel({
items: [
{
xtype: 'radio',
name: 'include_type',
inputValue: 'page',
boxLabel: 'Show page:'
},
{
xtype: 'radio',
name: 'include_type',
inputValue: 'category',
boxLabel: 'Show category:'
},
... plus some extra items
],
buttons: [
{
text: 'Save',
handler: function() {
//find the currently selected include_type from the form
var include_type = this.form.getValues()['include_type'];
//note the params option - this needs to be added manually otherwhise
//schedule[include_type] won't appear
form.form.submit({
waitMsg: 'Saving Data...',
params: "schedule[include_type]=" + include_type,
url: some url...
});
}
}
]
})
Note: I don't usually add buttons in the way above so I'm not sure if the form.form.submit will work correctly here - see http://extjs.com/deploy/dev/docs/?class=Ext.form.FormPanel for information about overriding submit.
So what we're doing here is finding which radio button is currently checked, and appending this under "schedule[include_type]" when POSTing the form variables to the server. This really isn't pleasant but seems to be the best way around this limitation for now.
I regularly use square brackets in other Ext JS Fields - Radio Buttons seem to be the only ones that have this problem. http://extjs.com/forum/showthread.php?p=185296 has a bit of background behind this, but no real solution.