Ext.define('Ext.form.action.Submit', {
extend:'Ext.form.action.Action',
alternateClassName: 'Ext.form.Action.Submit',
alias: 'formaction.submit',
type: 'submit',
run : function(){
var form = this.form;
if (this.clientValidation === false || form.isValid()) {
this.doSubmit();
} else {
this.failureType = Ext.form.action.Action.CLIENT_INVALID;
form.afterAction(this, false);
}
},
doSubmit: function() {
var formEl,
ajaxOptions = Ext.apply(this.createCallback(), {
url: this.getUrl(),
method: this.getMethod(),
headers: this.headers
});
if (this.form.hasUpload()) {
formEl = ajaxOptions.form = this.buildForm();
ajaxOptions.isUpload = true;
} else {
ajaxOptions.params = this.getParams();
}
Ext.Ajax.request(ajaxOptions);
if (formEl) {
Ext.removeNode(formEl);
}
},
getParams: function() {
var nope = false,
configParams = this.callParent(),
fieldParams = this.form.getValues(nope, nope, this.submitEmptyText !== nope);
return Ext.apply({}, fieldParams, configParams);
},
buildForm: function() {
var fieldsSpec = [],
formSpec,
formEl,
basicForm = this.form,
params = this.getParams(),
uploadFields = [],
fields = basicForm.getFields().items,
f,
fLen = fields.length,
field, key, value, v, vLen,
u, uLen;
for (f = 0; f < fLen; f++) {
field = fields[f];
if (field.isFileUpload()) {
uploadFields.push(field);
}
}
function addField(name, val) {
fieldsSpec.push({
tag: 'input',
type: 'hidden',
name: name,
value: Ext.String.htmlEncode(val)
});
}
for (key in params) {
if (params.hasOwnProperty(key)) {
value = params[key];
if (Ext.isArray(value)) {
vLen = value.length;
for (v = 0; v < vLen; v++) {
addField(key, value[v]);
}
} else {
addField(key, value);
}
}
}
formSpec = {
tag: 'form',
action: this.getUrl(),
method: this.getMethod(),
target: this.target || '_self',
style: 'display:none',
cn: fieldsSpec
};
if (uploadFields.length) {
formSpec.encoding = formSpec.enctype = 'multipart/form-data';
}
formEl = Ext.DomHelper.append(Ext.getBody(), formSpec);
uLen = uploadFields.length;
for (u = 0; u < uLen; u++) {
field = uploadFields[u];
if (field.rendered) {
formEl.appendChild(field.extractFileInput());
}
}
return formEl;
},
onSuccess: function(response) {
var form = this.form,
success = true,
result = this.processResponse(response);
if (result !== true && !result.success) {
if (result.errors) {
form.markInvalid(result.errors);
}
this.failureType = Ext.form.action.Action.SERVER_INVALID;
success = false;
}
form.afterAction(this, success);
},
handleResponse: function(response) {
var form = this.form,
errorReader = form.errorReader,
rs, errors, i, len, records;
if (errorReader) {
rs = errorReader.read(response);
records = rs.records;
errors = [];
if (records) {
for(i = 0, len = records.length; i < len; i++) {
errors[i] = records[i].data;
}
}
if (errors.length < 1) {
errors = null;
}
return {
success : rs.success,
errors : errors
};
}
return Ext.decode(response.responseText);
}
});