DataWriter.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:9k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.1.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. /**
  8.  * @class Ext.data.DataWriter
  9.  * <p>Ext.data.DataWriter facilitates create, update, and destroy actions between
  10.  * an Ext.data.Store and a server-side framework. A Writer enabled Store will
  11.  * automatically manage the Ajax requests to perform CRUD actions on a Store.</p>
  12.  * <p>Ext.data.DataWriter is an abstract base class which is intended to be extended
  13.  * and should not be created directly. For existing implementations, see
  14.  * {@link Ext.data.JsonWriter}.</p>
  15.  * <p>Creating a writer is simple:</p>
  16.  * <pre><code>
  17. var writer = new Ext.data.JsonWriter({
  18.     encode: false   // &lt;--- false causes data to be printed to jsonData config-property of Ext.Ajax#reqeust
  19. });
  20.  * </code></pre>
  21.  * * <p>Same old JsonReader as Ext-2.x:</p>
  22.  * <pre><code>
  23. var reader = new Ext.data.JsonReader({idProperty: 'id'}, [{name: 'first'}, {name: 'last'}, {name: 'email'}]);
  24.  * </code></pre>
  25.  *
  26.  * <p>The proxy for a writer enabled store can be configured with a simple <code>url</code>:</p>
  27.  * <pre><code>
  28. // Create a standard HttpProxy instance.
  29. var proxy = new Ext.data.HttpProxy({
  30.     url: 'app.php/users'    // &lt;--- Supports "provides"-type urls, such as '/users.json', '/products.xml' (Hello Rails/Merb)
  31. });
  32.  * </code></pre>
  33.  * <p>For finer grained control, the proxy may also be configured with an <code>API</code>:</p>
  34.  * <pre><code>
  35. // Maximum flexibility with the API-configuration
  36. var proxy = new Ext.data.HttpProxy({
  37.     api: {
  38.         read    : 'app.php/users/read',
  39.         create  : 'app.php/users/create',
  40.         update  : 'app.php/users/update',
  41.         destroy : {  // &lt;--- Supports object-syntax as well
  42.             url: 'app.php/users/destroy',
  43.             method: "DELETE"
  44.         }
  45.     }
  46. });
  47.  * </code></pre>
  48.  * <p>Pulling it all together into a Writer-enabled Store:</p>
  49.  * <pre><code>
  50. var store = new Ext.data.Store({
  51.     proxy: proxy,
  52.     reader: reader,
  53.     writer: writer,
  54.     autoLoad: true,
  55.     autoSave: true  // -- Cell-level updates.
  56. });
  57.  * </code></pre>
  58.  * <p>Initiating write-actions <b>automatically</b>, using the existing Ext2.0 Store/Record API:</p>
  59.  * <pre><code>
  60. var rec = store.getAt(0);
  61. rec.set('email', 'foo@bar.com');  // &lt;--- Immediately initiates an UPDATE action through configured proxy.
  62. store.remove(rec);  // &lt;---- Immediately initiates a DESTROY action through configured proxy.
  63.  * </code></pre>
  64.  * <p>For <b>record/batch</b> updates, use the Store-configuration {@link Ext.data.Store#autoSave autoSave:false}</p>
  65.  * <pre><code>
  66. var store = new Ext.data.Store({
  67.     proxy: proxy,
  68.     reader: reader,
  69.     writer: writer,
  70.     autoLoad: true,
  71.     autoSave: false  // -- disable cell-updates
  72. });
  73. var urec = store.getAt(0);
  74. urec.set('email', 'foo@bar.com');
  75. var drec = store.getAt(1);
  76. store.remove(drec);
  77. // Push the button!
  78. store.save();
  79.  * </code></pre>
  80.  * @constructor Create a new DataWriter
  81.  * @param {Object} meta Metadata configuration options (implementation-specific)
  82.  * @param {Object} recordType Either an Array of field definition objects as specified
  83.  * in {@link Ext.data.Record#create}, or an {@link Ext.data.Record} object created
  84.  * using {@link Ext.data.Record#create}.
  85.  */
  86. Ext.data.DataWriter = function(config){
  87.     Ext.apply(this, config);
  88. };
  89. Ext.data.DataWriter.prototype = {
  90.     /**
  91.      * @cfg {Boolean} writeAllFields
  92.      * <tt>false</tt> by default.  Set <tt>true</tt> to have DataWriter return ALL fields of a modified
  93.      * record -- not just those that changed.
  94.      * <tt>false</tt> to have DataWriter only request modified fields from a record.
  95.      */
  96.     writeAllFields : false,
  97.     /**
  98.      * @cfg {Boolean} listful
  99.      * <tt>false</tt> by default.  Set <tt>true</tt> to have the DataWriter <b>always</b> write HTTP params as a list,
  100.      * even when acting upon a single record.
  101.      */
  102.     listful : false,    // <-- listful is actually not used internally here in DataWriter.  @see Ext.data.Store#execute.
  103.     /**
  104.      * Compiles a Store recordset into a data-format defined by an extension such as {@link Ext.data.JsonWriter} or {@link Ext.data.XmlWriter} in preparation for a {@link Ext.data.Api#actions server-write action}.  The first two params are similar similar in nature to {@link Ext#apply},
  105.      * Where the first parameter is the <i>receiver</i> of paramaters and the second, baseParams, <i>the source</i>.
  106.      * @param {Object} params The request-params receiver.
  107.      * @param {Object} baseParams as defined by {@link Ext.data.Store#baseParams}.  The baseParms must be encoded by the extending class, eg: {@link Ext.data.JsonWriter}, {@link Ext.data.XmlWriter}.
  108.      * @param {String} action [{@link Ext.data.Api#actions create|update|destroy}]
  109.      * @param {Record/Record[]} rs The recordset to write, the subject(s) of the write action.
  110.      */
  111.     apply : function(params, baseParams, action, rs) {
  112.         var data    = [],
  113.         renderer    = action + 'Record';
  114.         // TODO implement @cfg listful here
  115.         if (Ext.isArray(rs)) {
  116.             Ext.each(rs, function(rec){
  117.                 data.push(this[renderer](rec));
  118.             }, this);
  119.         }
  120.         else if (rs instanceof Ext.data.Record) {
  121.             data = this[renderer](rs);
  122.         }
  123.         this.render(params, baseParams, data);
  124.     },
  125.     /**
  126.      * abstract method meant to be overridden by all DataWriter extensions.  It's the extension's job to apply the "data" to the "params".
  127.      * The data-object provided to render is populated with data according to the meta-info defined in the user's DataReader config,
  128.      * @param {String} action [Ext.data.Api.actions.create|read|update|destroy]
  129.      * @param {Record[]} rs Store recordset
  130.      * @param {Object} params Http params to be sent to server.
  131.      * @param {Object} data object populated according to DataReader meta-data.
  132.      */
  133.     render : Ext.emptyFn,
  134.     /**
  135.      * @cfg {Function} updateRecord Abstract method that should be implemented in all subclasses
  136.      * (e.g.: {@link Ext.data.JsonWriter#updateRecord JsonWriter.updateRecord}
  137.      */
  138.     updateRecord : Ext.emptyFn,
  139.     /**
  140.      * @cfg {Function} createRecord Abstract method that should be implemented in all subclasses
  141.      * (e.g.: {@link Ext.data.JsonWriter#createRecord JsonWriter.createRecord})
  142.      */
  143.     createRecord : Ext.emptyFn,
  144.     /**
  145.      * @cfg {Function} destroyRecord Abstract method that should be implemented in all subclasses
  146.      * (e.g.: {@link Ext.data.JsonWriter#destroyRecord JsonWriter.destroyRecord})
  147.      */
  148.     destroyRecord : Ext.emptyFn,
  149.     /**
  150.      * Converts a Record to a hash, taking into account the state of the Ext.data.Record along with configuration properties
  151.      * related to its rendering, such as {@link #writeAllFields}, {@link Ext.data.Record#phantom phantom}, {@link Ext.data.Record#getChanges getChanges} and
  152.      * {@link Ext.data.DataReader#idProperty idProperty}
  153.      * @param {Ext.data.Record}
  154.      * @param {Object} config <b>NOT YET IMPLEMENTED</b>.  Will implement an exlude/only configuration for fine-control over which fields do/don't get rendered.
  155.      * @return {Object}
  156.      * @protected
  157.      * TODO Implement excludes/only configuration with 2nd param?
  158.      */
  159.     toHash : function(rec, config) {
  160.         var map = rec.fields.map,
  161.             data = {},
  162.             raw = (this.writeAllFields === false && rec.phantom === false) ? rec.getChanges() : rec.data,
  163.             m;
  164.         Ext.iterate(raw, function(prop, value){
  165.             if((m = map[prop])){
  166.                 data[m.mapping ? m.mapping : m.name] = value;
  167.             }
  168.         });
  169.         // we don't want to write Ext auto-generated id to hash.  Careful not to remove it on Models not having auto-increment pk though.
  170.         // We can tell its not auto-increment if the user defined a DataReader field for it *and* that field's value is non-empty.
  171.         // we could also do a RegExp here for the Ext.data.Record AUTO_ID prefix.
  172.         if (rec.phantom) {
  173.             if (rec.fields.containsKey(this.meta.idProperty) && Ext.isEmpty(rec.data[this.meta.idProperty])) {
  174.                 delete data[this.meta.idProperty];
  175.             }
  176.         } else {
  177.             data[this.meta.idProperty] = rec.id
  178.         }
  179.         return data;
  180.     },
  181.     /**
  182.      * Converts a {@link Ext.data.DataWriter#toHash Hashed} {@link Ext.data.Record} to fields-array array suitable
  183.      * for encoding to xml via XTemplate, eg:
  184. <code><pre>&lt;tpl for=".">&lt;{name}>{value}&lt;/{name}&lt;/tpl></pre></code>
  185.      * eg, <b>non-phantom</b>:
  186. <code><pre>{id: 1, first: 'foo', last: 'bar'} --> [{name: 'id', value: 1}, {name: 'first', value: 'foo'}, {name: 'last', value: 'bar'}]</pre></code>
  187.      * {@link Ext.data.Record#phantom Phantom} records will have had their idProperty omitted in {@link #toHash} if determined to be auto-generated.
  188.      * Non AUTOINCREMENT pks should have been protected.
  189.      * @param {Hash} data Hashed by Ext.data.DataWriter#toHash
  190.      * @return {[Object]} Array of attribute-objects.
  191.      * @protected
  192.      */
  193.     toArray : function(data) {
  194.         var fields = [];
  195.         Ext.iterate(data, function(k, v) {fields.push({name: k, value: v});},this);
  196.         return fields;
  197.     }
  198. };