09.05.2012, 16:21
|
Профессор
|
|
Регистрация: 23.08.2008
Сообщений: 162
|
|
GridPanel и сохранение изменённых/добавленных данных в БД ???
Добрый День!
Я понимаю, что вопрос с бородой, но прогуглив 2-а дня, так и не смог сохранить изменённую строчку Ext.grid.GridPanel в БД. Поэтому пишу сюда ...
Имею Модель, Хранилище и Грид (код ниже).
Данные с сервера приходят и отображаются в гриде, а вот сохранить на Сервере в БД никак не получается.
При нажатии в гриде на UPDATE - на Сервер в виде параметров приходит только какой-то _dc и всё.
А, что бы записать данные в БД, на серваке мне надо получить:
1) id-записи
2) Names - изменённых полей и их новые Values, что бы занести их в БД.
То есть что бы сформировать Скул-запрос:
UPDATE MyTable SET Names=@Values WHERE id=@id
Профи подскажите что надо убрать/добавить/переделать в моём коде:
//Модель:
Ext.require(['Ext.data.*', 'Ext.grid.*']);
Ext.define('MyDoc', {
extend: 'Ext.data.Model',
fields: [{
name: 'MyDocID',
type: 'int',
useNull: true
}, 'upID', 'ID_Red', 'MyDocTemaA'],
validations: [{
type: 'length',
field: 'upID',
min: 1
}, {
type: 'length',
field: 'ID_Red',
min: 1
}, {
type: 'length',
field: 'MyDocTemaA',
min: 1
}]
});
//Хранилище
var storeMyDocs = Ext.create('Ext.data.JsonStore', { //JsonStore - определение хранилища для удаленного источника данных
idProperty: 'MyDocID',
loadMask: true,
autoLoad: true,
autoSync: true, // указание на автосохранения в хранилище, при каждом изменении одно записи
pageSize: 12, // - количество считываемх за раз записей
//fields: [{ name: "MyDocID" }, { name: "upID" }, { name: "ID_Red" }, { name: "MyDocTemaA"}],
model: 'MyDoc',
proxy: {
type: 'rest', //ajax - тип прокси "Ajax"
url: "MyDocs.ashx?upID=" + UserID,
reader: {
type: "json",
root: "mydoc"
},
writer: {
restful: true,
type: "json",
root: "mydoc"
},
timeout: 120000 //2 minutes
},
listeners: {
load: function (store, records, successful) {
if (this.getCount() == 0) {
this.sync();
}
},
write: function (store, operation) {
var record = operation.getRecords()[0],
name = Ext.String.capitalize(operation.action),
verb;
if (name == 'Destroy') {
record = operation.records[0];
verb = 'Destroyed';
} else {
verb = name + 'd';
}
Ext.example.msg(name, Ext.String.format("{0} user: {1}", verb, record.getId()));
}
}
});
//Ну и сам Грид:
var gridMyDocs = new Ext.grid.GridPanel({
//id: 'gridMyDocs',
region: "center",
autoScroll: true,
loadMask: true,
store: storeMyDocs,
columns: [
{ text: "№", dataIndex: "MyDocID", width: 100, hidden: true },
{ text: "Пользователь", dataIndex: "upID", width: 100, hidden: true },
{ text: "id_red", dataIndex: "ID_Red", width: 100, hidden: true },
{ text: "Наименование", dataIndex: "MyDocTemaA", sortable: true, resizable: true, flex: 1, editor: { xtype: 'textfield'} },
],
plugins: [
Ext.create('Ext.grid.plugin.RowEditing', {
clicksToEdit: 1
})
],
bbar: new Ext.PagingToolbar({
store: storeMyDocs, // указано хранилище
displayInfo: true, // вывести инфо обо общем числе записей
displayMsg: 'Showing {0} - {1} of {2}' // формат инфо
}),
listeners: { //Дабл Клик
itemdblclick: function (dv, record, item, index, e) {
FunPanelShow("-1", "Мои документы: " + record.get('MyDocTemaA'), record.get('ID_Red'), "0");
}
}
});
П.С. Над кодом, за 2-а дня, много экспериментировал, да и там есть лишнее, поэтому не судите строго ...
Последний раз редактировалось potkin, 09.05.2012 в 17:23.
|
|
09.05.2012, 21:26
|
Профессор
|
|
Регистрация: 04.02.2011
Сообщений: 1,815
|
|
_dc - передаётся в get, и используется при кешировании.
Я так понимаю вы ищете свои данные в get, вы их там конечно же не найдёте.
Для передачи данных на сервер используется либо PUT либо POST запрос.
Примеры на php
put
var_dump(file_get_contents('php://input'));
post
print_r($_POST);
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Последний раз редактировалось DjDiablo, 09.05.2012 в 22:19.
|
|
09.05.2012, 23:12
|
Профессор
|
|
Регистрация: 23.08.2008
Сообщений: 162
|
|
DjDiablo,
Юзаю ASP.NET, который при приёмй данных, показывает метод:
context.Request.HttpMethod = POST
Принимаю на сервере так:
string upID = context.Request.QueryString["upID"]; //ID-пользователя.
Цитата:
|
Для передачи данных на сервер используется либо PUT либо POST запрос.
|
То есть я неправильно указал, что-то в Хранилище Грида ExtJS-а ???
Подскажите, пожалуйста как поменять в ExtJS метод передачи данных на Сервер, а то у меня только:
...
type: 'rest',
//или
type: 'ajax',
П.С. Кстати, смотрел на Сервере в параметрах "Request-а" есть ещё 63 параметра:
1) _dc
2) __utmz
3) __utma
4) ...
n) ALL_HTTP
...
Может какой-то из этих параметров содержит нужные данные ???
|
|
10.05.2012, 12:06
|
|
Профессор
|
|
Регистрация: 19.12.2009
Сообщений: 164
|
|
Сообщение от DjDiablo
|
Примеры на php
put
var_dump(file_get_contents('php://input'));
post
print_r($_POST);
|
Для ASP.NET
put
request.InputStream.Seek(0, SeekOrigin.Begin);
var streamReader = new StreamReader(request.InputStream, Encoding.UTF8);
result = streamReader.ReadToEnd().Trim();
post
context.Request.Form
__________________
"Helo, word!" - 17 errors 56 warnings
|
|
10.05.2012, 15:33
|
Профессор
|
|
Регистрация: 23.08.2008
Сообщений: 162
|
|
DjDiablo,
Ex_Soft,
Спасибо большое !!
Всё работает
А такой вопросик:
на сервер приходят все отображённые в Гриде данные (все Rows), а не только та строка которую я изменил.
Так и должно быть ???
Или можно получить только изменённую строку ???
Код Хранилища:
var storeMyDocs = Ext.create('Ext.data.JsonStore', {
idProperty: 'MyDocID',
loadMask: true,
autoSync: true, // указание на авто сохранения в хранилище, при каждом изменении одно записи
pageSize: 12, // - количество считываемых за раз записей
model: 'MyDoc',
restful: true, // Это наш волшебный флажок, который заставляет слать запросы на сервер при изменение данных в источнике
proxy: {
type: 'rest', //ajax - тип прокси "Ajax"
url: "MyDocs.ashx?upID=" + UserID,
method: 'post',
reader: {
type: "json", //json
root: "mydoc"
},
writer: {
type: "json", //json
encode: false,
root: "mydoc"
},
timeout: 120000 //2 minutes
}
}); storeMyDocs.load();
|
|
10.05.2012, 16:35
|
|
Профессор
|
|
Регистрация: 19.12.2009
Сообщений: 164
|
|
Сообщение от potkin
|
А такой вопросик:
на сервер приходят все отображённые в Гриде данные (все Rows), а не только та строка которую я изменил.
Так и должно быть ???
Или можно получить только изменённую строку ???
|
Странно это... У меня отправляются только измененные записи... Мало того: writeAllFields=false - передает только изменненные поля...
__________________
"Helo, word!" - 17 errors 56 warnings
|
|
17.07.2012, 13:44
|
Новичок на форуме
|
|
Регистрация: 28.04.2011
Сообщений: 1
|
|
А как вы узнаете что сервер получает?
Как можно это вывести (например алертом)?
Не знаю в каком виде данные попадают на сервер...
$array = json_decode($_POST);
$id= $array['data']['id'];
Просьба помочь
|
|
07.01.2013, 22:18
|
Новичок на форуме
|
|
Регистрация: 25.12.2012
Сообщений: 4
|
|
Сообщение от darrios
|
А как вы узнаете что сервер получает?
Как можно это вывести (например алертом)?
Не знаю в каком виде данные попадают на сервер...
$array = json_decode($_POST);
$id= $array['data']['id'];
Просьба помочь
|
если просто хотите посмотреть что получил то напишите
и в браузере смотрите что вернулось на запрос (для этого нужно открыть консоль и переключиться на вкладке "Сеть").
Мне другое интересно - как вообще принять данные на сервере, если Store такой:
var storeNews = Ext.create('Ext.data.Store', {
autoLoad: true,
autoSync: true,
idProperty: 'id',
remoteFilter: true,
fields: [
{ name: 'id', type: 'int' },
{ name: 'datepubl', type: 'date' },
{ name: 'dateclose', type: 'date' },
{ name: 'title', type: 'string' },
{ name: 'alias', type: 'string' },
{ name: 'new', type: 'string' },
{ name: 'newtext', type: 'string' }
],
proxy: {
type: 'ajax',
api: {
read: 'service/view/news.php',
create: 'service/create/news.php',
update: 'service/update/news.php',
destroy: 'service/destroy/news.php'
},
reader: {
type: 'json',
successProperty: 'success',
root: 'data',
messageProperty: 'message'
},
writer: {
type: 'json',
writeAllFields: false,
root: 'data'
},
listeners: {
exception: function(proxy, response, operation){
Ext.MessageBox.show({
title: 'REMOTE EXCEPTION',
msg: operation.getError(),
icon: Ext.MessageBox.ERROR,
buttons: Ext.Msg.OK
});
}
}
}
});
В браузере вижу что данные передаются:
Код:
|
Request URL:http://localhost/service/destroy/news.php?_dc=1357565811429
Request Method:POST
Status Code:200 OK
Query String Parameters:
_dc:1357565811429
Request Payload:
{"items":{"id":5}}
Request URL:http://localhost/service/update/news.php?_dc=1357566047052
Request Method:POST
Status Code:200 OK
Query String Parameters:
_dc:1357566047052
Request Payload:
{"items":{"datepubl":"2012-12-01T00:00:00","title":"the Update Plan","alias":"the-update-plan","new":"<p>small text new</p>","newfull":"<p>full text new</p>","id":4}}
Request URL:http://localhost/service/create/news.php?_dc=1357566179903
Request Method:POST
Status Code:200 OK
Query String Parameters:
_dc:1357566179903
Request Payload:
{"items":{"id":0,"datepubl":null,"dateclose":null,"title":"the NEW new","alias":"the-new-new","new":"text the NEW new","newfull":""}} |
Но как принять данные которые браузер обзывает Request Payload не имею ни малейшего понятия...
Последний раз редактировалось TinK, 07.01.2013 в 22:22.
Причина: разметка
|
|
09.01.2013, 16:36
|
|
Профессор
|
|
Регистрация: 19.12.2009
Сообщений: 164
|
|
Сообщение от TinK
|
Но как принять данные которые браузер обзывает Request Payload не имею ни малейшего понятия...
|
тынць?
__________________
"Helo, word!" - 17 errors 56 warnings
|
|
|
|