| 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>
 |