123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The source code</title>
- <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
- <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
- <style type="text/css">
- .highlight { display: block; background-color: #ddd; }
- </style>
- <script type="text/javascript">
- function highlight() {
- document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
- }
- </script>
- </head>
- <body onload="prettyPrint(); highlight();">
- <pre class="prettyprint lang-js"><span id='Ext-form-action-Submit'>/**
- </span> * A class which handles submission of data from {@link Ext.form.Basic Form}s and processes the returned response.
- *
- * Instances of this class are only created by a {@link Ext.form.Basic Form} when
- * {@link Ext.form.Basic#submit submit}ting.
- *
- * # Response Packet Criteria
- *
- * A response packet may contain:
- *
- * - **`success`** property : Boolean - required.
- *
- * - **`errors`** property : Object - optional, contains error messages for invalid fields.
- *
- * # JSON Packets
- *
- * By default, response packets are assumed to be JSON, so a typical response packet may look like this:
- *
- * {
- * success: false,
- * errors: {
- * clientCode: "Client not found",
- * portOfLoading: "This field must not be null"
- * }
- * }
- *
- * Other data may be placed into the response for processing by the {@link Ext.form.Basic}'s callback or event handler
- * methods. The object decoded from this JSON is available in the {@link Ext.form.action.Action#result result} property.
- *
- * Alternatively, if an {@link Ext.form.Basic#errorReader errorReader} is specified as an
- * {@link Ext.data.reader.Xml XmlReader}:
- *
- * errorReader: new Ext.data.reader.Xml({
- * record : 'field',
- * success: '@success'
- * }, [
- * 'id', 'msg'
- * ]
- * )
- *
- * then the results may be sent back in XML format:
- *
- * <?xml version="1.0" encoding="UTF-8"?>
- * <message success="false">
- * <errors>
- * <field>
- * <id>clientCode</id>
- * <msg><![CDATA[Code not found. <br /><i>This is a test validation message from the server </i>]]></msg>
- * </field>
- * <field>
- * <id>portOfLoading</id>
- * <msg><![CDATA[Port not found. <br /><i>This is a test validation message from the server </i>]]></msg>
- * </field>
- * </errors>
- * </message>
- *
- * Other elements may be placed into the response XML for processing by the {@link Ext.form.Basic}'s callback or event
- * handler methods. The XML document is available in the {@link Ext.form.Basic#errorReader errorReader}'s
- * {@link Ext.data.reader.Xml#xmlData xmlData} property.
- */
- Ext.define('Ext.form.action.Submit', {
- extend:'Ext.form.action.Action',
- alternateClassName: 'Ext.form.Action.Submit',
- alias: 'formaction.submit',
- type: 'submit',
- <span id='Ext-form-action-Submit-cfg-clientValidation'> /**
- </span> * @cfg {Boolean} [clientValidation=true]
- * Determines whether a Form's fields are validated in a final call to {@link Ext.form.Basic#isValid isValid} prior
- * to submission. Pass false in the Form's submit options to prevent this.
- */
- // inherit docs
- run : function(){
- var form = this.form;
- if (this.clientValidation === false || form.isValid()) {
- this.doSubmit();
- } else {
- // client validation failed
- this.failureType = Ext.form.action.Action.CLIENT_INVALID;
- form.afterAction(this, false);
- }
- },
- <span id='Ext-form-action-Submit-method-doSubmit'> /**
- </span> * @private
- * Performs the submit of the form data.
- */
- doSubmit: function() {
- var formEl,
- ajaxOptions = Ext.apply(this.createCallback(), {
- url: this.getUrl(),
- method: this.getMethod(),
- headers: this.headers
- });
- // For uploads we need to create an actual form that contains the file upload fields,
- // and pass that to the ajax call so it can do its iframe-based submit method.
- 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);
- }
- },
- <span id='Ext-form-action-Submit-method-getParams'> /**
- </span> * @private
- * Builds the full set of parameters from the field values plus any additional configured params.
- */
- getParams: function() {
- var nope = false,
- configParams = this.callParent(),
- fieldParams = this.form.getValues(nope, nope, this.submitEmptyText !== nope);
- return Ext.apply({}, fieldParams, configParams);
- },
- <span id='Ext-form-action-Submit-method-buildForm'> /**
- </span> * @private
- * Builds a form element containing fields corresponding to all the parameters to be
- * submitted (everything returned by {@link #getParams}.
- *
- * NOTE: the form element is automatically added to the DOM, so any code that uses
- * it must remove it from the DOM after finishing with it.
- *
- * @return {HTMLElement}
- */
- 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
- };
- // Set the proper encoding for file uploads
- if (uploadFields.length) {
- formSpec.encoding = formSpec.enctype = 'multipart/form-data';
- }
- // Create the form
- formEl = Ext.DomHelper.append(Ext.getBody(), formSpec);
- // Special handling for file upload fields: since browser security measures prevent setting
- // their values programatically, and prevent carrying their selected values over when cloning,
- // we have to move the actual field instances out of their components and into the form.
- uLen = uploadFields.length;
- for (u = 0; u < uLen; u++) {
- field = uploadFields[u];
- if (field.rendered) { // can only have a selected file value after being rendered
- formEl.appendChild(field.extractFileInput());
- }
- }
- return formEl;
- },
- <span id='Ext-form-action-Submit-method-onSuccess'> /**
- </span> * @private
- */
- 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);
- },
- <span id='Ext-form-action-Submit-method-handleResponse'> /**
- </span> * @private
- */
- 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);
- }
- });
- </pre>
- </body>
- </html>
|