DataWriter_wev8.js
6.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
/*!
* Ext JS Library 3.0.0
* Copyright(c) 2006-2009 Ext JS, LLC
* licensing@extjs.com
* http://www.extjs.com/license
*/
/**
* @class Ext.data.DataWriter
* <p>Ext.data.DataWriter facilitates create, update, and destroy actions between
* an Ext.data.Store and a server-side framework. A Writer enabled Store will
* automatically manage the Ajax requests to perform CRUD actions on a Store.</p>
* <p>Ext.data.DataWriter is an abstract base class which is intended to be extended
* and should not be created directly. For existing implementations, see
* {@link Ext.data.JsonWriter}.</p>
* <p>Creating a writer is simple:</p>
* <pre><code>
var writer = new Ext.data.JsonWriter();
* </code></pre>
* <p>The proxy for a writer enabled store can be configured with a simple <code>url</code>:</p>
* <pre><code>
// Create a standard HttpProxy instance.
var proxy = new Ext.data.HttpProxy({
url: 'app.php/users'
});
* </code></pre>
* <p>For finer grained control, the proxy may also be configured with an <code>api</code>:</p>
* <pre><code>
// Use the api specification
var proxy = new Ext.data.HttpProxy({
api: {
read : 'app.php/users/read',
create : 'app.php/users/create',
update : 'app.php/users/update',
destroy : 'app.php/users/destroy'
}
});
* </code></pre>
* <p>Creating a Writer enabled store:</p>
* <pre><code>
var store = new Ext.data.Store({
proxy: proxy,
reader: reader,
writer: writer
});
* </code></pre>
* @constructor Create a new DataWriter
* @param {Object} meta Metadata configuration options (implementation-specific)
* @param {Object} recordType Either an Array of field definition objects as specified
* in {@link Ext.data.Record#create}, or an {@link Ext.data.Record} object created
* using {@link Ext.data.Record#create}.
*/
Ext.data.DataWriter = function(config){
/**
* This DataWriter's configured metadata as passed to the constructor.
* @type Mixed
* @property meta
*/
Ext.apply(this, config);
};
Ext.data.DataWriter.prototype = {
/**
* @cfg {Boolean} writeAllFields
* <tt>false</tt> by default. Set <tt>true</tt> to have DataWriter return ALL fields of a modified
* record -- not just those that changed.
* <tt>false</tt> to have DataWriter only request modified fields from a record.
*/
writeAllFields : false,
/**
* @cfg {Boolean} listful
* <tt>false</tt> by default. Set <tt>true</tt> to have the DataWriter <b>always</b> write HTTP params as a list,
* even when acting upon a single record.
*/
listful : false, // <-- listful is actually not used internally here in DataWriter. @see Ext.data.Store#execute.
/**
* Writes data in preparation for server-write action. Simply proxies to DataWriter#update, DataWriter#create
* DataWriter#destroy.
* @param {String} action [CREATE|UPDATE|DESTROY]
* @param {Object} params The params-hash to write-to
* @param {Record/Record[]} rs The recordset write.
*/
write : function(action, params, rs) {
this.render(action, rs, params, this[action](rs));
},
/**
* abstract method meant to be overridden by all DataWriter extensions. It's the extension's job to apply the "data" to the "params".
* The data-object provided to render is populated with data according to the meta-info defined in the user's DataReader config,
* @param {String} action [Ext.data.Api.actions.create|read|update|destroy]
* @param {Record[]} rs Store recordset
* @param {Object} params Http params to be sent to server.
* @param {Object} data object populated according to DataReader meta-data.
*/
render : Ext.emptyFn,
/**
* update
* @param {Object} p Params-hash to apply result to.
* @param {Record/Record[]} rs Record(s) to write
* @private
*/
update : function(rs) {
var params = {};
if (Ext.isArray(rs)) {
var data = [],
ids = [];
Ext.each(rs, function(val){
ids.push(val.id);
data.push(this.updateRecord(val));
}, this);
params[this.meta.idProperty] = ids;
params[this.meta.root] = data;
}
else if (rs instanceof Ext.data.Record) {
params[this.meta.idProperty] = rs.id;
params[this.meta.root] = this.updateRecord(rs);
}
return params;
},
/**
* @cfg {Function} saveRecord Abstract method that should be implemented in all subclasses
* (e.g.: {@link Ext.data.JsonWriter#saveRecord JsonWriter.saveRecord}
*/
updateRecord : Ext.emptyFn,
/**
* create
* @param {Object} p Params-hash to apply result to.
* @param {Record/Record[]} rs Record(s) to write
* @private
*/
create : function(rs) {
var params = {};
if (Ext.isArray(rs)) {
var data = [];
Ext.each(rs, function(val){
data.push(this.createRecord(val));
}, this);
params[this.meta.root] = data;
}
else if (rs instanceof Ext.data.Record) {
params[this.meta.root] = this.createRecord(rs);
}
return params;
},
/**
* @cfg {Function} createRecord Abstract method that should be implemented in all subclasses
* (e.g.: {@link Ext.data.JsonWriter#createRecord JsonWriter.createRecord})
*/
createRecord : Ext.emptyFn,
/**
* destroy
* @param {Object} p Params-hash to apply result to.
* @param {Record/Record[]} rs Record(s) to write
* @private
*/
destroy : function(rs) {
var params = {};
if (Ext.isArray(rs)) {
var data = [],
ids = [];
Ext.each(rs, function(val){
data.push(this.destroyRecord(val));
}, this);
params[this.meta.root] = data;
} else if (rs instanceof Ext.data.Record) {
params[this.meta.root] = this.destroyRecord(rs);
}
return params;
},
/**
* @cfg {Function} destroyRecord Abstract method that should be implemented in all subclasses
* (e.g.: {@link Ext.data.JsonWriter#destroyRecord JsonWriter.destroyRecord})
*/
destroyRecord : Ext.emptyFn,
/**
* Converts a Record to a hash
* @param {Record}
* @private
*/
toHash : function(rec) {
var map = rec.fields.map,
data = {},
raw = (this.writeAllFields === false && rec.phantom === false) ? rec.getChanges() : rec.data,
m;
Ext.iterate(raw, function(prop, value){
if((m = map[prop])){
data[m.mapping ? m.mapping : m.name] = value;
}
});
data[this.meta.idProperty] = rec.id;
return data;
}
};